2016-04-06 15 views
0

Belgeler dizini ve alt dizinlerine erişmeye çalışıyorum ancak her defasında erişim reddedildi. Ben İstisna bkz:C# - Console Uygulamasında reddedilen dizine erişim

System.UnauthorizedAccessException: yol Erişim 'C: \ Users \ MyUser Belgelerim \ Müziğim \' engellendi İşte

benim kodudur - Ben çalışıyorum bütün Bu dizinin toplam boyutunu almak.

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

bir ağ sürücüsünün kapalı bu uygulamayı çalıştırıyor musunuz? Öyleyse, davranış değişip değişmediğini görmek için masaüstüne kopyalamayı deneyin. – Cameron

+2

Bunu görmüyorsanız, kodunuza da bakmak istemezsiniz. Bu bir * hard link *, bir dizin değil. DirectoryInfo.Attributes kullanın, Sistem veya ReparsePoint özniteliği olan her şeyden uzak durun. Ejderhalar orada yaşıyor. –

+0

Bu özel klasörü kullanmak, sizin için en iyi seçenek olmayabilir. Bu soruyu kontrol edin, http://stackoverflow.com/questions/14560884/windows-user-profile-path-folders – Nikki9696

cevap

2

this thread göz gezdirmekten ne toplayabildiğimden, bu klasörler Windows'un geriye dönük uyumluluğu için sağlanan yumuşak bağlantılar olabilir.

Kodlama sorununu çözmek için, geçerli kullanıcı belirli bir klasöre erişemediğinde atılan istisnaları yok sayan kendi yineleme klasörü aramasını yapabilirsiniz. belki böyle

şey:

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

Sonra yeniden yeni işlevi kullanmak için kod:

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

Eh, bu benim için çalışıyor. Teşekkürler @Stokke –

+0

Serin. Memnuniyetle yardım ettim! Lütfen kabul etmek için cevabın solundaki onay işaretini vurmayı unutmayın ;-) – Stokke

1

Arama, TopDirectoryOnly üzerinde olmalı ve AllDirectories'de olmamalıdır.

sorun bu satırda geçerli:

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

Değişim bunun için:

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

Bu çalışması gerekir.

+0

Bu, belgeler klasöründe çalışır, ancak bu dizindeki alt klasörler için çalışmaz. –

0

Bazı Özel Klasörler, herhangi bir istisnasız çalışması için belirli Yönetici ayrıcalıklarına ihtiyaç duyar. Kodunuzu Yönetici ayrıcalıklarında çalıştırmalısınız.

+0

Ben de yaptım, ama fiziksel olarak var olmayan bir klasöre yapışmış. –

İlgili konular