解决列出文件的UnauthorizedAccessException问题

时间:2009-06-15 02:15:37

标签: c# .net security exception

列出系统驱动器以外的驱动器中的所有文件会抛出UnauthorizedAccessException

我该如何解决这个问题?

有没有办法授予我的应用程序所需的访问权限?


我的代码:

Directory.GetFiles("S:\\", ...)

4 个答案:

答案 0 :(得分:2)

这是一个可以工作的课程:

public static class FileDirectorySearcher
{
    public static IEnumerable<string> Search(string searchPath, string searchPattern)
    {
        IEnumerable<string> files = GetFileSystemEntries(searchPath, searchPattern);

        foreach (string file in files)
        {
            yield return file;
        }

        IEnumerable<string> directories = GetDirectories(searchPath);

        foreach (string directory in directories)
        {
            files = Search(directory, searchPattern);

            foreach (string file in files)
            {
                yield return file;
            }
        }
    }

    private static IEnumerable<string> GetDirectories(string directory)
    {
        IEnumerable<string> subDirectories = null;
        try
        {
            subDirectories = Directory.EnumerateDirectories(directory, "*.*", SearchOption.TopDirectoryOnly);
        }
        catch (UnauthorizedAccessException)
        {
        }

        if (subDirectories != null)
        {
            foreach (string subDirectory in subDirectories)
            {
                yield return subDirectory;
            }
        }
    }

    private static IEnumerable<string> GetFileSystemEntries(string directory, string searchPattern)
    {
        IEnumerable<string> files = null;
        try
        {
            files = Directory.EnumerateFileSystemEntries(directory, searchPattern, SearchOption.TopDirectoryOnly);
        }
        catch (UnauthorizedAccessException)
        {
        }

        if (files != null)
        {
            foreach (string file in files)
            {
                yield return file;
            }
        }
    }
}

您可以像这样使用它:

IEnumerable<string> filesOrDirectories = FileDirectorySearcher.Search(@"C:\", "*.txt");

foreach (string fileOrDirectory in filesOrDirectories)
{
   // Do something here.
}

它是递归的,但是使用yield会使内存占用空间很小(在我的测试中不到10KB)。如果您只想要与模式匹配的文件而不是目录,只需将EnumerateFileSystemEntries替换为EnumerateFiles

答案 1 :(得分:1)

是否允许访问该驱动器?程序是否可以在不从Visual Studio运行时访问驱动器?是否在项目的“安全性”页面(“Security Page, Project Designer”)中定义了限制性权限?

答案 2 :(得分:0)

我解决了这个问题。不是真的,但至少是来源。

导致异常的是SearchOption.AllDirectories选项。

但是,当我使用Directories.GetFiles列出直接文件时,它可以正常工作。

这对我来说已经足够了。

任何解决递归列表问题的方法?

答案 3 :(得分:0)

在.net核心中,您可以执行以下操作。它可以以良好的性能递归搜索所有子目录,而无需访问即可忽略路径。 我也尝试了其他方法 How to resolve "key not found: :ciphers"?How to quickly check if folder is empty (.NET)?Is there a faster way than this to find all the files in a directory and all sub directories?

public static IEnumerable<string> ListFiles(string baseDir)
{
    EnumerationOptions opt = new EnumerationOptions();
    opt.RecurseSubdirectories = true;
    opt.ReturnSpecialDirectories = false;
    //opt.AttributesToSkip = FileAttributes.Hidden | FileAttributes.System;
    opt.AttributesToSkip = 0;
    opt.IgnoreInaccessible = true;

    var tmp = Directory.EnumerateFileSystemEntries(baseDir, "*", opt);
    return tmp;
}