簡體   English   中英

列出所有磁盤和所有目錄上的所有文件,除了 C# .Net 中系統目錄中的文件

[英]List all files on all disks and all directories except the files in system directories in C# .Net

我有一個用 C# 編寫的程序,它列出了所有目錄中的所有文件,除了那些需要管理員權限的文件。 它沒有錯誤,但總是給我一個我已經忽略的目錄的訪問被拒絕異常。 拒絕訪問例外是針對“C:$Recycle.Bin\S-1-5-18”的。 實際上,我忽略了這個目錄並以管理員權限運行程序,但異常仍然存在。誰能幫助我? 謝謝

static void List()
{

    List<string> files = new List<string>();
    List<string> nofiles = new List<string>();
    
    foreach (var drives in DriveInfo.GetDrives())
    {
        var filez = Directory.GetFiles(drives.Name,"*",SearchOption.AllDirectories);

        foreach (string f in filez)
        {
            if (f.StartsWith(@"C:\Windows"))
            {
            }
            else if (f.StartsWith(@"C:\Config.Msi"))
            {
            }
            else if (f.StartsWith(@"C:\Program Files"))
            {
            }
            else if (f.StartsWith(@"C:\Program Files (x86)"))
            {
            }
            else if (f.StartsWith(@"C:\DumpStack.log"))
            {
            }
            else if(f.StartsWith(@"C:\$Recycle.Bin\S-1-5-18"))
            {
            }
            else if(f.StartsWith(@"C:\Documents and Settings"))
            {
            }
            else
            {
                files.Add(f);
            }
        }

        foreach (string fl in files)
        {
            var c = Path.GetFullPath(fl);
            Console.WriteLine(c);
            Console.ReadKey();
        }
        Console.ReadKey();
    }
}

直接訪問幾乎總是以拒絕訪問結束,您應該使用枚舉選項更精確地指定搜索規則,如下所示:

    foreach (var drive in DriveInfo.GetDrives())
    {
        if (drive.IsReady == false)
        {
            continue;
        }

        var filez = Directory.GetFiles(drive.Name, "*", new EnumerationOptions
        {
            AttributesToSkip = FileAttributes.Hidden | FileAttributes.System,
            IgnoreInaccessible = true,
            RecurseSubdirectories = true,
            ReturnSpecialDirectories = true,
        });

        // TODO: implement the rest of your code hier ...
    }

其中 FileAttributes.Hidden 不是真正需要的。 ...希望有幫助!

使用Directory.GetFiles(drives.Name,"*",SearchOption.AllDirectories); 您已經遍歷了所有目錄。 過濾是在之后完成的,僅用於決定是否將目錄名稱(您已經擁有!)添加到您的列表中。

要過濾您想要的方式,您需要自己實現遞歸並在每一步捕獲異常。

暫無
暫無

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

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