未授权访问异常DirectoryInfo.GetFiles()方法
本文关键字:方法 GetFiles DirectoryInfo 授权 访问 异常 | 更新日期: 2023-09-27 18:16:49
我写了一个程序(在Windows 7上),调用方法DirectoryInfo.GetFiles()
,在文件夹"文档和设置"中,我有一个例外UnauthorizedAccess。
我尝试了很多解决方案,比如:
创建一个清单
`<requestedExecutionLevel level="highestAvailable" uiAccess="false" />`
and also with this
DirectorySecurity dSecurity = Directory.GetAccessControl(dir.FullName);
dSecurity.AddAccessRule(new FileSystemAccessRule("Luca", FileSystemRights.FullControl, AccessControlType.Allow));
Directory.SetAccessControl(dir.FullName, dSecurity);
有什么问题吗?
首先,您应该使用DirectoryInfo.EnumerateFiles(…)而不是GetFiles(…)。EnumerateFiles(…)使您不必在实际需要之前获取整个列表。
我遇到了这个问题一段时间后,发现我最终需要实现一个替代IEnumerable,以便能够完成枚举文件夹,我可能只有选择访问。
你可以在下面的帖子中看到我的研究结果。DirectoryInfo.EnumerateFiles(…)导致UnauthorizedAccessException(和其他异常)
只是一个快速复制粘贴,因为我刚刚有同样的问题。根据你的需要调整代码(因为我计算了大小,计算了所有文件,并"保存"了我想要复制的所有文件)。当你把所有的文件都放到列表中时你可以开始复制它们或者你想对文件做什么:
private double CalculateSize(string sourcePath, Progress state, List<FileInfo> filesToCopy)
{
int _fileCount = 0;
DirectoryInfo sourceDirectory = new DirectoryInfo(sourcePath);
FileInfo[] files = null;
try
{
files = sourceDirectory.GetFiles();
}
catch(UnauthorizedAccessException ex)
{
// DO SOME LOGGING-MAGIC IN HERE...
}
if (files != null)
{
foreach (FileInfo file in files)
{
fullSizeToCopy += file.Length;
filesToCopy.Add(file);
_fileCount++;
}
}
DirectoryInfo[] directories = null;
try
{
directories = sourceDirectory.GetDirectories();
}
catch(UnauthorizedAccessException ex)
{
// Do more logging Magic in here...
}
if (directories != null)
foreach (DirectoryInfo direcotry in directories)
{
CalculateSize(direcotry.FullName, state, filesToCopy);
}
state.FileCount = _fileCount;
return fullSizeToCopy;
}
最好的办法可能是在调用周围放置一个try/catch块,并忽略您无法访问的任何目录。也许不是最好的解决方案,但它至少可以使您的方法获得您可以访问的所有目录。像这样:
try
{
directory.GetFiles();
}
catch (UnauthorizedAccessException)
{
string logMsg = string.Format("Unable to access directory {0}", directory.FullName);
//Handle any desired logging here
}
就像blow一样,使用EnumerateDirectories而不是DirectoryInfo.getfiles
private void ScanEmptyDirs(string dir, ref int cnt, CancellationToken token)
{
if (String.IsNullOrEmpty(dir))
{
throw new ArgumentException("Starting directory is a null reference or an empty string: dir");
}
try
{
foreach (var d in Directory.EnumerateDirectories(dir))
{
if (token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested();
}
ScanEmptyDirs(d, ref cnt, token);
}
EmptyJudge(dir, ref cnt);
}
catch (UnauthorizedAccessException) { }
}