簡體   English   中英

搜索所有子目錄時如何忽略拒絕訪問?

[英]How can i ignore access denied when searching to get all sub directories?

static IEnumerable<string> GetSubdirectoriesContainingOnlyFiles(string path)
{
    try
    {
        return from subdirectory in Directory.GetDirectories(path, "*", SearchOption.AllDirectories)
               where Directory.GetDirectories(subdirectory).Length == 0
               select subdirectory;
    }
    catch
    {

    }
}

在這種情況下,我正在c:\\中搜索,因此某些目錄被拒絕訪問。 我添加了try and catch,但是現在此方法返回了。

而且,當問題到來時,我應該怎么處理呢? 我想最后獲得所有子目錄的列表,以便我可以獲取所有子目錄的名稱和Length(子目錄的數量)。

更新

我在類構造函數中嘗試過:

if (m_pars.SearchDir != null)
{
    ApplyAllFiles(m_pars.SearchDir,ProcessFile);
}

m_pars.SearchDir在此包含C:\\

然后在ApplyAllFiles中:

static List<string> allsubdirs = new List<string>();
static void ProcessFile(string path) {/* ... */}
public static void ApplyAllFiles(string folder, Action<string> fileAction)
{
    foreach (string file in Directory.GetFiles(folder))
    {
        fileAction(file);
    }
    foreach (string subDir in Directory.GetDirectories(folder))
    {
        try
        {
            ApplyAllFiles(subDir, fileAction);
            allsubdirs.Add(subDir);
        }
        catch
        {
            // swallow, log, whatever
        }
    }
}

但是List allsubdirs為空。

您的問題可能是您遞歸訪問子目錄之前沒有訪問(添加到列表)當前目錄。 因此,如果在那里出現異常,則不會將任何內容添加到列表中。

以下對我有用。 (我還通過使用回調使它更加通用,並使異常處理更加嚴格。)

class DirectoryHelper
{
    public static void Test()
    {
        DirectoryHelper.EnumerateSubDirectories(@"c:\windows\system32");
    }

    public static List<string> EnumerateSubDirectories(string path)
    {
        // Depending on your use case, it might be 
        // unecessary to save these in memory 
        List<string> allSubdirs = new List<string>();
        EnumerateSubDirectories(path,
            filePath => Console.WriteLine("Visited file: " + filePath),
            dirPath => allSubdirs.Add(dirPath),
            noAccessPath => Console.WriteLine("No access: " + noAccessPath)
        );
        return allSubdirs;
    }

    private static void EnumerateSubDirectories(string root, Action<string> fileAction, Action<string> subdirAction, Action<string> noAccessAction)
    {
        foreach (string file in Directory.GetFiles(root))
        {
            fileAction(file);
        }

        foreach (string dir in Directory.GetDirectories(root))
        {
            try
            {
                subdirAction(dir);
                EnumerateSubDirectories(dir, fileAction, subdirAction, noAccessAction);
            }
            catch (UnauthorizedAccessException)
            {
                noAccessAction(dir);
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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