Как мне проверить, могу ли я написать имя файла?
Название может показаться тривиальным, но это не так просто, как кажется. Вы не можете просто проверить разрешения для файла, потому что файл может не существовать, и у вас могут быть необходимые разрешения для его создания и последующей записи в него. Но только если у вас есть разрешения на запись в каталог, и, возможно, разрешения на выполнение, и, возможно, разрешения для всех родительских каталогов. А может и нет. Я не уверен.
Итак, учитывая имя файла, какие все случаи нужно учитывать, чтобы правильно проверить, могу ли я открыть и записать файл с таким именем? Это не относится к какому-либо одному языку программирования. Я просто хочу логику. Но примеры на реальных языках программирования приветствуются.
2 ответа
Такой тест не обязательно будет очень полезным - вы просто настраиваете себя на состояние гонки, если файл по какой-то причине перезаписывается между проверкой и попыткой записи. (Некоторые другие процессы могут изменить разрешения, переместить или удалить родительский каталог, использовать последний свободный объем на устройстве и т. Д.)
Я бы просто пошел дальше и попытался написать, и усердно проверял наличие ошибок на каждом шаге (открытие, каждая попытка записи, закрытие), где операция могла бы потерпеть неудачу.
Это зависит от владельца процесса, который запускает программу, от того, есть ли у владельца разрешения на запись в этот каталог или нет. Например, apache, работающий от имени пользователя www, может не иметь возможности записи в каталог, принадлежащий root, и без прав доступа для другого пользователя или группы.
Вы можете сделать это или попутно, например, попытаться создать файл, чтобы увидеть, успешен он или нет, в случае, если он не может перехватить правильный код ошибки и, например, нет прав или каталог заполнен и предприняты корректирующие действия.
Вы можете программно проверить, есть ли у пользователя разрешения на запись в каталог, если в каталоге есть место, если файл уже существует и т. Д. Используя определенные API-интерфейсы, которые предоставляет система, и язык, этот гораздо лучший подход - заботиться о случаях, а не обрабатывать ошибки. случаев.