uniqman Ответов: 2

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


Моя цель в этой части приложения-предупредить пользователя, если он выберет каталог/папку для использования в качестве хранилища отчетов, которое доступно только для чтения и недоступно для него.
Основываясь на нескольких решениях с этого веб-сайта и других, я попробовал следующее

DirectoryInfo di = новый DirectoryInfo(sConnectionFolder);
если ((Ди.Атрибутами &амп; метки fileattributes.ReadOnly) == FileAttributes.только для чтения)
{
// ПРЕДУПРЕДИТЬ ПОЛЬЗОВАТЕЛЯ

Моя проблема заключается в том, что при тестировании с папкой только для чтения di.Значение свойства Attributes-это просто "каталог", и оно не содержит флага/компонента только для чтения.
из отладчика:
di.Attributes = каталог
Поэтому мой код предупреждения никогда не выполняется.

Что я уже пробовал:

Прочие попытки:

если (di.Атрибуты.HasFlag(FileAttributes.только для чтения))

// и держитесь подальше от DirectoryInfo, просто используя FileInfo:
FileAttributes file_attr = (new FileInfo(sConnectionFolder)).Атрибуты;

// и, наконец, использование класса File для получения атрибутов:
FileAttributes fa = файл.Методы getattributes(sConnectionFolder);

// все с тем же результатом: каталог для значения атрибута

// Почему отсутствует флаг только для чтения?

2 Ответов

Рейтинг:
19

Dave Kreskowiak

Атрибуты никогда не расскажут вам.

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


uniqman

Спасибо, именно это я и сделаю. Но я удивлен, что нет метода .NET, который дал бы ответ.

Рейтинг:
1

OriginalGriff

Попробуйте Directoryinfoкласс.Метод GetAccessControl (System.IO) | Microsoft Docs[^] - он должен сказать вам, что вы хотите (возможно, бросив исключение нарушения доступа, я не могу сказать банкомату, я нахожусь на планшете).


uniqman

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

Dave Kreskowiak

Прямого метода не существует, потому что система безопасности довольно сложна, имея дело с олицетворением. "Текущий пользователь" может быть очевидным для вас, сидящего за клавиатурой, но в реальном мире это не простая концепция. Бросьте различные уровни олицетворения в смесь, и все очень быстро усложнится.