is_writable — Определяет, доступен ли файл для записи


Работа с файловой системой

Краткое содержание лекции

Константы

  • DIRECTORY_SEPARATOR
  • __LINE__
  • __FILE__
  • __DIR__

Работа с директорией

  • int filesize ( string $filename )
  • bool is_dir ( string $filename )
  • string filetype ( string $filename )
  • resource opendir ( string $path [, resource $context ] )
  • readdir
  • closedir
  • while (false !== ($entry = readdir($handle))) <
  • while ($entry = readdir($handle)) <

while (($entry = readdir($handle)) !== false) <

void rewinddir ([ resource $dir_handle ] )

Directory dir ( string $directory [, resource $context ] )

  • array scandir ( string $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, resource $context ]] )
  • string getcwd ( void )
  • bool chdir ( string $directory )
  • bool chroot ( string $directory )
  • bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] )
  • bool rmdir ( string $dirname [, resource $context ] )

Работа с файлами

  • string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )
  • int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )
  • resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
  • string fread ( resource $handle , int $length )
  • int fwrite ( resource $handle , string $string [, int $length ] ) / fputs
  • bool fclose ( resource $handle )
  • bool rewind ( resource $handle )
  • string fgets ( resource $handle [, int $length ] )
  • array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ‘,’ [, string $enclosure = ‘»‘ [, string $escape = ‘\\’ ]]]] )
  • int fputcsv ( resource $handle , array $fields [, string $delimiter = ‘,’ [, string $enclosure = ‘»‘ ]] )
  • int fpassthru ( resource $handle )
    int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )

array file ( string $filename [, int $flags = 0 [, resource $context ]] )

bool copy ( string $source , string $dest [, resource $context ] )

bool rename ( string $oldname , string $newname [, resource $context ] )

bool unlink ( string $filename [, resource $context ] )

void delete ( void )

string dirname ( string $path )

bool file_exists ( string $filename )

string tempnam ( string $dir , string $prefix )

resource tmpfile ( void )

string realpath ( string $path )

string basename ( string $path [, string $suffix ] )

Самостоятельно при желании

  • chgrp — Изменяет группу владельцев файла
  • chmod — Изменяет режим доступа к файлу
  • chown — Изменяет владельца файла
  • clearstatcache — Очищает кэш состояния файлов
  • diskfreespace — Возвращает размер доступного пространства в каталоге или в файловой системе
  • disktotalspace — Возвращает общий размер каталога или раздела файловой системы
  • diskfreespace — Псевдоним diskfreespace
  • feof — Проверяет, достигнут ли конец файла
  • fflush — Сбрасывает буфер вывода в файл
  • fgetc — Считывает символ из файла
  • fgetss — Прочитать строку из файла и отбросить HTML-теги
  • fileatime — Возвращает время последнего доступа к файлу
  • filectime — Возвращает время изменения индексного дескриптора файла
  • filegroup — Получает идентификатор группы файла
  • fileinode — Возвращает индексный дескриптор файла
  • filemtime — Возвращает время последнего изменения файла
  • fileowner — Возвращает идентификатор владельца файла
  • fileperms — Возвращает информацию о правах на файл
  • flock — Портируемая консультативная блокировка файлов
  • fnmatch — Проверяет совпадение имени файла с шаблоном
  • fscanf — Обрабатывает данные из файла в соответствии с форматом
  • fseek — Устанавливает смещение в файловом указателе
  • fstat — Получает информацию о файле используя открыты й файловый указатель
  • ftell — Сообщает текущую позицию чтения/записи файла
  • ftruncate — Урезает файл до указанной длинны

moveuploadedfile — Перемещает загруженный файл в новое место

glob — Находит файловые пути, совпадающие с шаблоном

is_dir — Определяет, является ли имя файла директорией

is_executable — Определяет, является ли файл исполняемым

is_file — Определяет, является ли файл обычным файлом

is_link — Определяет, является ли файл символической ссылкой

