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、それはまったく別の質問)

ブロブのコードは次のとおりです。

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 に答える