Какой лучший способ получить имя папки, которая не существует? - PullRequest
3 голосов
/ 29 сентября 2008

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

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

Ответы [ 8 ]

9 голосов
/ 29 сентября 2008

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

6 голосов
/ 29 сентября 2008

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

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

5 голосов
/ 29 сентября 2008

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

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

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

4 голосов
/ 29 сентября 2008

То, что я в конечном итоге использовал:

using System.IO;

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

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

0 голосов
/ 29 сентября 2008

Использование только что сгенерированного 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);
0 голосов
/ 29 сентября 2008

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

string directoryName = Guid.NewGuid.ToSrtring ();

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

0 голосов
/ 29 сентября 2008

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

0 голосов
/ 29 сентября 2008

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

Мне любопытно: зачем тебе это делать? Для чего это нужно?

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