3

フォルダが存在するかどうかを確認し、存在しない場合は作成します。しかし、提供されたパスが有効かどうかはわかりません。パスが有効でない場合、次のことが起こります。

string path = "this is an invalid path";

if (!Directory.Exists(path))
    Directory.CreateDirectory(path); //Exception thrown here

無効なパスを指定すると、DirectoryNotFoundException例外がスローされます。

この例外の発生を止めるにはどうすればよいですか? 私はtry-catchを使いたくありません。例外が発生する前であっても、この例外が発生することを検出したい。

4

7 に答える 7

9

Directory.Existsメソッドを使用して、フォルダーが存在するかどうかを確認します

if(Directory.Exists(path))
{
  //Directory exists
}
else
{
 // doesn't exist
}

含めることを忘れないでくださいSystem.IO;

于 2012-12-18T13:00:40.137 に答える
8

コードの失敗の説明は、パスが無効であることです。ドキュメントには次のように記載されています。

DirectoryNotFoundException

指定されたパスは無効です (たとえば、マップされていないドライブ上にあります)。

ディレクトリを作成できるかどうかを事前に予測しようとするのは、たいへんな作業です。セキュリティ、OS 名の規則と制限、ファイル システム名の規則と制限、およびドライブがマップされているかどうかを考慮する必要があります。そして、おそらくもっと多くの懸念があります。システムが無料で提供するものを再実装することは考えていません。

いずれにせよ、 を呼び出すことはできますがDirectory.Exists、例外がスローされることを許可する必要があります。Directory.Existsへの呼び出しとその後のへの呼び出しの間にファイル システムが変更された場合Directory.CreateDirectory、例外が発生します。たとえば、作成しようとしているディレクトリが別のプロセスによって作成された場合などです。確かに、これはかなりありそうもないイベントですが、完全に可能です。

要約すると、遠く離れた最良のオプションは、例外をキャッチすることです。よく知られていることわざにあるように、許可を求めるよりも許しを求めるほうがよい.

于 2012-12-18T13:02:12.053 に答える
3

(特定の)例外をキャッチしたくないのはなぜですか?それは良い習慣と考えられています...とにかく、これらはtry/catchなしの私の解決策です:

  1. 解決:

    string path = "C:\test";
    if (!Directory.Exists(path) && path.IndexOfAny(Path.GetInvalidFileNameChars()) == -1)
    {
        Directory.CreateDirectory(path);
    }
    
  2. 解決:

    string path = "C:\test";
    var canCreate = true;
    foreach (var c in path.Where(Path.GetInvalidFileNameChars().Contains))
    {
        canCreate = false;
    }
    
    if (canCreate && !Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
    }
    
  3. 解決:

    if (path.Any(c => Path.GetInvalidFileNameChars().Contains(c)) && !Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
    }
    

このコードはまだ失敗する可能性があることに注意してください。

また、Exists() を使用したテストの後、CreateDirectory() を呼び出す前に、ディレクトリが (別のプロセス/スレッド/... によって) 作成された可能性が (少し) あることに注意してください。これらは 2 つの呼び出しであり、ファイル システムを照会/変更するときは (一緒に) アトミックではありません。

于 2012-12-18T14:24:21.557 に答える
0

指定されたディレクトリ名が新しいディレクトリ名Path.GetInvalidFileNameChars()に対して有効かどうかを確認するためにも使用できます。

// Directory.Exists will return false because path is not even valid
var path = "1:1 comparison?";
var firstBad = Path.GetInvalidFileNameChars().Cast<char?>()
                   .FirstOrDefault(c => path.Contains(c.Value));
if (firstBad != null)
    Console.WriteLine("Char '{0}' is invalid for a directory name", firstBad.Value);
于 2012-12-18T13:15:53.530 に答える
0

これを試して

string path = "これは無効なパスです";

        if (Path.IsPathRooted(path)
        {
            Directory.CreateDirectory(path); 
        }
于 2012-12-19T06:31:27.670 に答える
-1

単一のif-elseステートメントを使用できます

if(!Directory.Exists(path))
   Directory.CreateDirectory(path)
else
   //Show user a custom error message
于 2012-12-18T13:03:33.873 に答える