2012-02-29 16 views
1

ファイルの処理(開く)は、特にエラーが発生する可能性のあるアクティビティです。ファイルを開くときのエラー処理に最適な方法

これを行うための関数を書くのであれば(些細ではありますが)、wrtの処理エラーでそれを書くにはどうすればよいですか?

次は良好ですか?

if (File.Exists(path)) 
{ 
    using (Streamwriter ....) 
    { // write code } 
} 

else 
// throw error if exceptional else report to user 

これは(構文上正しいとはいえ)でしょうか?

+0

ユーザが 'i​​f'と' using'の間でファイルを削除するとどうなりますか? – SLaks

+1

oblig:http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx – cadrell0

答えて

3

まず、あなたのようなものを使用することができます

4

外部リソースへのアクセスは、常にエラーが発生しやすくなります。あなたはこの

private bool CanAccessFile(string FileName) 
    { 
     try 
     { 
      var fileToRead = new FileInfo(FileName); 
      FileStream f = fileToRead.Open(FileMode.Open, FileAccess.Read, FileShare.None); 
      /* 
       * Since the file is opened now close it and we can access it 
       */ 
      f.Close(); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine("Cannot open " + FileName + " for reading. Exception raised - " + ex.Message); 
     } 

     return false; 
    } 
1

に(、パス/ファイルの存在をファイルアクセス権など)のファイルシステムへのアクセスを管理し、例外処理を管理するためのtry catchブロックを使用しますあなたは、ファイルへのアクセス権を持っている場合、ファイルが存在する場合は、後に、確認し、ストリームの作成の間のtry catchブロックを使用し、見ることができます:だから

public bool HasDirectoryAccess(FileSystemRights fileSystemRights, string directoryPath) 
{ 
    DirectorySecurity directorySecurity = Directory.GetAccessControl(directoryPath); 

    foreach (FileSystemAccessRule rule in directorySecurity.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount))) 
    { 
     if ((rule.FileSystemRights & fileSystemRights) != 0) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

if (this.HasDirectoryAccess(FileSystemRights.Read, path) 
{ 
    if (File.Exists(path)) 
    { 
     try 
     {  
      using (Streamwriter ....)  
      { 
       // write code 
      } 
     } 
     catch (Exception ex)    
     {  
      // throw error if exceptional else report to user or treat it       
     } 
    }  
    else 
    { 
     // throw error if exceptional else report to user 
    } 
} 

try catchですべてを確認し、try catch内でストリームを作成できます。

+0

+0 - これは可能なことですが、正確に処理する必要があるいくつかの利点があります実際にファイルプロパティとしてファイルを使用するときと同じ条件が、アクセス権のチェックと実際のアクセスの間で変更される可能性があります。実際の使用状況の処理エラーはより確実です。 –

関連する問題