Подтвердить что ты не робот

С#: Какой самый быстрый способ создать уникальное имя файла?

Я видел несколько предложений по наименованию файлов случайным образом, включая использование

System.IO.Path.GetRandomFileName()

или используя

System.Guid

и добавление расширения файла.

Мой вопрос: Каков самый быстрый способ создания уникального имени файла?

4b9b3361

Ответ 1

GUID будет чрезвычайно быстрым, , так как он гарантирует выполнение Windows, может генерировать не менее 16 384 GUID в 100-наносекундном времени. (Как указывали другие, спецификация не гарантирует, только разрешает. Однако генерация GUID действительно, очень быстрая. Действительно.) Вероятность столкновения на любой файловой системе в любой точке любой сети очень низкая. Это достаточно безопасно, что, хотя было бы лучше всего всегда проверять, доступно ли это имя файла в любом случае, на самом деле вам даже этого не понадобится.

Таким образом, вы не смотрите на операции ввода-вывода, кроме самого сохранения, и < 0,2 миллисекунды (на тестовом компьютере) для генерации самого имени. Довольно быстро.

Ответ 2

Вы хотите System.IO.Path.GetTempFileName()

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

Ответ 3

Хорошо, что я писал драйверы файловой системы в течение 20 лет и сказал бы, что Rex правильный. Генерация руководства намного быстрее, поскольку для этого требуется гораздо меньше накладных расходов, чем поиск уникального имени файла. GetTempFileName фактически создает файл, что означает, что он должен вызывать весь стек драйверов файловой системы (кто знает, сколько вызовов было бы и переключиться в режим ядра). GetRandomFileName звучит, как будто это быстрее, однако я бы доверял вызову GUID быть еще быстрее. То, что люди не понимают, заключается в том, что даже тестирование на наличие файла требует полного вызова через стек драйвера. Фактически это приводит к открытию, получению атрибутов и закрытию (что составляет по меньшей мере 3 вызова в зависимости от уровня.) На самом деле это минимум 20 вызовов функций и переход в режим ядра. GUIDS гарантирует уникальность для большинства целей.

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

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

Ответ 4

Если вы контролируете место назначения, в котором будут находиться файлы, и есть только один процесс и поток, который записывает на него, просто добавьте некоторый автоинкрементный номер в базовое имя.

Если вы не контролируете назначение или не нуждаетесь в многопоточной реализации, используйте GUID.

Ответ 5

Если вы управляете каталогом, вы можете назвать свой файл на основе lastWriteTime:

DirectoryInfo info = new DirectoryInfo(directoryPath);
long uniqueKey = info.LastWriteTime.Ticks+1L;
string filename = String.Format("file{0}.txt", key);

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

Ответ 6

Используйте Int и увеличивайте его для каждого файла.

Ответ 7

что-то вроде:

file.MoveTo(deletedfilesdir + @"\" + f.Name + **DateTime.Now.ToFileTimeUtc()** + f.Extension);