C# - 无法访问所有文件

时间:2012-10-28 08:29:37

标签: c# exception permissions file-permissions

我的应用程序使用.NET对象Directory.GetFiles()

我正在使用的实际重载是

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

问题是源文件夹是C:\ Users \ UserName,然后它会尝试查看应用程序数据文件夹。

当它尝试从应用程序数据文件夹中读取时,会抛出异常:

  

“访问路径'C:\ Users \ Dave \ AppData \ Local \ Application   数据被拒绝。“

所以,我的问题是,是否有人对我的选择有意见?我想我必须改变我收集所有文件的方式,或者可能有一个内置的重载或方法,这将允许我继续这(我显然不知道)。

如果它有帮助,那么这个目标就是将Directory.GetFiles()检索到的所有文件都带到其他地方(将它们粘贴)到哪里(一个美化的复制和粘贴/备份)。我实际上并不太担心系统文件,只是'用户文件'。

2 个答案:

答案 0 :(得分: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" />

谢谢, 我希望你觉得这很有帮助:)

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