C# - 无法访问所有文件(C# - Cannot access all files)

2019-08-02 01:48发布

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

我使用的实际过载

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

问题是,当源文件夹是C:\ Users \用户名,因为它然后试图通过应用程序数据文件夹的样子。

当它试图从应用程序数据文件夹来读取,则抛出异常:

“访问路径‘C:\用户\戴夫\应用程序数据\本地\应用数据’被拒绝。”

所以,我的问题是,没有任何一个有一个意见,我的选择吗? 我假设我必须要么改变我收集所有文件的方式,或者可能有一个内置的过载或方法,可以让我继续这样(我显然不知道)。

如果有帮助,这样做的目的是采取通过检索所有文件Directory.GetFiles() “粘贴”,并将其他地方(一个荣耀的复制和粘贴/备份)。 实际上,我并不是太担心系统文件,只是“用户文件”。

Answer 1:

目录%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" />

谢谢,
我希望你觉得这有用 :)



Answer 2:

这是更好地使用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);
}


文章来源: C# - Cannot access all files