簡體   English   中英

如何使用Directory.EnumerateFiles,不包括隱藏文件和系統文件

[英]How to use Directory.EnumerateFiles excluding hidden and system files

我正在枚舉目錄中的所有文件,以便稍后處理它們。 我想排除隱藏和系統文件。

這是我到目前為止:

IEnumerable<IGrouping<string, string>> files;

files = Directory.EnumerateFiles(sourcePath, "*", SearchOption.AllDirectories)
       .Where(f => (new FileInfo(f).Attributes & FileAttributes.Hidden & FileAttributes.System) == 0)
       .GroupBy(Path.GetDirectoryName);

但是,如果我查看結果,我仍然會隱藏並包含系統文件:

foreach (var folder in files)
{
    foreach (var file in folder)
    {
        // value for file here still shows hidden/system file paths
    }
}

我發現這個問題與傑羅姆有類似的例子,但我甚至無法編譯。

我究竟做錯了什么?

.Where(f => (new FileInfo(f).Attributes & FileAttributes.Hidden & FileAttributes.System) == 0)

由於FileAttributes值是標志,因此它們在位級別上是分離的,因此您可以正確地組合它們。 因此, FileAttributes.Hidden & FileAttributes.System將始終為0 所以你基本上檢查以下內容:

(new FileInfo(f).Attributes & 0) == 0

這將永遠是真實的,因為您使用& 0部分刪除任何值。

您要檢查的是文件是否既沒有這些標志,換句話說,如果沒有兩個組合的公共標志:

.Where(f => (new FileInfo(f).Attributes & (FileAttributes.Hidden | FileAttributes.System)) == 0)

你也可以使用Enum.HasFlag使這個更容易理解:

.Where(f => !new FileInfo(f).Attributes.HasFlag(FileAttributes.Hidden | FileAttributes.System))

您可以使用DirectoryInfo和FileInfo大量簡化代碼,例如:

var mask= FileAttributes.Hidden | FileAttributes.System;

var di=new DirectoryInfo(sourcePath);
var files=di.EnumerateFiles("*", SearchOption.AllDirectories)
            .Where(fi=>(fi.Attributes & mask) == 0)
            .GroupBy(fi=>fi.DirectoryName);

您的原始代碼嘗試在沒有公共位的標志之間執行按位AND,因此返回0.因此,帶Attributes的按位AND也返回0。

要檢查的掩碼是System Hidden,即FileAttributes.Hidden | FileAttributes.System FileAttributes.Hidden | FileAttributes.System 事先計算它只會使代碼更清晰

您可以使用FileSystemInfo.Attributes.HasFlag

DirectoryInfo dir = new DirectoryInfo( sourcePath );
var files = dir.EnumerateFiles("*", SearchOption.AllDirectories)
    .Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden) && !f.Attributes.HasFlag(FileAttributes.System))
    .GroupBy(f => f.DirectoryName);

暫無
暫無

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

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