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 回答