is_readable — Определяет существование файла и доступен ли он для чтения


isuploadedfile — Определяет, был ли файл загружен при помощи HTTP POST

is_writable — Определяет, доступен ли файл для записи

iswriteable — Псевдоним iswritable

lchgrp — Изменяет группу, которой принадлежит символическая ссылка

lchown — Изменяет владельца символической ссылки

link — Создаёт жёсткую ссылку

linkinfo — Возвращает информацию о ссылке

lstat — Возвращает информацию о файле или символической ссылке

symlink — Создаёт символическую ссылку

readlink — Возвращает файл, на который указывает символическая ссылка

parseinifile — Обрабатывает конфигурационный файл

parseinistring — Разбирает строку конфигурации

pathinfo — Возвращает информацию о пути к файлу

pclose — Закрывает файловый указатель процесса

popen — Открывает файловый указатель процесса

realpathcacheget — Получает записи из кэша реального пути

realpathcachesize — Получает размер кэша реального пути

setfilebuffer — Псевдоним streamsetwrite_buffer

stat — Возвращает информацию о файле

touch — Устанавливает время доступа и модификации файла

Функция Is_writable

Функция Is_writable определяет, доступен ли файл для записи.
Параметр Filename являет собой проверяемый файл.

Функция Is_writable возвращает TRUE, если файл Filename существует и доступен для записи. Аргумент Filename может быть именем директории, что позволяет вам проверять директории на доступность для записи.

Пример использования:
Функция Is_writable в случае неудачного завершения работы генерирует ошибку уровня E_WARNING.

Проверьте, доступен ли файл для записи до его записи

Я пытаюсь создать script, который проверяет, доступен ли файл для записи до его записи,

Убедитесь, что script не выходит преждевременно.

Я получил это далеко

Когда я тестирую файл script с открытым файлом $, он блокируется в спящей части даже после закрытия файла $.

Я новичок в PHP, поэтому может быть парадигма обработки, о которой я не знаю.

Любая помощь будет очень желанной.

EDIT: причина, по которой я ввел это в цикл while, — это постоянно проверять, открыт ли файл. Следовательно, он должен выйти из цикла while только после того, как файл, наконец, будет доступен для записи.

Сон просто реплицирует человека, пытающегося открыть файл.

Как определить, что папка существует и доступна для записи?

Мне бы хотелось func FolderExists(path string) bool это скажет, существует ли папка и доступна ли для записи. Я получил здесь:

Как определить, доступна ли эта папка для записи? Я не могу просто проверить права доступа к файлу (например, 0200 для разрешения записи пользователя), потому что тогда мне придется проверять владельца файла. Есть ли простой способ сделать это в Go?

Для тех, у кого фоны UNIX, ищите эквивалент очень простого:

3 ответа

Если вы пишете для ОС Unix-y, вы можете использовать unix.Access(path string, mode uint32) error с постоянной unix.W_OK как mode ,

Как говорит kostix, вам все равно придется проверять наличие ошибок при доступе к каталогу (например, при создании или удалении файла). Каталог мог быть удален с момента вашей проверки, или разрешения могли измениться, или вы можете получить совершенно не связанную ошибку.

(Спасибо пользователю fxxn за то, что он указал, что ситуация улучшилась с момента первоначального ответа в 2013 году, который должен был использовать syscall.Access и извлечь W_OK постоянная от unistd.h .)

Вот код, который проверяет наличие и доступ, который дает мне ожидаемый результат в Linux:

Мой ответ не будет отвечать на ваш вопрос напрямую, но все же.

Вкратце: не делайте этого (если, возможно, вы не пишете что-то встроенное). Объяснение: файловые системы полностью параллельны и, следовательно, по своей сути являются предметом гонок. Проще говоря, последовательность

  1. Проверьте, существует ли файл.
  2. Если да, прочитайте это.

Не будет работать в реальном мире, поскольку файл может полностью исчезнуть между (1) и (2) из-за какого-то другого процесса, удаляющего его.

