8

拡張子が指定した文字列と完全に一致するファイルのリストを取得したいのですが。

DirectoryInfo di = new DirectoryInfo(someValidPath);
List<FileInfo> myFiles = new List<FileInfo>();
foreach (FileInfo fi in di.GetFiles("*.txt"))
{
    myFiles.Add(fi);
}

拡張子の付いたファイルを取得し*.txtますが、拡張子の付いたファイルも取得する*.txtxため、コーディングした内容は、拡張子が。で始まる txtファイルを取得することになります。

これは私が望むものではありません。これを実現するには、すべてのファイル名を取得して正規表現を一致させる必要があります"\\.txt$"か(私は思う)、または各ファイル名の文字列を.EndsWith(".txt")などでテストする必要がありますか?

ありがとう!

4

8 に答える 8

4

Whereある程度の回避策ですが、 extesionメソッドを使用して完全一致を除外できます。

foreach (FileInfo fi in di.GetFiles("*.txt")
    .Where(fi => string.Compare(".txt", fi.Extension, StringComparison.OrdinalIgnoreCase) == 0))
{
   myFiles.Add(fi);
}

これにより、拡張子の大文字と小文字を区別しないマッチングが行われることに注意してください。

于 2011-04-06T21:25:27.060 に答える
3

foreachループを実行する代わりに、リストのAddRange機能を使用して、以下の式(変数リストに保存)によって返される各項目に対してAddを呼び出します。

var list = di.GetFiles("*.txt").Where(f => f.Extension == ".txt");
myFiles.AddRange(list);

コードのスニペットを表示しているだけで、myFilesにはすでに値が含まれていると思いますが、そうでない場合は、代わりに実行できます。

List<FileInfo> myFiles = di.GetFiles("*.txt").Where(f => f.Extension == ".txt").ToList();
于 2011-04-06T21:51:54.520 に答える
2

正規表現はやり過ぎかもしれません。FileInfoの拡張機能を使用します。

foreach (FileInfo fi in di.GetFiles("*.txt").Where(f => f.Extension == ".txt"))
{
     myFiles.Add(fi);
} 
于 2011-04-06T21:23:42.210 に答える
1

これを試して:

DirectoryInfo di = new DirectoryInfo(someValidPath); 
List<FileInfo> myFiles =  
    (
        from file in di.GetFiles("*.txt")
        where file.Extension == ".txt"
        select file
    ).ToList();
于 2011-04-06T21:22:31.603 に答える
1
DirectoryInfo di = new DirectoryInfo(someValidPath);
List<FileInfo> myFiles = new List<FileInfo>();
foreach (FileInfo fi in di.GetFiles("*.txt"))
{
   if (fi.Extension == ".txt")
      myFiles.Add(fi);
}
于 2011-04-06T21:26:01.410 に答える
0

ifを追加して、ファイル名の最後の4文字を確認できませんか?

于 2011-04-06T21:27:26.593 に答える
0

C#2.0を使用している場合簡単ではありませんか?

string fileExtensionFilter = "*.txt";
            DirectoryInfo di = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
            List<FileInfo> myFiles = new List<FileInfo>();
            foreach (FileInfo fi in di.GetFiles(fileExtensionFilter))
            {
                if (fi.Extension == fileExtensionFilter.Substring(1)) myFiles.Add(fi);
            }
于 2011-04-06T21:44:57.623 に答える
0

私はユーザー提供のパターンを持っていたので、他の多くの答えは私に合いませんでした。私はこのより汎用的なソリューションに行き着きました:

public string[] GetFiles(string path, string pattern)
{
    bool lastWildIsHook = false;
    if(pattern.EndsWith("?"))
    {
        pattern = pattern.Substring(0, pattern.Length - 1);
        lastWildIsHook = true;
    }
    var lastWildIndex = Math.Max(pattern.LastIndexOf("*"), pattern.LastIndexOf("?"));
    var endsWith = pattern.Length > lastWildIndex ? pattern.Substring(lastWildIndex + 1) : pattern;
    if(!lastWildIsHook)
        return Directory.GetFiles(path, pattern).Where(p => p.EndsWith(endsWith)).ToArray();
    else
        return Directory.GetFiles(path, pattern).Where(p => p.EndsWith(endsWith) || p.Substring(0, p.Length - 1).EndsWith(endsWith)).ToArray();
}
于 2013-11-21T19:40:02.753 に答える