我的应用程序使用.NET对象Directory.GetFiles()
我正在使用的实际重载是
var allFiles = Directory.GetFiles("C:\\Users\\Dave", "*.*", SearchOption.AllDirectories);
问题是源文件夹是C:\ Users \ UserName,然后它会尝试查看应用程序数据文件夹。
当它尝试从应用程序数据文件夹中读取时,会抛出异常:
“访问路径'C:\ Users \ Dave \ AppData \ Local \ Application 数据被拒绝。“
所以,我的问题是,是否有人对我的选择有意见?我想我必须改变我收集所有文件的方式,或者可能有一个内置的重载或方法,这将允许我继续这(我显然不知道)。
如果它有帮助,那么这个目标就是将Directory.GetFiles()
检索到的所有文件都带到其他地方(将它们粘贴)到哪里(一个美化的复制和粘贴/备份)。我实际上并不太担心系统文件,只是'用户文件'。
答案 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);
}