2011-12-16 11 views
1

File.ExistsとFileInfo.Existsは、ファイルが存在し、権限レベルが十分であるかどうかをチェックするため、この場合は使用できません。ファイルを読み取る権限があるかどうかを確認せずにファイルが存在するかどうかをチェックする方法は?

許可に関係なくファイルが存在するかどうかを簡単に確認する方法はありますか?

問題のコンテキストは、ユーザーが実際に既存のファイルを上書きするかどうかを尋ねる一般的なものです。自分が所有していないファイルを上書きすることはめったにありません.File.Existsを呼び出すと、そのケースが見つからず、存在しないファイルと混同されます。

+0

あなたはカントは、ファイルが存在しないか、存在するかどうかをチェックすることができるだろうかを確認特定のディレクトリへのアクセス権を持っていない場合。しかし、あなたはおそらくあなたが[アクセスかどうか]を確認することができます(http://www.eggheadcafe.com/microsoft/Csharp/30271754/check-users-directory-permissions.aspx) – Magnus

+0

マグナス:そうだけど、私は考えていたあなたがディレクトリへの権利を持っているが、そこにあるファイルではない場合。 – Joh

+0

File.ExistsのMSDNドキュメントが間違っているようです。 http://msdn.microsoft.com/en-us/library/system.io.file.exists.aspxは、 "呼び出し元に指定されたファイルを読み取るための十分な権限がない場合、例外はスローされず、このメソッドはfalseを返しますパスの存在にかかわらず。 "私はWindows 7のプロとFile.Existsでテストしましたが、私は自分自身の読み取り権を拒否したファイルに対してtrueを返します。 – Joh

答えて

1
static bool FileExists(string path) 
{ 
    var dirInfo = new DirectoryInfo(Path.GetDirectoryName(path)); 
    string file = Path.GetFileName(path); 
    bool exists = (dirInfo.Exists && dirInfo.EnumerateFiles().Any(f => f.Name == file)); 
    return exists; 
} 
+0

いいえ、 'Any()'の代わりに 'EnumerateFiles()'の引数として 'path'を使うことはできませんでしたか?特に、たくさんのファイルがあるディレクトリの場合、OSに.Netプロセスよりも検索をさせる方が速いかもしれません。多分、SecurityExceptionがキャッチされるべきです。これは、プロセスがディレクトリの内容をリストする権利がないときに、正しく理解された場合にスローされます。最後にMSDNによれば、静的な 'Directory'クラスはファイルに関する情報に興味がなければより高速ですが、その名前はより速いと言います。 – Joh

+0

@Johキャッチ例外は、このメソッドにないコールスタックで上位に実行する必要があります。 –

2

DirectoryInfoを使用してこのような作業を行いますか?

DirectoryInfo root = new DirectoryInfo("your_directory_path"); 
FileInfo[] listfiles = root.GetFiles("*"); 
if (listfiles.Length > 0) 
{ 
    //File exists 
    foreach (FileInfo file in listfiles) 
    { 
     // 
    } 
} 
else 
{ 
// 
} 
+0

改善点:ディレクトリが存在するかどうかを確認します。そうでない場合、コードは 'DirectoryNotFoundException'をスローします。パフォーマンス上の理由から、 'GetFiles()'の代わりに 'EnumerateFiles()'を使用してください。おそらくファイルの名前を 'GetFiles' /' EnumerateFiles'のパターンとして使うと、より良いパフォーマンスが得られるでしょう。 'if(length> 0)'が必要ではないと思うので、 'foreach'はディレクトリが空の場合には何もしません。 – Joh