Мне нужно знать, могу ли я создать файл в определенной папке, но есть слишком много вещей, которые нужно проверить, например, разрешения, дубликаты файлов и т. д.
Ищу что-то вроде File.CanCreate(@"C:\myfolder\myfile.aaa"), но такого способа не нашел.
Единственное, о чем я подумал, - это попытаться создать фиктивный файл и проверить исключения, но это некрасивое решение, которое также влияет на производительность.
Вы знаете лучшее решение?
Вы правы, но я предоставляю эту информацию для дальнейшего использования, я несу ответственность только за предоставление этой информации, если после этого разрешения изменятся, будет выдана ошибка другого типа.





На самом деле создание фиктивного файла не окажет большого влияния на производительность в большинстве приложений. Конечно, если у вас есть расширенные разрешения с созданием, но не с уничтожением, это может стать немного неприятным ...
Гиды всегда удобны для случайных имен (чтобы избежать конфликтов) - что-то вроде:
string file = Path.Combine(dir, Guid.NewGuid().ToString() + ".tmp");
// perhaps check File.Exists(file), but it would be a long-shot...
bool canCreate;
try
{
using (File.Create(file)) { }
File.Delete(file);
canCreate = true;
}
catch
{
canCreate = false;
}
Я бы хотел сделать это без исключения, которое прерывает отладку (я мог бы сказать VS «скрыть» это, но я бы предпочел не делать этого). Есть способ?
Вы можете использовать CAS, чтобы убедиться, что нет Политики .NET (caspol), ограничивающего создание и запись файла в этом месте.
Но это не распространяется на политики Windows. Вам придется вручную проверить политики NTFS. И даже тогда есть процессы, которые могут решить, что вам не разрешено создавать файл (например, антивирусный сканер).
Самый лучший и самый полный способ - это попробовать.
Обратите внимание, однако, что проверка того, можете ли вы создать файл (как бы это ни было сделано), а затем, позже, фактическое создание файла, все равно может привести к ошибке (здесь у вас есть состояние гонки). Таким образом, обычно лучше всего просто создать (окончательный) файл и обработать возможные ошибки / исключения.