2

User我需要在我的文件夹中找到我的图片。但我得到运行时错误Access Denied

这是我的代码

static void Main(string[] args)
{
    string pic = "*.jpg";
    string b = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
    string appdata = Path.Combine(b, "AppData"); // I Dont want search in this folder.
    string data = Path.Combine(b, "Data aplikací"); // Here also not.
    foreach (string d in Directory.GetDirectories(b))
    {
        try
        {
            if ((d == data) || (d == appdata))
            {
                continue;
            }
            else
            {
                foreach (string f in Directory.GetFiles(d, pic))
                {
                   //...
                }
            }
        }
        catch (System.Exception excpt)
        {
            Console.WriteLine(excpt.Message);
        }
    }
}

以管理员身份运行应用程序也不起作用。如何避免这种情况?

4

2 回答 2

2

检查文件夹是否是只读的(在 Windows 中),如果是,只需清除只读标志。

如果它不是只读的,请确保管理员用户对该文件夹具有完全权限。您可以通过右键单击文件夹 --> 属性 --> 安全来检查这一点

查看此链接以获取有关如何以编程方式设置它的更多信息: C# - 为 Windows 7 中的所有用户设置目录权限

于 2013-07-18T19:18:53.533 回答
1

哦,不要去改变你的目录/文件夹权限——那只是要求未来的痛苦。

这里没有“单线”解决方案 - 基本上,您需要递归遍历文件夹结构以查找您关心的文件,并在UnauthorizedAccessExceptions此过程中吸收/吃掉(您可以通过检查来完全避免异常DirectoryInfo.GetAccessControl,但这是一个完全不同的问题)

这是一个blob o'code:

void Main()
{
    var profilePath = Environment
        .GetFolderPath(Environment.SpecialFolder.UserProfile);
    var imagePattern = "*.jpg";
    var dontLookHere = new[]
    {
        "AppData", "SomeOtherFolder"
    };

    var results = new List<string>();
    var searchStack = new Stack<string>();
    searchStack.Push(profilePath);    
    while(searchStack.Count > 0)
    {    
        var path = searchStack.Pop();
        var folderName = new DirectoryInfo(path).Name;
        if(dontLookHere.Any(verboten => folderName == verboten))
        {
            continue;
        }
        Console.WriteLine("Scanning path {0}", path);
        try
        {
            var images = Directory.EnumerateFiles(
                 path, 
                 imagePattern, 
                 SearchOption.TopDirectoryOnly);
            foreach(var image in images)
            {
                Console.WriteLine("Found an image! {0}", image);
                results.Add(image);
            }
            var subpaths = Directory.EnumerateDirectories(
                  path, 
                  "*.*", 
                  SearchOption.TopDirectoryOnly);
            foreach (var subpath in subpaths)
            {
                searchStack.Push(subpath);
            }
        }
        catch(UnauthorizedAccessException nope)
        {
            Console.WriteLine("Can't access path: {0}", path);
        }
    }
}
于 2013-07-18T19:41:13.757 回答