2016-04-06 13 views
0

私はDocumentsディレクトリとサブディレクトリにアクセスしようとしていますが、アクセスが拒否されるたびにアクセスします。私は例外を参照してください。C#で拒否されたディレクトリへのアクセス - コンソールアプリケーション

System.UnauthorizedAccessException:パスへのアクセス 'C:\ Users \ユーザーMyUserとドキュメントマイミュージックを\ \' 拒否されている。ここ

は私のコードです - 私がしようとしているすべてのdoはこのディレクトリの合計サイズを取得します。

class Program 
{ 
     static void Main(string[] args) 
     { 
      try { 
       // Make a reference to a directory. 
       string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);    
       DirectoryInfo di = new DirectoryInfo(path); 

       // Get a reference to each file in that directory. 
       FileInfo[] fiArr = di.GetFiles(".", SearchOption.AllDirectories); 

       // Display the names and sizes of the files. 
       Console.WriteLine("The directory {0} contains the following files:", di.Name); 

       long size = 0; 
       foreach (FileInfo f in fiArr) 
       { 
        size += f.Length; 
        size++; 
       } 
       Console.WriteLine("The size of desktop files." + size); 
      } 
      catch(Exception e) 
      { 
       Console.WriteLine("Exceptions {0}" , e); 
      }   
     }  
} 
+0

を使用すると、ネットワークドライブからこのアプリケーションを実行していますおそらく、このような

何か?その場合は、デスクトップにコピーして、動作が変更されているかどうかを確認してください。 – Cameron

+2

それが表示されない場合は、あなたのコードでそれを調べたくありません。これはディレクトリではなくハードリンク*です。 DirectoryInfo.Attributesを使用して、SystemまたはReparsePoint属性を持つものから遠ざけてください。ドラゴンがそこに住んでいる。 –

+0

その特別なフォルダを使用することは、ここでは最適ではないかもしれません。この質問をチェック、http://stackoverflow.com/questions/14560884/windows-user-profile-path-folders – Nikki9696

答えて

2

私がスキミングから集めることができるものは、this threadです。これらのフォルダはWindowsの下位互換性のために提供されるソフトリンクである可能性があります。

コーディングの問題を解決するには、現在のユーザーが特定のフォルダにアクセスできない場合にスローされる例外を無視する独自の再帰的フォルダ検索を行うことができます。

static IEnumerable<FileInfo> GetAllFilesRecursive(string path) 
    { 
     var di = new DirectoryInfo(path); 
     var files = new List<FileInfo>(); 
     files.AddRange(di.GetFiles(".")); 

     foreach (var directory in Directory.GetDirectories(path)) 
     { 
      try 
      { 
       files.AddRange(GetAllFilesRecursive(directory)); 
      } 
      catch (UnauthorizedAccessException) // ignore directories which the user does not have access to 
      {} 

     } 
     return files; 
    } 

次に、新しい機能を使用するようにコードを書き換える:

static void Main(string[] args) 
    { 
     try 
     { 
      // Make a reference to a directory. 
      string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 

      var fiArr = GetAllFilesRecursive(path); 

      // Display the names and sizes of the files. 
      Console.WriteLine("The directory {0} contains the following files:", path); 

      long size = 0; 
      foreach (FileInfo f in fiArr) 
      { 
       size += f.Length; 
       size++; 
      } 
      Console.WriteLine("The size of desktop files." + size); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Exceptions {0}", e); 
     } 
    } 
+0

まあ、これは私のために働く。ありがとう@ Stokke –

+0

クール。お力になれて、嬉しいです!答えの左側にあるチェックマークを押してそれを受け入れることを忘れないでください;-) – Stokke

1

検索は、TopDirectoryOnlyであり、すべてのディレクトリではありません。

問題は、この行である:

FileInfo[] fiArr = di.GetFiles(".", SearchOption.AllDirectories);

に変更し、それを:

FileInfo[] fiArr = di.GetFiles(".", SearchOption.TopDirectoryOnly);

これは動作するはずです。

+0

これはドキュメントフォルダでは機能しますが、そのディレクトリ内のサブフォルダでは機能しません。 –

0

一部の特別なフォルダには、例外なく実行するための特定の管理者特権が必要です。管理者権限でコードを実行する必要があります。

+0

私もそれをやったが、物理的に存在しないフォルダにはまってしまった。 –

関連する問題