拒绝访问用户文件夹

时间:2013-07-18 19:16:47

标签: c#

我需要在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);
        }
    }
}

以管理员身份运行应用程序也不起作用。怎么避免这个?

2 个答案:

答案 0 :(得分:2)

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

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

查看此链接以获取有关如何以编程方式设置它的更多信息: C# - Set Directory Permissions for All Users in Windows 7

答案 1 :(得分: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);
        }
    }
}