Таким образом, единственный реальный способ написать вышеупомянутую последовательность — это удалить (1) и быть готовым к решению проблемы с открытием файла в (2).

Возвращаясь к вашей проблеме, единственный разумный способ — просто попытаться создать файл в каталоге назначения и быть готовым к обработке ошибки из-за того, что каталог недоступен для записи. Более того, подход Go к обработке ошибок специально разработан для таких (реальных) ситуаций.

Не существует независимого от платформы способа достичь этого, потому что проверить, создал ли пользователь каталог, в Windows невозможно. Итак, мы будем реализовывать его по-разному для Windows и не-Windows, а затем использовать ограничения сборки Golang для условной компиляции файлов в зависимости от ОС.

Создайте 3 .go файла в каталоге file-perm, как показано на рисунке —

Файл: file-perm.go

Файл: is-writable.go

Он построен на всех платформах, кроме Windows, потому что syscall.Stat_t недоступен в Windows. Обратите внимание, что после ограничения сборки должна быть пустая строка // +build! Windows

Файл: is-writable_windows.go

Этот файл будет создан только в Windows из-за суффикса _windows.go в имени файла. Для получения дополнительной информации, пожалуйста, обратитесь к https://golang.org/pkg/go/build/

Теперь вы должны использовать go build в каталоге file-perm, а затем запустить исполняемый файл. Обратите внимание, что это не будет работать с Go Run.

PHP is_writable (), чтобы проверить, можно ли записать файл?

Я прочитал, что я могу использовать is_writable () проверить, доступна ли для записи папка или файл.

Как проверить, можно ли записать файл в папку?

  1. Проверять ли папку и доступна ли для записи папка? Тогда файл может быть помещен в эту папку?
  2. Что если файл был записан в папку, как я могу проверить, доступен ли этот файл для записи (отредактировано)? Нужно ли мне? Если так, я проверяю файл вместо папки?
  3. Это безопасный метод (правильный), чтобы сделать это?

Решение

Функция PHP is_writable именно для этого. Если вы хотите проверить, доступен ли файл для записи после его записи, вы можете использовать ту же функцию.

Другие решения

Прочитайте документацию, как указано в вопросе, который вы указали. is_writable() работает над файлами и каталогами.

Но учтите: если у вас есть такой код:

Это может все еще потерпеть неудачу. Например, может быть блокировка или состояние гонки (разрешения изменяются между двумя командами). Лучше просто попробуйте открыть, а затем обработать ошибку.

PHP is_writable (), чтобы проверить, можно ли записать файл?

Я прочитал, что я могу использовать is_writable (), чтобы проверить, доступна ли для записи папка или файл.

Как проверить, можно ли записать файл в папку?

  1. Проверять ли папку и доступна ли для записи папка? Тогда файл может быть помещен в эту папку?
  2. Что если файл был записан в папку, как я могу проверить, доступен ли этот файл для записи (отредактировано)? Нужно ли мне? Если так, я проверяю файл вместо папки?
  3. Это безопасный метод (правильный), чтобы сделать это?

2 ответа

Функция PHP is_writable как раз для этой цели. Если вы хотите проверить, доступен ли файл для записи после его записи, вы можете использовать ту же функцию.

Прочитайте документацию, как указано в вопросе, на который вы указали. is_writable() работает с файлами и каталогами.

Но учтите: если у вас есть такой код:

Это может все еще потерпеть неудачу. Например, может быть блокировка или состояние гонки (разрешения изменяются между двумя командами). Лучше просто попробуйте открыть, а затем обработать ошибку.

Работа с файловой системой

Проверка существования файла

Итак, создавать файл мы научились, записывать данные в него — научились, считывать данные из файла — тоже научились. Но вот вопрос: а что если файла, с которым мы пытаемся проделать все эти операции , не существует? Или он недоступен для чтения или записи? Очевидно, что в таком случае ни одна из изученных нами функций работать не будет и PHP выдаст сообщение об ошибке . Чтобы отслеживать такого рода ошибки, можно использовать функции file_exists() , is_writable() , is_readable() .

