Как я могу создать временный файл с конкретным расширением .NET? - PullRequest
252 голосов
/ 24 февраля 2009

Мне нужно создать уникальный временный файл с расширением .csv.

То, что я сейчас делаю, это

string filename = System.IO.Path.GetTempFileName().Replace(".tmp", ".csv");

Однако это не гарантирует, что мой файл .csv будет уникальным.

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

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

Ответы [ 16 ]

2 голосов
/ 25 июля 2011

Мне кажется, что это нормально работает: он проверяет наличие файла и создает файл, чтобы убедиться, что он доступен для записи. Должно работать нормально, вы можете изменить его так, чтобы он возвращал непосредственно FileStream (который обычно является тем, что вам нужно для временного файла):

private string GetTempFile(string fileExtension)
{
  string temp = System.IO.Path.GetTempPath();
  string res = string.Empty;
  while (true) {
    res = string.Format("{0}.{1}", Guid.NewGuid().ToString(), fileExtension);
    res = System.IO.Path.Combine(temp, res);
    if (!System.IO.File.Exists(res)) {
      try {
        System.IO.FileStream s = System.IO.File.Create(res);
        s.Close();
        break;
      }
      catch (Exception) {

      }
    }
  }
  return res;
} // GetTempFile
2 голосов
/ 30 мая 2011

Это может быть удобно для вас ... Это создать временную. папку и вернуть ее в виде строки в VB.NET.

Легко конвертируется в C #:

Public Function GetTempDirectory() As String
    Dim mpath As String
    Do
        mpath = System.IO.Path.Combine(System.IO.Path.GetTempPath, System.IO.Path.GetRandomFileName)
    Loop While System.IO.Directory.Exists(mpath) Or System.IO.File.Exists(mpath)
    System.IO.Directory.CreateDirectory(mpath)
    Return mpath
End Function
0 голосов
/ 01 марта 2019

Основываясь на ответах, которые я нашел в интернете, я прихожу к своему коду:

public static string GetTemporaryFileName()
{       
    string tempFilePath = Path.Combine(Path.GetTempPath(), "SnapshotTemp");
    Directory.Delete(tempFilePath, true);
    Directory.CreateDirectory(tempFilePath);
    return Path.Combine(tempFilePath, DateTime.Now.ToString("MMddHHmm") + "-" + Guid.NewGuid().ToString() + ".png");
}

И в качестве поваренной книги на C # Джея Хиляра Стивен Тейлет указал на Использование временного файла в вашем приложении :

  • вы должны использовать временный файл всякий раз, когда вам нужно сохранить информация временно для последующего поиска.

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

  • Если он не будет удален, он останется во временном хранилище пользователя. каталог, пока пользователь не удалит его вручную.

0 голосов
/ 16 мая 2018

Это простой, но эффективный способ генерации добавочных имен файлов. Он будет смотреть в текущем напрямую (вы можете легко указать это где-то еще) и искать файлы с базовым именем YourApplicationName * .txt (опять же, вы можете легко это изменить). Он начнется в 0000, поэтому первое имя файла будет YourApplicationName0000.txt. если по какой-то причине между именами левого и правого фрагментов (между цифрами и слева) есть имена файлов со спамом, эти файлы будут игнорироваться в результате вызова tryparse.

    public static string CreateNewOutPutFile()
    {
        const string RemoveLeft = "YourApplicationName";
        const string RemoveRight = ".txt";
        const string searchString = RemoveLeft + "*" + RemoveRight;
        const string numberSpecifier = "0000";

        int maxTempNdx = -1;

        string fileName;
        string [] Files = Directory.GetFiles(Directory.GetCurrentDirectory(), searchString);
        foreach( string file in Files)
        {
            fileName = Path.GetFileName(file);
            string stripped = fileName.Remove(fileName.Length - RemoveRight.Length, RemoveRight.Length).Remove(0, RemoveLeft.Length);
            if( int.TryParse(stripped,out int current) )
            {
                if (current > maxTempNdx)
                    maxTempNdx = current;
            }
        }
        maxTempNdx++;
        fileName = RemoveLeft + maxTempNdx.ToString(numberSpecifier) + RemoveRight;
        File.CreateText(fileName); // optional
        return fileName;
    }
0 голосов
/ 22 августа 2011

Я думаю, вы должны попробовать это:

string path = Path.GetRandomFileName();
path = Path.Combine(@"c:\temp", path);
path = Path.ChangeExtension(path, ".tmp");
File.Create(path);

Он генерирует уникальное имя файла и создает файл с таким именем в указанном месте.

0 голосов
/ 16 апреля 2011

Вот что я делаю:

string tStamp = String.Format("{0:yyyyMMdd.HHmmss}", DateTime.Now);
string ProcID = Process.GetCurrentProcess().Id.ToString();
string tmpFolder = System.IO.Path.GetTempPath();
string outFile = tmpFolder + ProcID + "_" + tStamp + ".txt";
...