【问题标题】:Unreachable expression code in LINQ queryLINQ 查询中无法访问的表达式代码
【发布时间】:2014-04-30 17:38:03
【问题描述】:

我正在尝试使用 LINQ 构建一个并行查询,以获取某个目录及其子目录中的所有文本文件和一个 CSV 文件。我想排除隐藏文件、临时文件和系统文件甚至不被查询考虑,以希望加快速度。 (这个目录很大。)虽然我在这里,但我还想排除几个子目录。这是我的代码:

ParallelQuery<string> getFiles =
    Directory.EnumerateFiles(@"C:\", "*", SearchOption.AllDirectories)
    .AsParallel().Where(f => (
        FileAttributes.Hidden == 0 &&
        FileAttributes.System == 0 &&
        FileAttributes.Temporary == 0 &&
        !Path.GetDirectoryName(f).Contains("TempDir") &&
        !Path.GetDirectoryName(f).Contains("OtherDir") &&
        (Path.GetExtension(f).ToUpper() == ".TXT" ||
        Path.GetFileName(f) == "GoodFile.csv")));

我尝试使用对this question 的接受答案作为起点。在 Visual Studio(2013 Express Desktop,如果重要的话)中,我在第 7-9 行得到一个绿色下划线,其中不包括某些子目录并将结果限制为 .txt 文件,告诉我Unreachable expression code detected。但是,包含 .csv 文件的行似乎没问题。执行查询不会返回任何结果,也不会抛出任何异常。

我对 LINQ 还是很陌生,所以如果这里的问题非常明显,请原谅我。任何人都可以对此有所了解吗?或者也许有更好的方法来解决这个问题?

【问题讨论】:

    标签: c# linq filesystems file-attributes


    【解决方案1】:
    FileAttributes.Hidden == 0 &&
    FileAttributes.System == 0 &&
    FileAttributes.Temporary == 0 &&
    

    这是测试枚举值是否为 == 0,而不是文件是否具有该属性。您需要创建System.IO.FileInfo 的实例才能使用FileInfo.Attributes。您可以为此使用.Select(f =&gt; new System.IO.FileInfo(f))

    【讨论】:

    • 不止FileAttributes.Hidden是一个常量枚举值,与linq正在处理的文件无关
    • 感谢您的回答!如果我使用f =&gt; new System.IO.FileInfo(f),我还能使用Path.GetExtension(f) 等吗?
    • 是的。虽然f 现在将是FileInfo 而不是string,所以你应该使用f.Name
    • 当我使用.Select(f =&gt; new FileInfo(f)) 时,查询返回FileInfo 对象而不是字符串。如何以属性为条件但将文件路径作为字符串返回?
    • @Alex - 您可以改用 .Name 属性,在末尾添加 Select(f =&gt; f.Name),或者 - 这就是我要做的 - 将逻辑分解为一个单独的函数,该函数需要在一个字符串中并返回一个布尔值 - 所以它将是.Where(f =&gt; UseThisFile(f))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多