Функция file_exists

Функция file_exists() проверяет, существует ли файл или директория, имя которой передано ей в качестве аргумента. Если директория или файл в файловой системе сервера существует, то функция возвращает TRUE , в противном случае — FALSE . Результат работы этой функции кэшируется. Соответственно очистить кэш можно, как уже отмечалось, с помощью функции clearstatcache() . Для нелокальных файлов использовать функцию file_exists() нельзя.

Функция is_writable

Если кроме проверки существования файла нужно узнать еще, разрешено ли записывать информацию в этот файл, следует использовать функцию is_writable() или ее псевдоним — функцию is_writeable() .

Эта функция возвращает TRUE , если файл (или директория) существует и доступен для записи . Доступ к файлу осуществляется под той учетной записью пользователя, под которой работает сервер (чаще всего это пользователь nobody или www). Результаты работы функции is_writable кэшируются.

Функция is_readable

Если кроме проверки существования файла нужно узнать еще, разрешено ли читать информацию из него, нужно использовать функцию is_readable() .

Эта функция работает подобно функции is_writable() .

Как узнать доступен ли файл для открытия и записи?

Есть папка в сети, в которой периодически создаются файлы. Есть необходимость копировать данные файлы в другой каталог. Нужно проверять, доступен ли файл для копирования, т.е. не дописывается ли он. Есть ли возможность проверить доступен ли файл для записи? Для примера, я открываю файл через Adobe Reader, данный файл не должен копироваться. Мне нужен ответ скорее на вопрос «Как узнать, открыт ли файл другой программой для изменения?»

4 ответа 4

