質問
存在しないと確信できるフォルダー名を含む文字列を取得する最良の方法は何ですか?つまり、指定されたパスに対して 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から文字を削除する必要はないようです-正当なファイル名を生成します)
1つの良い方法は、ユーザー名、今日の日付、時刻などの文字列をミリ秒まで連結することです。
私は好奇心が強いです:なぜあなたはこれをしたいのですか?それは何のためにあるべきですか?
これは一時フォルダーなどを作成するためですか?私は頻繁にGuid.NewGuidを使用して、存在しないことを確認したいフォルダー名に使用する文字列を取得します。
十分近くにいると思います:
string directoryName = Guid.NewGuid.ToSrtring();
Guidはかなりランダムなので、同じ2 dirsを取得しないでください。
名前空間内で新たに生成された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);