簡體   English   中英

對“C:\\ ProgramData \\ Application Data”路徑的訪問被拒絕

[英]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)

查看更多信息: 什么是Programdata / Application Data文件夾?

由於某些原因,枚舉文件系統可能會引發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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM