0

ディレクトリ「C:\temp」には、「GZ96A7005.tif」と「GZ96A7005001.tif」という名前の 2 つのファイルがあります。それらは同じ拡張子で長さが異なります。今、私は以下のコードを実行します:

string[] resultFileNames = Directory.GetFiles(@"C:\temp", "????????????.tif");

「resultFileNames」は、「c:\temp\GZ96A7005.tif」と「c:\temp\GZ96A7005001.tif」の 2 つのアイテムを返します。ただし、ウィンドウ検索は正常に機能します。これが理由であり、どのように私は欲しいですか?

代替テキスト

4

4 に答える 4

7

Directory.GetFilesの場合、?「正確に0または1文字」を意味します。一方、DirectoryInfo.GetFilesを使用することもできますが、これには?「正確に1文字」(明らかにあなたが望むもの)を意味します。

編集:

完全なコード:

string[] resultFileNames = (from fileInfo in new DirectoryInfo(@"C:\temp").GetFiles("????????????.tif") select fileInfo.Name).ToArray();

おそらくToArrayをスキップして、resultFileNamesを。にすることができますIEnumerable<string>

人々は、これがMS.NETでは機能しないと報告しています。以下の正確なコードは、UbuntuHardyのMonoで動作します。2つの関連するクラスに異なる規則を使用させることは実際には意味がないことに同意します。ただし、それはドキュメント(上記のリンク)が言っていることであり、Monoはドキュメントに準拠しています。Microsoftの実装にない場合は、バグがあります。

using System;
using System.IO;
using System.Linq;

public class GetFiles
{
    public static void Main()
    {
        string[] resultFileNames = (from fileInfo in new DirectoryInfo(@".").GetFiles("????????????.tif") select fileInfo.Name).ToArray();
        foreach(string fileName in resultFileNames)
        {
            Console.WriteLine(fileName);
        }
    }
}
于 2009-06-08T02:55:17.017 に答える
5

これについては以前どこかで読んだことがあると思いますが、現時点で見つけた最良の情報は、Raymond Chen のブログ投稿での参照でした。ポイントは、下位互換性のために、Windows が長いファイル名を持つすべてのファイルに対して短い (8.3) ファイル名を保持し、ファイル名のワイルドカードが長いファイル名と短いファイル名の両方に対して一致することです。コマンド プロンプトを開いて " " を実行すると、これらの短いファイル名を確認できますdir /x。通常、????????.tif(8) に一致するファイルのリストを取得すると、ファイル名が 8 文字以下で拡張子が .tif のファイルのリストが返されます。ただし、長いファイル名を持つすべてのファイルには、8.3 文字の短いファイル名も含まれているため、すべてこのフィルターに一致します

あなたの場合、両方ともGZ96A7005.tif長いGZ96A7005001.tifファイル名であるため、両方とも一致する8.3の短いファイル名を持っています????????.tif(8つ以上?のもの)。

更新... MSDNから:

このメソッドは、8.3 ファイル名形式と長いファイル名形式の両方でファイル名をチェックするため、" *1*.txt" のような検索パターンでは、予期しないファイル名が返される場合があります。たとえば、" " の検索パターンを使用すると、" *1*.txt" が返されますlongfilename.txt。これは、同等の 8.3 ファイル名形式が " LONGFI~1.TXT" であるためです。


更新: MSDN のドキュメントでは?、Directory.GetFiles() と DirectoryInfo.GetFiles() の " " ワイルドカードに対して異なる動作を指定しています。ただし、ドキュメントは間違っているようです。Matthew Flaschen の回答を参照してください。

于 2009-06-08T04:26:54.327 に答える
1

?文字は「0または1」の文字と一致します...したがって、検索パターンは、0〜12文字の長さの「.tif」で終わるすべてのファイルと一致すると思います。

拡張子が「.tif」の3文字しかない別のファイルをドロップしてみて、コードがそれを取得するかどうかを確認してください。私はそれがそうなるだろうというこっそりの疑いを持っています;)

Windowsサーチに関する限り、内部で同じアルゴリズムを使用していないことは間違いありません。?文字の意味は、Directory.GetFiles(string、string)メソッドの.Net検索パターン仕様とは大きく異なる場合があります。

于 2009-06-08T02:53:49.313 に答える
0
string path = "C:/";
var files = Directory.GetFiles(path)
    .Where(f => f.Replace(path, "").Length == 8);

弦交換の費用が少しかかります。必要な拡張機能を追加できます。

于 2009-06-08T03:45:20.133 に答える