Как узнать, можно ли создать несуществующий файл, не пытаясь создать его и перехватывая исключение IOException - PullRequest
1 голос
/ 16 февраля 2011

Я знаю, что этот вопрос задавался ранее (на самом деле, я нашел много случаев более или менее одного и того же вопроса, но пока без удовлетворительного решения), но я перефразирую его немного по-другому .. Я хочу использовать FileInfoчтобы узнать, могу ли я создать (новый) файл на определенном диске (жесткий диск / USB-карта / и т. д.) и в каталоге.

Текущие проблемы, с которыми я сталкиваюсь:

  1. Если файл, который я хочу создать, находится на диске с защитой от записи / USB-карте / и т. Д.- Будет сгенерировано исключение IOException, только проблема в том, что он будет сгенерирован после некоторой задержки (возможно, после того, как был вызван Flush ())не существует, FileInfo.IsReadOnly всегда будет возвращать true, даже если данный путь фактически не защищен от записи!Он вернет false только в том случае, если файл уже существует и недоступен для чтения.

Итак, как я могу узнать, возможно ли создать конкретный файл ПЕРЕД попыткой его создать?

спасибо ..

Ответы [ 2 ]

4 голосов
/ 16 февраля 2011

Это заинтриговало меня достаточно, чтобы попробовать, хотя и без тщательного или тщательного тестирования, вот пара вещей, с которыми вы можете поработать (ищите исключения!):

    static bool CanCreateFile(FileInfo fileInfo)
    {
        if (fileInfo.Exists) return false;
        return !fileInfo.Attributes.HasFlag(FileAttributes.ReadOnly);
    }

    static bool CanCreateFile2(FileInfo fileInfo)
    {
        if (fileInfo.Exists) return false;
        return IsDirectoryWriteable(
            Path.GetDirectoryName(fileInfo.FullName));
    }

    static bool IsDirectoryWriteable(string path)
    {
        var directoryInfo = new DirectoryInfo(path);
        if (!directoryInfo.Exists)
        {
            return IsDirectoryWriteable(directoryInfo.Parent.FullName);
        }
        return !directoryInfo.Attributes.HasFlag(FileAttributes.ReadOnly);
    }

Но, как указано в другом ответе, на самом деле нет никакой гарантии, что когда вы действительно вернетесь из «проверки», что-то не произойдет, чтобы изменить достоверность ситуации до вашего следующего действия по написанию.

2 голосов
/ 16 февраля 2011

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

Но вы можете составить довольно хорошую оценку, посмотрев DirectoryInfo для родительского каталога.
Проверка DirectoryInfo.Attributes для FileAttributes.ReadOnly и просмотрите все ACL: s в DirectoryInfo.GetAccessControl(), чтобы выяснить, достаточно ли у текущего пользователя разрешений.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...