2015-06-16 4 views
3

Следующий мой код.Как избежать исключения несанкционированного доступа?

//string[] directories; 
     List<string> dirs = new List<string>(Directory.EnumerateDirectories("C:\\Users\\Josh")); 
     //string[] Files; 

     //directories = Directory.GetDirectories(@"C:\Users\Josh\", "*", SearchOption.AllDirectories); 

     SqlConnection myConn = new SqlConnection("Server=Josh-PC;database=Music;User ID=Josh; Password=Climber94; Trusted_Connection=True;"); 

     string removeText = "Delete from Music.dbo.SongNamesAndInfo"; 
     SqlCommand RemoveEntry = new SqlCommand(removeText, myConn); 

     myConn.Open(); 

     RemoveEntry.ExecuteNonQuery(); 

     myConn.Close(); 

     //for (int d = 0; d < directories.Length; d++) 
     foreach (var dir in dirs) 
     {        
      List<string> files = new List<string>(Directory.EnumerateFiles(dir)); 

      foreach (var file in files) 
      { 

       FileInfo oFileInfo = new FileInfo(file); 

       myConn.Open(); 

       string cmdText = "Insert INTO Music.dbo.SongNamesAndInfo " + 
         "(Name,dtCreationTime,Extension,Length,DirectoryName)" + 
         "VALUES(@Name,@dtCreationtime,@Extension,@Length,@DirectoryName)"; 

       SqlCommand addCmd = new SqlCommand(cmdText, myConn);      
       DateTime dtCreationTime = oFileInfo.CreationTime; 

       addCmd.Parameters.AddWithValue("@Name", oFileInfo.Name);          
       addCmd.Parameters.AddWithValue("@dtCreationtime", dtCreationTime);      
       addCmd.Parameters.AddWithValue("@Extension", oFileInfo.Extension);      
       addCmd.Parameters.AddWithValue("@Length", oFileInfo.Length.ToString());      
       addCmd.Parameters.AddWithValue("@DirectoryName", oFileInfo.DirectoryName); 

       if (oFileInfo.Extension.ToLower() == ".mp3" || oFileInfo.Extension.ToLower() == ".avi" ||      
        oFileInfo.Extension.ToLower() == ".mkv" || oFileInfo.Extension.ToLower() == ".m4a" ||       
        oFileInfo.Extension.ToLower() == ".aac" || oFileInfo.Extension.ToLower() == ".wav" ||       
        oFileInfo.Extension.ToLower() == ".mpa" || oFileInfo.Extension.ToLower() == ".wma" ||       
        oFileInfo.Extension.ToLower() == ".flv" || oFileInfo.Extension.ToLower() == ".m4v" ||       
        oFileInfo.Extension.ToLower() == ".mpg" || oFileInfo.Extension.ToLower() == ".mov" ||       
        oFileInfo.Extension.ToLower() == ".wmv" || oFileInfo.Extension.ToLower() == ".mp4")       
       {        
        addCmd.ExecuteNonQuery(); 
       } 

       myConn.Close();      
      }   

так, что им делать принимает список музыки и фильмов и размещения там свойств в базу данных SQL, но я хочу, чтобы найти все директории в файле пользователя. из-за appdata im получение

System.UnauthorizedAccessException был необработанным.

как я могу избежать этого? ошибка заключается в том, где он вытаскивает все файлы из пользовательской папки Josh.

+0

это приложение работает как администратор, или, по крайней мере, пользователь, который имеет права на каталоги, о которых идет речь? – Claies

+0

Да. это единственная учетная запись на компьютере. и будучи папкой данных приложения, я не нуждаюсь в ней, чтобы искать ее существ, это скрытая папка. –

ответ

0

Используйте Directory.EnumerateDirectories, чтобы получить доступ к каждой папке по одному и игнорировать или регистрировать те, которые генерируют исключения. Таким образом вы получите столько, сколько сможете.

Если вы хотите узнать, как получить разрешение на каталоги, это зависит от разрешений вашей учетной записи.

+0

ok, Где бы я это сделал? –

+0

Уточненный код. пожалуйста, что им не хватает. –

3

Некоторые файлы являются системными файлами (например, в папке пользователя, как в вашем случае, например AppData и т. Д.). Вы можете попросить разрешения или игнорировать их

 FileIOPermission f = new FileIOPermission(PermissionState.Unrestricted); 
     f.AllLocalFiles = FileIOPermissionAccess.Read; 
     try 
     { 
      f.Demand(); 
      //your code for processing files 
     } 
     catch (SecurityException s) 
     { 
      //cannot get permissions for files.got exception 
      Console.WriteLine(s.Message); 
     } 

я предлагаю вам взглянуть на код доступа безопасности https://msdn.microsoft.com/en-us/library/930b76w0(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/0d005ted(v=vs.90).aspx

+0

как я могу это использовать. –

0

Вы должны использовать перечисления Environment.SpecialFolder.
Environment.GetFolderPath(Environment.SpecialFolder.MyMusic) для музыкальной папки или Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + @"\Downloads"; и т. Д. Именно поэтому вы не получите доступ ко всем папкам и подпапкам в самом проводнике Windows в папках пользователя. Именно здесь он выдает исключение.
так что ваш код будет что-то вроде этого

 string[] directories; 
     string[] Files; 
     string folder = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic) ; 
     directories = Directory.GetDirectories(folder); 
+0

Я хочу, чтобы все папки и вложенные папки были меньше системных. это происходит на сервере, так что у меня есть простой способ найти, какие фильмы и музыку у меня есть. в настоящее время это не все организовано, потому что у меня есть несколько человек. –

Смежные вопросы