2

我编写了一个调用该方法的程序(在 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);

可能是什么问题?

4

4 回答 4

2

首先,您应该使用 DirectoryInfo.EnumerateFiles(...) 而不是 GetFiles(...)。EnumerateFiles(...) 使您不必获取整个列表,直到您真正需要为止。

我不久前遇到了这个问题,发现我最终需要实现一个替换 IEnumerable 才能完成对我可能只选择访问的文件夹的枚举。

您可以在以下线程中看到我的研究结果。DirectoryInfo.EnumerateFiles(...) 导致 UnauthorizedAccessException (和其他异常)

于 2013-07-25T21:05:52.737 回答
1

只是一个快速复制粘贴,因为我遇到了同样的问题。根据您的需要调整代码(因为我计算大小,计算所有文件并将我要复制的所有文件“保存”在列表中)。在列表中获得所有文件后,您可以开始复制它们或您想对文件执行什么操作:

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;
    }
于 2016-08-12T21:17:00.877 回答
0

您最好的选择可能是在调用周围放置一个 try/catch 块并忽略您无权访问的任何目录。也许不是最好的解决方案,但它至少会让您的方法获得您有权访问的所有目录。像这样的东西:

try
{
    directory.GetFiles();
}
catch (UnauthorizedAccessException)
{
    string logMsg = string.Format("Unable to access directory {0}", directory.FullName);
    //Handle any desired logging here
}
于 2013-07-25T20:13:41.903 回答
0

就像打击一样,使用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) { }
    }
于 2021-07-02T08:56:59.867 回答