Как лучше всего получить имя несуществующей папки?

StackOverflow https://stackoverflow.com/questions/147925

  •  02-07-2019
  •  | 
  •  

Вопрос

Как лучше всего получить строку, содержащую имя папки, в которой я могу быть уверен? нет существовать?То есть, если я позвоню DirectoryInfo.Exists для данного пути он должен вернуть false.

РЕДАКТИРОВАТЬ:Причина в том, что я пишу тест для средства проверки ошибок, средство проверки ошибок проверяет, существует ли путь, поэтому я вслух задался вопросом, как лучше всего получить несуществующий путь.

Это было полезно?

Решение

Назовите его в честь GUID – просто удалите недопустимые символы.

Другие советы

На самом деле не существует способа сделать именно то, что вы хотите.Если вы подумаете об этом, вы увидите, что даже после вызова DirectoryInfo.Exists вернул false, какая-то другая программа могла бы создать каталог — это состояние гонки.

Обычный метод решения этой проблемы — создать новый временный каталог. Если создание удалось, вы знаете, что до того, как вы его создали, его не существовало.

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

        string path = Path.GetTempFileName();
        File.Delete(path);
        Directory.CreateDirectory(path);

Обратите внимание, что при этом создается каталог для блокировки от гонок потоков (т.другой процесс/поток крадет каталог из-под вас).

Что я в итоге использовал:

using System.IO;

string path = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());

(Кроме того, похоже, вам не нужно удалять символы из руководства — они генерируют допустимые имена файлов)

Что ж, хорошим вариантом будет объединение строк, таких как имя пользователя, сегодняшняя дата и время, с точностью до миллисекунды.

Хотя мне интересно:Почему вы хотите это сделать?Для чего это должно быть?

Это для создания временной папки или что-то в этом роде?Я часто использую Guid.NewGuid, чтобы получить строку для имени папки, которая, как вы хотите быть уверены, еще не существует.

Я думаю, вы можете быть достаточно близки:

строка имя_каталога = Guid.NewGuid.ToSrtring();

Поскольку Guid довольно случайны, вы не должны получать два одинаковых каталога.

Использование свежесгенерированного GUID в пространстве имен, которое также является несколько уникальным (например, имя вашего приложения/продукта), должно дать вам то, что вы хотите.Например, следующий код: очень сильно вряд ли потерпит неудачу:

string ParentPath = System.IO.Path.Combine(Environment.GetEnvironmentVariable("TEMP"), "MyAppName");
string UniquePath = System.IO.Path.Combine(ParentPath, Guid.NewGuid().ToString());
System.IO.Directory.CreateDirectory(UniquePath);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top