の作成方法を教えてください、温度ファイルの特定の拡張です。います。

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

  •  06-09-2019
  •  | 
  •  

質問

Iを生成しなければならない独自の一時ファイルa.csvいます。

僕は

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

しかし、これを保証するものではありませんが。csvファイルのユニークです。

知っているチャンスもあった衝突可能性は極めて低いものの、特について考えただけでん削除します。tmpファイル)ですが、このコードなのに見えています。

もちろん可動をランダムファイル名ではこれらに独自の一るべきでない問題が思いを持つエクスペディアに対応します。

役に立ちましたか?

解決

(統計的に)一意であることが保証されます:

string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".csv"; 

(衝突のprobabilty上のwikiの記事から引用すると:

  

...に見舞われているの一つの年次リスク   隕石は1と推定されます   170億でチャンス[19]、その手段   確率はおよそ0.00000000006です   (6×10-11)のオッズに相当します   数兆の数十を作成します   今年中のUUIDと1つを有します   重複します。言い換えれば、後にのみ   すべての10億のUUIDを生成します   次の100年のための第二、   1つだけ作成する確率   重複は約50%となります。ザ・   1つの重複の確率は次のようになります   約50%であれば、地球上のすべての人   6億のUUIDを所有している。

編集:またJaredParのコメントを参照してください。

他のヒント

この機能を試してみてください...

public static string GetTempFilePathWithExtension(string extension) {
  var path = Path.GetTempPath();
  var fileName = Guid.NewGuid().ToString() + extension;
  return Path.Combine(path, fileName);
}

それはあなたの選択の拡張子を持つ完全なパスを返します。

注、他の誰かが技術的にはすでにそのファイルを作成している可能性があるため、固有のファイル名を生成するために保証されていません。しかし、誰かのチャンスはあなたのアプリケーションによって生成された次のGUIDを推測し、それは非常に非常に低いです作成。これは一意であると仮定することはかなり安全です。

public static string GetTempFileName(string extension)
{
  int attempt = 0;
  while (true)
  {
    string fileName = Path.GetRandomFileName();
    fileName = Path.ChangeExtension(fileName, extension);
    fileName = Path.Combine(Path.GetTempPath(), fileName);

    try
    {
      using (new FileStream(fileName, FileMode.CreateNew)) { }
      return fileName;
    }
    catch (IOException ex)
    {
      if (++attempt == 10)
        throw new IOException("No unique temporary file name is available.", ex);
    }
  }
}

注:これはPath.GetTempFileNameように動作します。空のファイルは、ファイル名を確保するために作成されます。それはPath.GetRandomFileName()によって生成された衝突の場合に、10の試みを行う。

また、代わりに System.CodeDom.Compilerを使用することができます.TempFileCollectionするます。

string tempDirectory = @"c:\\temp";
TempFileCollection coll = new TempFileCollection(tempDirectory, true);
string filename = coll.AddExtension("txt", true);
File.WriteAllText(Path.Combine(tempDirectory,filename),"Hello World");

ここで私は、TXTの拡張子を使用していますが、あなたが望むものは何でも指定することができます。一時ファイルは、使用後に残されるように、私はまた、trueにキープフラグを設定します。残念ながら、TempFileCollectionは拡張子ごとにランダムなファイルを作成します。あなたはより多くの一時ファイルが必要な場合は、TempFileCollectionの複数のインスタンスを作成することができます。

ファイルが存在する場合、なぜチェックしていない?

string fileName;
do
{
    fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".csv";
} while (System.IO.File.Exists(fileName));

にMSDN書 C++'s GetTempFileName ついてお答えい:

GetTempFileNameができないことを保証するファイルのファイル名は独自の.

みの下位16ビットのuUniqueパラメータを使用します。この制限GetTempFileName最大65535の独自のファイル名の場合はlpPathNameとlpPrefixStringパラメータは同じです。

によりアルゴリズム生成に使用されるファイル名GetTempFileNameで行くの作成時に大量にファイルに同じプレフィックス.この場合、 であることをおすすめ構築の固有のファイル名に基づく特別な技術を必要と.

いかがます:

Path.Combine(Path.GetTempPath(), DateTime.Now.Ticks.ToString() + "_" + Guid.NewGuid().ToString() + ".csv")

コンピュータが時間の同じ瞬間に同じGUIDを生成することが非常にありそうです。私はここを参照してください唯一の弱点は、パフォーマンスへの影響のDateTime.Now.Ticksが追加されますされます。

また、次の操作を行うことができます。

string filename = Path.ChangeExtension(Path.GetTempFileName(), ".csv");

と、予想通り、これも動作します。

string filename = Path.ChangeExtension(Path.GetTempPath() + Guid.NewGuid().ToString(), ".csv");

私の考えでは、最も回答書で提案されているテリアルをサブマテリアルとして最適です。のら近はオリジナルの一提案したのは、当初Brann.

A温度のファイル名が必要

  • 独自の
  • 紛争な存在する)
  • 原子(もの創りの名前のファイルと同じ操作)
  • 推測が困難なものに

これらの要件で通うプログラムなどの獣ります。スマート人文IO Libraries気のようなロック(必要な場合)など。そのため、見かけなレジュメを書き直す必要がある。IO.ます。GetTempFileName().

この場合でも、うちょっとドジで泣きをなすべきか、仕事:

//Note that this already *creates* the file
string filename1 = System.IO.Path.GetTempFileName()
// Rename and move
filename = filename.Replace(".tmp", ".csv");
File.Move(filename1 , filename);

C#で簡単に機能:

public static string GetTempFileName(string extension = "csv")
{
    return Path.ChangeExtension(Path.GetTempFileName(), extension);
}

これはあなたのために便利かもしれない...それは一時を作成することです。フォルダや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

これは私のために正常に動作するようです:それは、ファイルexistanceをチェックし、それが書き込み可能な場所だ確認するためにファイルを作成します。 正常に動作する必要があり、あなたが直接(あなたは一時ファイルのために必要なものは通常である)の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

これは私がやっているものです

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";

これは、増分ファイル名を生成するために単純だが効果的な方法です。それは(再び、あなたが簡単にそれを変更することができます)(あなたは簡単にそのどこかにポイントすることができます)と、ベースYourApplicationName持つファイルを検索* .txtの直接現在になります。最初のファイル名がYourApplicationName0000.txtされるように、それは0000で開始します。何らかの理由で、左と右の部分(ではない数字を意味する)との間にジャンクとファイル名が存在する場合、それらのファイルは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;
    }

に基づく答えを見つけ、インターネットからのようにコードは、以下のことが明らかとなった。

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#CookbookによるジェイHilyardスティーブンTeilhetが 利用の一時ファイルお申し込み:

  • のものを使用できる一時ファイルを必要なときにいつでも保存 情報を一時的に後で検索。

  • いつも一保堂茶舗東京丸の内店では決して忘れてはいけないと思を削除する一時ファイル 前のアプリを作成で終了します。

  • ない場合は削除され、そのユーザーの臨時 ディレクトリでは、ユーザは手動で削除します。

私はあなたがこれを試すべきだと思います:

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

これは、一意のファイル名を生成し、指定した場所にそのファイル名のファイルを作成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top