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

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

Итак, учитывая имя файла, какие все случаи нужно учитывать, чтобы правильно проверить, могу ли я открыть и записать файл с таким именем? Это не относится к какому-либо одному языку программирования. Я просто хочу логику. Но примеры на реальных языках программирования приветствуются.

2 ответа

Решение

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

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

  1. Это зависит от владельца процесса, который запускает программу, от того, есть ли у владельца разрешения на запись в этот каталог или нет. Например, apache, работающий от имени пользователя www, может не иметь возможности записи в каталог, принадлежащий root, и без прав доступа для другого пользователя или группы.

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

  3. Вы можете программно проверить, есть ли у пользователя разрешения на запись в каталог, если в каталоге есть место, если файл уже существует и т. Д. Используя определенные API-интерфейсы, которые предоставляет система, и язык, этот гораздо лучший подход - заботиться о случаях, а не обрабатывать ошибки. случаев.

Другие вопросы по тегам