3

私のアプリケーションは .NET オブジェクトを使用しますDirectory.GetFiles()

私が使用している実際のオーバーロードは

var allFiles = Directory.GetFiles("C:\\Users\\Dave", "*.*", SearchOption.AllDirectories);

問題は、ソース フォルダーが C:\Users\UserName の場合で、アプリケーション データ フォルダーを参照しようとするためです。

アプリケーション データ フォルダーから読み取ろうとすると、例外がスローされます。

「パス 'C:\Users\Dave\AppData\Local\Application Data' へのアクセスが拒否されました。」

それで、私の質問は、私の選択肢について意見を持っている人はいますか? すべてのファイルを収集する方法を変更する必要があるか、これを続行できるようにするオーバーロードまたはメソッドが組み込まれている可能性があると思います(これについては明らかにわかりません)。

それが役立つ場合、これの目標は、によって取得されたすべてのファイルを取得しDirectory.GetFiles()、それらを他の場所に「貼り付ける」ことです(美化されたコピーと貼り付け/バックアップ)。私は実際にはシステムファイルについてあまり心配していません。「ユーザーファイル」だけです。

4

2 に答える 2

3

ディレクトリ%AppData%はシステム保護ディレクトリです。Windows は、アクセスが許可されない (管理者以外のユーザーからのアクセス) とすぐに、このディレクトリへのアクセスをブロックしようとします。

デフォルトでは、管理者のみがこのディレクトリから読み書きする権限を持っています。

または、例外をキャッチして、結果がAccess Denied. 次に、この手順を完了するために管理者として実行するようにユーザーに求めることができます。ユーザーに管理者として実行するように求める簡単な例を次に示します。

try
{
     var allFiles = Directory.GetFiles("C:\\Users\\Dave", "*.*", SearchOption.AllDirectories);
}
catch (Exception EX)
{
     if (EX.Message.ToLower().Contains("is denied."))
     {
          ProcessStartInfo proc = new ProcessStartInfo();
          proc.UseShellExecute = true;
          proc.WorkingDirectory = Environment.CurrentDirectory;
          proc.FileName = Application.ExecutablePath;
          proc.Verb = "runas"; //Required to run as Administrator
          try
          {

          Process.Start(proc);

          }
          catch
          {
               //The user refused to authorize
          }
     }
}

ただし、アプリケーションの起動時に常にユーザーに承認を求めることができますが、これは常に推奨されるわけではありません。これを行うには、プロジェクトapp.manifestファイルを編集する必要があります。

次の行を見つけて変更します

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

ありがとう、
これがお役に立てば幸いです:)

于 2012-10-28T08:38:43.093 に答える
1

アクセスできるフォルダー名を取得するには、foreach ループを使用することをお勧めします。

DirectoryInfo dI = new DirectoryInfo(@"C:\Users\Dave");
List<string> files = new List<string>();
foreach (DirectoryInfo subDI in dI.GetDirectories())
{
        if ((subDI.Attributes & (FileAttributes.ReparsePoint | FileAttributes.System)) !=
        (FileAttributes)0)
              continue;
        files.Add(subDI.FullName);
}
于 2012-10-28T08:46:48.467 に答える