我的应用程序使用.NET对象Directory.GetFiles()
我使用的实际过载
var allFiles = Directory.GetFiles("C:\\Users\\Dave", "*.*", SearchOption.AllDirectories);
问题是,当源文件夹是C:\ Users \用户名,因为它然后试图通过应用程序数据文件夹的样子。
当它试图从应用程序数据文件夹来读取,则抛出异常:
“访问路径‘C:\用户\戴夫\应用程序数据\本地\应用数据’被拒绝。”
所以,我的问题是,没有任何一个有一个意见,我的选择吗? 我假设我必须要么改变我收集所有文件的方式,或者可能有一个内置的过载或方法,可以让我继续这样(我显然不知道)。
如果有帮助,这样做的目的是采取通过检索所有文件Directory.GetFiles()
“粘贴”,并将其他地方(一个荣耀的复制和粘贴/备份)。 实际上,我并不是太担心系统文件,只是“用户文件”。
目录%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" />
谢谢,
我希望你觉得这有用 :)
这是更好地使用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);
}