2016-04-06 7 views
0

Ich versuche, auf die Dokumente Verzeichnis und Unterverzeichnisse zuzugreifen, aber jedes Mal sagt Zugriff verweigert. Ich sehe die Ausnahme:Zugriff auf das Verzeichnis verweigert in C# - Konsolenanwendung

System.UnauthorizedAccessException: Zugriff auf den Pfad 'C: \ Benutzer \ MyUser \ Dokumente \ Eigene Musik' verweigert

Hier ist mein Code - alles, was ich bin versucht zu do ist die Gesamtgröße dieses Verzeichnisses.

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

Sind Sie mit dieser Anwendung aus einer Netzwerklaufwerk? Wenn ja, versuchen Sie, es auf den Desktop zu kopieren, um zu sehen, ob sich das Verhalten ändert. – Cameron

+2

Wenn Sie es nicht sehen, dann wollen Sie es auch nicht mit Ihrem Code sehen. Dies ist ein * fester Link *, kein Verzeichnis. Verwenden Sie DirectoryInfo.Attributes, halten Sie sich von allem fern, das über das System- oder das ReparsePoint-Attribut verfügt. Drachen leben dort. –

+0

Verwenden Sie diesen speziellen Ordner möglicherweise nicht die beste Option für Sie hier. Schauen Sie sich diese Frage an, http://stackoverflow.com/questions/14560884/windows-user-profile-path-folders – Nikki9696

Antwort

2

Von dem, was ich von Skimming this thread sammeln kann, könnte es sein, dass diese Ordner Soft-Links für Windows-Abwärtskompatibilität bereitgestellt werden.

Zur Lösung des Codeproblems können Sie eine eigene rekursive Ordnersuche erstellen, die die Ausnahmen ignoriert, die ausgelöst werden, wenn der aktuelle Benutzer keinen Zugriff auf einen bestimmten Ordner hat. vielleicht

wie dieses Etwas:

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; 
    } 

Dann schreiben Sie den Code die neue Funktion zu verwenden:

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

Nun, das funktioniert für mich. Danke @Stokke –

+0

Cool. Freue mich zu helfen! Bitte denken Sie daran, das Häkchen links neben der Antwort zu setzen, um es zu akzeptieren ;-) – Stokke

1

Die Suche sollte auf TopDirectoryOnly und nicht auf AllDirectories erfolgen.

Das Problem ist in dieser Zeile:

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

Ändern Sie es an:

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

Diese funktionieren sollte.

+0

Das funktioniert für den Ordner Dokumente, aber nicht für die Unterordner in diesem Verzeichnis. –

0

Einige SpecialFolder benötigen bestimmte Admin-Berechtigungen, die ohne Ausnahme ausgeführt werden können. Sie müssen Ihren Code in Admin-Berechtigungen ausführen.

+0

Ich tat das auch, aber es würde an einem Ordner hängen, der physisch nicht existiert. –