![](/img/trans.png)
[英]Access denied while accessing files in c:\Programdata in Windows 10
[英]Access to the path 'C:\ProgramData\Application Data' is denied
我希望得到文件夾的大小
C:\ProgramData\
我使用以下代碼
public static long GetDirectorySize(string folderPath)
{
DirectoryInfo di = new DirectoryInfo(folderPath);
return di.EnumerateFiles("*", SearchOption.AllDirectories).Sum(fi => fi.Length);
}
但它提示我錯誤:
An unhandled exception of type 'System.UnauthorizedAccessException' occurred in mscorlib.dll
Additional information: Access to the path 'C:\ProgramData\Application Data' is denied.
我已經設定了
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
在app.manifest。 似乎即使我直接在Windows中打開C:\\ ProgramData \\ Application Data它也被拒絕。
如何解決這個問題?
我想你不能這樣做,從命令下面:
C:\ProgramData>dir /a
Volume in drive C is OSDisk
Volume Serial Number is 067E-828E
Directory of C:\ProgramData
04/20/2017 02:00 PM <DIR> .
04/20/2017 02:00 PM <DIR> ..
07/14/2009 01:08 PM <JUNCTION> Application Data [C:\ProgramData]
您可以看到,Application Data是一個指向ProgramData的連接點。 Windows包含許多類似的連接點,以便與舊應用程序向后兼容。
聯結點上的安全權限明確禁止列出文件,這就是您無法獲取其內容列表的原因:
C:\ProgramData>icacls "Application Data" /L
Application Data Everyone:(DENY)(S,RD)
Everyone:(RX)
NT AUTHORITY\SYSTEM:(F)
BUILTIN\Administrators:(F)
由於某些原因,枚舉文件系統可能會引發SecurityException
。
最好的選擇是對這些異常進行回調。
public class FileSytemInfoErrorArgs
{
public FileSytemInfoErrorArgs( FileSystemInfo fileSystemInfo, Exception error )
{
FileSystemInfo = fileSystemInfo;
Error = error;
}
public FileSystemInfo FileSystemInfo { get; }
public Exception Error { get; }
public bool Handled { get; set; }
}
public static class DirectoryInfoExtensions
{
public static long GetTotalSize( this DirectoryInfo di, Action<FileSytemInfoErrorArgs> errorAction = null )
{
long size = 0;
foreach ( var item in di.EnumerateFileSystemInfos() )
{
try
{
size += ( item as FileInfo )?.Length
?? ( item as DirectoryInfo )?.GetTotalSize( errorAction )
?? throw new InvalidOperationException();
}
catch ( Exception ex )
{
var arg = new FileSytemInfoErrorArgs( item, ex );
errorAction?.Invoke( arg );
if ( !arg.Handled )
{
throw;
}
}
}
return size;
}
}
最后
var path = Environment.GetFolderPath( Environment.SpecialFolder.CommonApplicationData );
var dir = new DirectoryInfo( path );
var totalSize = dir.GetTotalSize(
errorAction: e =>
{
// Console.WriteLine( "{0}: {1}", e.FileSystemInfo.FullName, e.Error.Message );
e.Handled = true;
} );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.