如何避免未经授权的访问异常?

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 的原因,我遇到了一个“System.UnauthorizedAccessException”的错误。如何避免这个错误?该错误是在从用户文件夹 Josh 中拉取所有文件时发生的。

应用程序是否以管理员身份运行,或者至少是具有相关目录权限的用户? - Claies
是的,它是计算机上唯一的帐户。由于它是应用程序数据文件夹,我不需要搜索它,因为它是一个隐藏文件夹。 - Josh Banks
3个回答

4
一些文件是系统文件(例如您的用户文件夹中的文件,如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/zh-cn/library/930b76w0(v=vs.85).aspx

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


我应该如何准确地使用这个? - Josh Banks

0
使用Directory.EnumerateDirectories逐个访问每个文件夹并忽略或记录抛出异常的文件夹。这样,您就可以尽可能获取更多信息。
如果您想知道如何获得对目录的权限,则涉及到您的用户帐户权限问题。

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

我想要所有文件夹和子文件夹,但不包括系统文件夹。这将放在服务器上,以便我可以轻松找到我拥有的电影和音乐。目前它没有完全组织好,因为我有几个人备份到它上面。 - Josh Banks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接