Для этого можно использовать библиотеку со странным названием Restart Manager. Пример получения списка процессов, занявших файл (https://code.msdn.microsoft.com/windowsapps/How-to-know-the-process-704839f4):

Работает на ОС начиная с Windows Vista.

Наиболее трезвый, на мой взгляд, способ понять занят ли файл другим процессом — это попытаться скопировать его и получить System.IO.IOException в случае ошибки ввода-вывода, которая как раз таки и будет возникать при отсутствии к нему доступа. Попытки реализовать метод что бы проверить блокирован файл или нет особого результата не дадут. Поскольку никто не гарантирует, что в промежутке между вызовом метода проверки на блокировку и копированием файла ни какой другой процесс его уже не занял.

Вот готовый проект. Все делается через системный openfiles.exe который находится в c:\Windows\System32

Он поддерживает множество операций таких как закрытие файла, запросы и т.д.

Если Вы хотите получить качественную копию файлов в другой папке, то вам надо изменить алгоритм. Вы можете потерять данные в процессе копирования, вы можете запросить состояние файла (теоретически) одновременно с процессом который этот файл начнет открывать и если тот процесс локальный, то он заблокирует файл, который вы считаете свободным.

Правильный подход в этой задаче — просто попытаться сразу скопировать все, а после завершения копирования проверить результат. Например по длине файлов или по времени их модификации до копирования и после. Файлы, которые не прошли проверку скопировать повторно. Ну и далее — проанализировать и обработать возникшие ошибки.

Чтение и запись файлов в Python

В этой статье мы рассмотрим операции с файлами в Python: открытие файла, чтение из файла, запись, закрытие файла. А также методы, предназначенные для работы с файлами.

Что такое файл?

Файл – это именованная область диска, предназначенная для длительного хранения данных в постоянной памяти (например, на жёстком диске).

Чтобы прочитать или записать данные в файл, сначала нужно его открыть. После окончания работы файл необходимо закрыть, чтобы освободить связанные с ним ресурсы.

Поэтому в Python операции с файлами выполняются в следующем порядке:

  1. Открытие файла.
  2. Чтение или запись (выполнение операции).
  3. Закрытие файла.

Как открыть файл?

В Python есть встроенная функция open(), предназначенная для открытия файла. Она возвращает объект, который используется для чтения или изменения файла.

При этом можно указать необходимый режим открытия файла: ‘r’- для чтения,’w’ — для записи,’a’ — для изменения. Мы также можем указать, хотим ли открыть файл в текстовом или в бинарном формате.

По умолчанию файл открывается для чтения в текстовом режиме. При чтении файла в этом режиме мы получаем строки.

В бинарном формате мы получим байты. Этот режим используется для чтения не текстовых файлов, таких как изображения или exe-файлы.

Режимы открытия файлов в Python
Режим Описание
‘r’ Открытие файла для чтения. Режим используется по умолчанию.
‘w’ Открытие файла для записи. Режим создаёт новый файл, если он не существует, или стирает содержимое существующего.
‘x’ Открытие файла для записи. Если файл существует, операция заканчивается неудачей (исключением).
‘a’ Открытие файла для добавления данных в конец файла без очистки его содержимого. Этот режим создаёт новый файл, если он не существует.
‘t’ Открытие файла в текстовом формате. Этот режим используется по умолчанию.
‘b’ Открытие файла в бинарном формате.
‘+’ Открытие файла для обновления (чтения и записи).

В отличие от других языков программирования, в Python символ ‘a’ не подразумевает число 97, если оно не закодировано в ASCII (или другой эквивалентной кодировке).

Кодировка по умолчанию зависит от платформы. В Windows – это ‘cp1252’, а в Linux ‘utf-8’.

Поэтому мы не должны полагаться на кодировку по умолчанию. При работе с файлами в текстовом формате рекомендуется указывать тип кодировки.

Как закрыть файл в Python?

Закрытие освободит ресурсы, которые были связаны с файлом. Это делается с помощью метода close(), встроенного в язык программирования Python.

В Python есть сборщик мусора, предназначенный для очистки ненужных объектов, Но нельзя полагаться на него при закрытии файлов.

Этот метод не полностью безопасен. Если при операции возникает исключение, выполнение будет прервано без закрытия файла.

Более безопасный способ – использование блока try…finally.

Это гарантирует правильное закрытие файла даже после возникновения исключения, прерывающего выполнения программы.

Также для закрытия файла можно использовать конструкцию with. Оно гарантирует, что файл будет закрыт при выходе из блока with. При этом не нужно явно вызывать метод close(). Это будет сделано автоматически.

Запись в файл

Чтобы записать данные в файл в Python, нужно открыть его в режиме ‘w’, ‘a’ или ‘x’. Но будьте осторожны с режимом ‘w’. Он перезаписывает файл, если то уже существует. Все данные в этом случае стираются.

Запись строки или последовательности байтов (для бинарных файлов) осуществляется методом write(). Он возвращает количество символов, записанных в файл.

Эта программа создаст новый файл ‘test.txt’. Если он существует, данные файла будут перезаписаны. При этом нужно добавлять символы новой строки самостоятельно, чтобы разделять строки.

Чтение из файла в Python

Чтобы осуществить чтение данных из файла в Python, нужно открыть его в режиме чтения. Для этого можно использовать метод read(size), чтобы прочитать из файла данные в количестве, указанном в параметре size. Если параметр size не указан, метод читает и возвращает данные до конца файла.

Метод read() возвращает новые строки как ‘n’. Когда будет достигнут конец файла, при дальнейших попытках чтения мы получим пустые строки.

Чтобы изменить позицию курсора в текущем файле, используется метод seek(). Метод tell() возвращает текущую позицию курсора (в виде количества байтов).

Мы можем прочитать файл построчно в цикле for.

Извлекаемые из файла строки включают в себя символ новой строки ‘n’. Чтобы избежать вывода, используем пустой параметр end метода print(),.

Также можно использовать метод readline(), чтобы извлекать отдельные строки. Он читает файл до символа новой строки.

Метод readlines() возвращает список оставшихся строк. Все эти методы чтения возвращают пустую строку, когда достигается конец файла.

Методы работы с файлами в Python

Ниже приводится полный список методов для работы с файлами в текстовом режиме.

Методы работы с файлами в Python
Метод Описание
close() Закрытие файла. Не делает ничего, если файл закрыт.
detach() Отделяет бинарный буфер от TextIOBase и возвращает его.
fileno() Возвращает целочисленный дескриптор файла.
flush() Вызывает сброс данных (запись на диск) из буфера записи файлового потока.
isatty() Возвращает значение True, если файловый поток интерактивный.
read(n) Читает максимум n символов из файла. Читает до конца файла, если значение отрицательное или None.
readable() Возвращает значение True, если из файлового потока можно осуществить чтение.
readline(n=-1) Читает и возвращает одну строку из файла. Читает максимум n байт, если указано соответствующее значение.
readlines(n=-1) Читает и возвращает список строк из файла. Читает максимум n байт/символов, если указано соответствующее значение.
seek(offset,from=SEEK_SET) Изменяет позицию курсора.
seekable() Возвращает значение True, если файловый поток поддерживает случайный доступ.
tell() Возвращает текущую позицию курсора в файле.
truncate(size=None) Изменяет размер файлового потока до size байт. Если значение size не указано, размер изменяется до текущего положения курсора.
writable() Возвращает значение True, если в файловый поток может производиться запись.
write(s) Записывает строки s в файл и возвращает количество записанных символов.
writelines(lines) Записывает список строк lines в файл.

Данная публикация представляет собой перевод статьи « Python File IO Read and Write Files in Python » , подготовленной дружной командой проекта Интернет-технологии.ру

Как проверить, доступен ли каталог для записи в PHP?

Кто-нибудь знает, как я могу проверить, доступен ли каталог для записи в PHP?

Функция is_writable не работает для папок. (редактировать: это работает. См. принятый ответ.)

10 ответов

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Да, он работает для папок.

Возвращает TRUE, если имя файла существует и доступно для записи. Аргумент имени файла может быть именем каталога, позволяющим вам проверить, доступен ли каталог для записи.

быть более конкретным для владельца/группы/мира

Возможно, вы отправляете полный путь к файлу is_writable() функция. is_writable() вернет false, если файл еще не существует в каталоге. Вам нужно проверить сам каталог с удаленным именем файла, если это так. Если ты это сделаешь, is_writable правильно скажет вам, является ли каталог доступным для записи или нет. Если $file содержит путь к вашему файлу:

Тогда используйте is_writable($file_directory) определить, доступна ли папка для записи.

Я надеюсь, что это помогает кому-то.

В соответствии с документация для is_writable, это должно просто работать — но вы сказали «папка», так что это может быть проблема Windows. Комментарии предлагают обходной путь.

(Быстрое чтение ранее заставило меня думать, что конечные слэши были важны, но это оказалось специфическим для этой работы вокруг).

Я написал небольшой скрипт (я называю это isWritable.php), который обнаруживает все каталоги в том же каталоге, в котором находится скрипт, и записывает на страницу, доступен ли для записи каждый каталог или нет. Надеюсь это поможет.

Очень похоже на системную статистику, но в PHP. То, что вы хотите проверить, это значение режима, так же, как и при любом другом вызове stat на других языках (например, C/C++).

В моем случае, is_writable вернул true, но при попытке записать файл — была сгенерирована ошибка.
Этот код помогает проверить, $dir существует и доступен для записи:

вот как я это делаю:

создать файл с file_put_contents() и проверьте возвращаемое значение, если оно положительное (число записано в байтах), тогда вы можете пойти дальше и сделать то, что вам нужно сделать, если оно FALSE, то оно не доступно для записи

затем вы можете удалить фиктивный файл с помощью unlink()

Согласно руководству по PHP is_writable должен хорошо работать на каталогах.

Илон Маск рекомендует:  Что такое код define
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL