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 からすべてのファイルをプルしている場所にあります。

4

3 に答える 3

0

enum Environment.SpecialFolderを使用する必要があります。 特に音楽フォルダーなどに
使用します。これは、理想的には、ユーザーフォルダー内の Windows エクスプローラー自体のすべてのフォルダーとサブフォルダーにアクセスできないためです。それが例外をスローする場所です。 あなたのコードは次のようになります Environment.GetFolderPath(Environment.SpecialFolder.MyMusic )Environment.GetFolderPath(Environment.SpecialFolder.UserProfile ) + @"\Downloads";

        string[] directories;
        string[] Files;
        string folder = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic ) ;
        directories = Directory.GetDirectories(folder);
于 2015-06-16T06:18:41.013 に答える
0

一度に 1 つずつ各フォルダーにアクセスし、例外をスローするフォルダーを無視またはログに記録するには、Directory.EnumerateDirectoriesを使用します。そうすれば、いくらでも手に入る。

ディレクトリへのアクセス許可を取得する方法を知りたい場合は、ユーザー アカウントのアクセス許可の問題です。

于 2015-06-16T05:29:49.500 に答える