【问题标题】:How Do I get Files From C# Directory如何从 C# 目录中获取文件
【发布时间】:2016-04-06 08:42:14
【问题描述】:

我需要从服务器路径中获取前缀为 009 的所有文件。 但是我的代码检索所有前缀为 0000 的文件,而不是专门以 009 开头的文件。

例如,我有文件“000028447_ghf.doc”、“0000316647 abcf.doc”、“009028447_test2.doc”、“abcd.doc”。

string [] files =Directory.GetFiles(filePath,"009*.doc)

正在给我除“abcd.doc”之外的所有文件。但我需要“009028447_test2.doc”。 如果我给出 Directory.GetFiles(filePath,"ab*.doc) 它将检索“abcd.doc”,并且工作正常。但是当我试图给出像“009”或“00002”这样的模式时,它不会按预期工作.

【问题讨论】:

  • 您是否确定您正在获取所有带有 009*.doc 的文件?我会用一个小测试程序认真仔细检查这个断言......
  • 请重新格式化您的问题并显示更多代码。
  • @Alexander,亲爱的 Alex,代码很简单。使用 System.IO.Directory 读取共享文件夹
  • @Set No ,两者都不同。我想说的是,它适用于具有 abc 或_abc 等字母的搜索模式。但对于 00004 和类似的模式,它不会按预期工作

标签: c# .net


【解决方案1】:

您的代码 sn-p 在模式中缺少一个结束引号字符。代码应该是:

string[] files = Directory.GetFiles(filePath, "009*.doc");

除此之外,它似乎按预期工作。我已经通过创建一个包含您在问题中提到的文件的文件夹来测试这一点:

接下来我创建了一个控制台应用程序,它使用您的代码来查找文件,并将所有结果打印到控制台。输出是预期的结果:

C:\testfolder\009028447_test2.doc

这是控制台应用程序的完整代码:

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        string filePath = @"C:\testfolder";
        string[] files = Directory.GetFiles(filePath, "009*.doc");

        // Creates a string with all the elements of the array, separated by ", "
        string matchingFiles = string.Join(", ", files);

        Console.WriteLine(matchingFiles);
        // Since there is only one matching file, the above line only prints:
        // C:\testfolder\009028447_ test2.doc
    }
}

总之,代码有效。如果您得到其他结果,那么您的设置或代码中肯定存在您未提及的其他差异。

【讨论】:

  • 谢谢拉尔斯...不是关于代码的问题。一些环境问题。一旦我弄清楚了就会很快更新。
  • 为什么有@符号?
  • @Jotarata 是verbatim identifier。我通常使用它来避免转义包含文件夹路径的字符串中的反斜杠。所以"C:\\TEST\\Builds\\2019-12-03\\bin"@"C:\TEST\Builds\2019-12-03\bin"是一样的
【解决方案2】:

如果(我没有检查)确实您只收到了错误的文件,您可能应该使用 foreach 或 linq 来检查文件是否符合您的条件:

Foreach:

List<string> arrPaths = new List<string>();
Foreach(string strPath in Directory.GetFiles(filePath,".doc"))
{
if(strPath.EndsWith(".doc") & strPath.StartsWith("009"))
arrPaths.Add(strPath);
}

林克:

List<string> arrPaths = Directory.GetFiles(filePath,".doc").Where(pths => pths.StartsWith("009") && pths.EndsWith(".doc")).ToList();

这两种方法都是一种解决方法,而不是真正的解决方案,但我希望它们能有所帮助:)

编辑

如果您只想获取文件名,我会从您的 strPath 中减去 filePath,如下所示:

Foreach:

arrPaths.Add(strPath.Replace(filePath + "\\", ""));

林克:

List<string> arrPaths = Directory.GetFiles(filePath,".doc").Where(pt => pt.StartsWith("009") && pths.EndsWith(".doc")).Select(pths => pths.ToString().Replace(filePath + "\\", "").ToList();

【讨论】:

  • 检查是否有任何匹配文件的好方法。但是请注意,Directory.GetFiles 返回文件的完整路径,因此字符串的内容类似于C:\myfolder\009_example.doc
  • 很好的补充@LarsKristensen,因此我建议从 strPath 中减去 filePath。编辑于:)
  • @KonstantinJahnel lambda 选择是否会导致布尔值列出强制转换问题?
  • @meet_aj 我不会知道的。我几乎将它用于所有文件搜索操作,并且从未遇到过问题。所以我可以根据自己的知识和信念推荐它:D
  • @meet_aj 是的,它不应该!用我真的很抱歉的地方替换选择:O
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2018-04-03
  • 1970-01-01
相关资源
最近更新 更多