存在しないと確信できるフォルダ名を含む文字列を取得する最良の方法は何ですか? つまりDirectoryInfo.Exists、指定されたパスを呼び出すと、false が返されるはずです。
編集: その背後にある理由は、エラー チェッカーのテストを書いているためです。エラー チェッカーはパスが存在するかどうかをテストするため、存在しないパスを取得する最善の方法を声に出して考えました。
GUID にちなんで名前を付けます -不正な文字を削除するだけです。
自分がやりたいことを正確に行う方法は実際にはありません。考えてみると、 への呼び出しDirectoryInfo.Existsが false を返した後でも、他のプログラムが先に進んでディレクトリを作成した可能性があることがわかります。これは競合状態です。
これを処理する通常の方法は、新しい一時ディレクトリを作成することです。作成が成功した場合は、作成する前に存在していなかったことがわかります。
ディレクトリを作成せずに確認できるのは、ディレクトリが数マイクロ秒前には存在しなかったことだけです。十分に近いかもしれない1つのアプローチを次に示します。
string path = Path.GetTempFileName();
File.Delete(path);
Directory.CreateDirectory(path);
これにより、スレッド競合に対してブロックするディレクトリが作成されることに注意してください (つまり、別のプロセス/スレッドがあなたの下からディレクトリを盗みます)。
私が使用することになったもの:
using System.IO;
string path = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
(また、GUIDから文字を取り除く必要はないようです-それらは正当なファイル名を生成します)
ユーザー名、今日の日付、時間などの文字列をミリ秒単位で連結するのがよいでしょう。
私は興味があります:なぜあなたはこれをしたいのですか?それは何のためにあるべきですか?
これは一時フォルダを作成するためのものですか?Guid.NewGuid を使用して、まだ存在しないことを確認したいフォルダー名に使用する文字列を取得することがよくあります。
私はあなたが十分に近づくことができると思います:
string directoryName = Guid.NewGuid.ToSrtring();
Guid はかなりランダムなので、2 つのディレクトリを同じにするべきではありません。
いくらか一意でもある名前空間内で新たに生成された 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);