Почему настройка & ldquo; hidden file & rdquo; атрибут в файле делает его для чтения только для Python (3.5) в Windows 7 [дубликат]

Использовать предварительно отформатированный HTML-код

echo '<pre>';
var_dump($data);
echo '</pre>';
21
задан zedex 4 November 2012 в 07:21
поделиться

2 ответа

Это как работает Win32 API. Под капотом функция open Python вызывает функцию CreateFile , и если это не удается, она преобразует код ошибки Windows в Python IOError.

r+ открытый режим соответствует dwAccessMode в GENERIC_READ|GENERIC_WRITE и dwCreationDisposition в OPEN_EXISTING. Режим открытия w соответствует dwAccessMode в GENERIC_WRITE и dwCreationDisposition в CREATE_ALWAYS.

Если вы внимательно прочитали замечания в документации CreateFile, в нем говорится следующее:

Если заданы CREATE_ALWAYS и FILE_ATTRIBUTE_NORMAL, CreateFile завершается с ошибкой и устанавливает последнюю ошибку на ERROR_ACCESS_DENIED, если файл существует и имеет атрибут FILE_ATTRIBUTE_HIDDEN или FILE_ATTRIBUTE_SYSTEM. Чтобы избежать ошибки, укажите те же атрибуты, что и существующий файл.

Итак, если вы вызывали CreateFile непосредственно из C-кода, решением было бы добавить FILE_ATTRIBUTE_HIDDEN к dwFlagsAndAttributes (вместо FILE_ATTRIBUTE_NORMAL). Однако, поскольку в API-интерфейсе Python нет возможности сказать, что он пройдет в этом флаге, вам просто придется обойти его, либо используя другой открытый режим, либо сделав файл не скрытым.

27
ответ дан Adam Rosenfield 27 August 2018 в 02:07
поделиться

Вот подробные отличия: -

`` r '' Откройте текстовый файл для чтения. Поток расположен в начале файла.

`` r + '' Открыт для чтения и записи. Поток расположен в начале файла.

`` w '' Усекать файл до нулевой длины или создать текстовый файл для записи. Поток расположен в начале файла.

`` w + '' Открыт для чтения и записи. Файл создается, если он не существует, в противном случае он усекается. Поток расположен в начале файла.

`` a '' Открыт для записи. Файл создается, если он не существует. Поток расположен в конце файла. Последующая запись в файл всегда будет заканчиваться в текущем конце файла независимо от любого промежуточного fseek (3) или подобного.

`` a + '' Открыт для чтения и записи. Файл создается, если он не существует. Поток расположен в конце файла. Последующая запись в файл всегда будет заканчиваться в текущем конце файла независимо от любого промежуточного fseek (3) или подобного.

Из документации python - http: //docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files:-

В Windows добавлен «b», добавленный в режим файл в двоичном режиме, поэтому существуют также такие режимы, как «rb», «wb» и «r + b». Python в Windows делает различие между текстовыми и двоичными файлами; конечные символы в текстовых файлах автоматически изменяются, когда данные считываются или записываются. Эта за кадром модификация файловых данных отлично подходит для текстовых файлов ASCII, но это приведет к повреждению двоичных данных, подобных этим в файлах JPEG или EXE. Будьте очень осторожны, чтобы использовать двоичный режим при чтении и записи таких файлов. В Unix не помешает добавить «b» в этот режим, поэтому вы можете использовать его независимо от платформы для всех двоичных файлов.

Итак, если вы используете w режиме, вы на самом деле пытаетесь создать файл, и у вас могут не быть разрешения на его выполнение. r+ является подходящим выбором.

Если вы находитесь в ситуации, когда вы еще не знаете, где ваш .picasi.ini существует или нет, и у вашего пользователя Windows есть разрешения на создание файлов в этом каталоге, и вы хотите добавьте новую информацию вместо начала в начале файла (ака «append»), тогда a+ будет подходящим выбором.

Это не имеет никакого отношения к тому, скрыт ли ваш файл или нет.

4
ответ дан Calvin Cheng 27 August 2018 в 02:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: