Мне нужно создать уникальный временный файл с расширением .csv.
Что я делаю сейчас
string filename = System.IO.Path.GetTempFileName().Replace(".tmp", ".csv");
Однако это не гарантирует, что мой файл .csv будет уникальным.
Я знаю, что вероятность моего столкновения очень мала (особенно если учесть, что я не удаляю файлы .tmp), но этот код не выглядит для меня хорошим.
Конечно, я мог вручную генерировать случайные имена файлов, пока в конце концов не нашел уникальное (что не должно быть проблемой), но мне любопытно узнать, нашли ли другие хороший способ справиться с этой проблемой.
c#
.net
temporary-files
Бранн
источник
источник
GetTempFileName()
создает новый файл каждый раз, когда вы вызываете его. - Если вы немедленно измените строку на что-то другое, вы просто создали новый нулевой байт-файл во временном каталоге (и, как уже отмечали другие, это в конечном итоге приведет к сбою при попадании туда 65535 файлов ...) - - Чтобы избежать этого, обязательно удалите все файлы, которые вы создаете в этой папке (включая те, которые были возвращеныGetTempFileName()
, в идеале, в блоке finally).Ответы:
Гарантированно (статистически) уникально:
(Цитата из вики-статьи о вероятности столкновения:
РЕДАКТИРОВАТЬ: Пожалуйста, также смотрите комментарии JaredPar.
источник
Попробуйте эту функцию ...
Он вернет полный путь с расширением по вашему выбору.
Обратите внимание, что не гарантируется создание уникального имени файла, поскольку кто-то еще мог технически создать этот файл. Однако вероятность того, что кто-то угадает следующий гид, созданный вашим приложением, и создаст его, очень мала. Довольно безопасно предположить, что это будет уникально.
источник
Guid.NewGuid().ToString() + extension
даже не правильно, так и должно бытьGuid.NewGuid().ToString() + "." + extension
.txt
илиtxt
), но такChangeExtension
как обрабатывает оба случая, это не может повредитьПримечание: это работает как Path.GetTempFileName. Пустой файл создается, чтобы зарезервировать имя файла. Это делает 10 попыток, в случае коллизий, сгенерированных Path.GetRandomFileName ();
источник
Path.GetRandomFileName()
фактически создает нулевой файл на диске и возвращает полный путь к этому файлу. Вы не используете этот файл, только его имя, чтобы изменить расширение. Таким образом, если вы не уверены, что удаляете эти временные файлы, после 65535 вызовов этой функции она начнет сбоить.GetTempFileName()
иGetRandomFileName()
.GetTempFileName()
создайте файл нулевого байта, как мой метод, ноGetRandomFileName()
не создает файл. Из документов:> В отличие от GetTempFileName, GetRandomFileName не создает файл. Ваша ссылка указывает на неправильную страницу.Вы также можете использовать System.CodeDom.Compiler.TempFileCollection .
Здесь я использовал расширение txt, но вы можете указать все, что хотите. Я также установил флаг keep в true, чтобы временный файл оставался после использования. К сожалению, TempFileCollection создает один случайный файл для каждого расширения. Если вам нужно больше временных файлов, вы можете создать несколько экземпляров TempFileCollection.
источник
Почему бы не проверить, существует ли файл?
источник
Документация MSDN для C ++ GetTempFileName обсуждает вашу проблему и отвечает на нее:
источник
Как насчет:
Крайне маловероятно, что компьютер будет генерировать один и тот же Guid в одно и то же время. Единственное слабое место, которое я вижу здесь, - это влияние на производительность DateTime.Now.Ticks.
источник
Вы также можете сделать следующее
и это также работает как ожидалось
источник
На мой взгляд, большинство ответов предложены здесь как неоптимальные. Наиболее близким является оригинальный, предложенный изначально Бранном.
Имя временного файла должно быть
Из-за этих требований не стоит программировать такого зверя самостоятельно. Умные люди, пишущие библиотеки ввода-вывода, беспокоятся о таких вещах, как блокировка (при необходимости) и т. Д. Поэтому я не вижу необходимости переписывать System.IO.Path.GetTempFileName ().
Это, даже если это выглядит неуклюже, должно сделать работу:
источник
File.Move
Возникает,IOException
если целевой файл уже существует. msdn.microsoft.com/en-us/library/…Это может быть удобно для вас ... Это создать временную. папку и вернуть его в виде строки в VB.NET.
Легко конвертируется в C #:
источник
Мне кажется, это работает нормально: он проверяет наличие файла и создает файл, чтобы убедиться, что это место для записи. Должно работать нормально, вы можете изменить его так, чтобы он возвращал непосредственно FileStream (который обычно необходим для временного файла):
источник
Простая функция в C #:
источник
Основываясь на ответах, найденных в интернете, я пришел к своему коду:
И, как поваренная книга C # от Jay Hilyard, Стивен Тейлет указал в разделе « Использование временного файла в вашем приложении» :
Вы должны использовать временный файл всякий раз, когда вам нужно временно сохранить информацию для последующего поиска.
Единственное, что вы должны помнить, это удалить этот временный файл до того, как приложение, которое его создало, будет завершено.
Если он не будет удален, он останется во временном каталоге пользователя, пока пользователь не удалит его вручную.
источник
Я смешал ответы @Maxence и @Mitch Wheat, помня о том, что хочу семантику метода GetTempFileName (fileName - это имя нового файла), добавив предпочтительное расширение.
источник
Это то, что я делаю:
источник
Это простой, но эффективный способ создания дополнительных имен файлов. Он будет смотреть в текущем напрямую (вы можете легко указать это где-то еще) и искать файлы с базовым именем YourApplicationName * .txt (опять же, вы можете легко это изменить). Он начнется в 0000, поэтому первое имя файла будет YourApplicationName0000.txt. если по какой-то причине между именами левого и правого фрагментов (между цифрами и слева) находятся имена файлов, то эти файлы будут игнорироваться с помощью вызова tryparse.
источник
Я думаю, вы должны попробовать это:
Он генерирует уникальное имя файла и создает файл с таким именем в указанном месте.
источник