8

Directory.GetFiles(LocalFilePath, searchPattern);

MSDN ノート:

".txt」の場合、拡張子がちょうど 3 文字の長さである場合の一致動作は、拡張子が 3 文字より多い場合と短い場合とでは異なります。正確に 3 文字のファイル拡張子を持つ searchPattern は、3 文字以上の拡張子を持つファイルを返します。ここで、最初の 3 文字は、searchPattern で指定されたファイル拡張子と一致します。1 文字、2 文字、または 3 文字を超えるファイル拡張子を持つ searchPattern は、searchPattern で指定されたファイル拡張子と正確に一致する長さの拡張子を持つファイルのみを返します。疑問符のワイルドカード文字を使用する場合、このメソッドは、指定されたファイル拡張子に一致するファイルのみを返します. たとえば、ディレクトリ内に "file1.txt" と "file1.txtother" という 2 つのファイルがある場合、"file? 。TXT"最初のファイルだけを返しますが、「ファイル」の検索パターンは.txt" は両方のファイルを返します。

次のリストは、searchPattern パラメーターのさまざまな長さの動作を示しています。

  • *.abc、、、、などの拡張子を持つファイルを返し.abcます。.abcd.abcde.abcdef

  • *.abcdは、拡張子が のファイルのみを返します.abcd

  • *.abcdeは、拡張子が のファイルのみを返します.abcde

  • *.abcdefは、拡張子が のファイルのみを返します.abcdef

searchPatternパラメータが に設定されている場合、拡張子がではなくなど*.abcのファイルを返すにはどうすればよいですか?.abc.abcd.abcde

たぶん、この機能はうまくいくでしょう:

    private bool StriktMatch(string fileExtension, string searchPattern)
    {
        bool isStriktMatch = false;

        string extension = searchPattern.Substring(searchPattern.LastIndexOf('.'));

        if (String.IsNullOrEmpty(extension))
        {
            isStriktMatch = true;
        }
        else if (extension.IndexOfAny(new char[] { '*', '?' }) != -1)
        {
            isStriktMatch = true;
        }
        else if (String.Compare(fileExtension, extension, true) == 0)
        {
            isStriktMatch = true;
        }
        else
        {
            isStriktMatch = false;
        }

        return isStriktMatch;
    }

テストプログラム:

class Program
{
    static void Main(string[] args)
    {
        string[] fileNames = Directory.GetFiles("C:\\document", "*.abc");

        ArrayList al = new ArrayList();

        for (int i = 0; i < fileNames.Length; i++)
        {
            FileInfo file = new FileInfo(fileNames[i]);
            if (StriktMatch(file.Extension, "*.abc"))
            {
                al.Add(fileNames[i]);
            }
        }

        fileNames = (String[])al.ToArray(typeof(String));

        foreach (string s in fileNames)
        {
            Console.WriteLine(s);
        }

        Console.Read();
    }

他にもっと良い解決策はありますか?

4

5 に答える 5

10

答えは、ポスト フィルタリングを行う必要があるということです。GetFiles だけではできません。結果を後処理する例を次に示します。これにより、GetFiles で検索パターンを使用することも、使用しないこともできます。どちらの方法でも機能します。

List<string> fileNames = new List<string>();
// populate all filenames here with a Directory.GetFiles or whatever

string srcDir = "from"; // set this
string destDir = "to"; // set this too

// this filters the names in the list to just those that end with ".doc"
foreach (var f in fileNames.All(f => f.ToLower().EndsWith(".doc")))
{
    try
    {
        File.Copy(Path.Combine(srcDir, f), Path.Combine(destDir, f));
    }
    catch { ... }
}
于 2009-01-13T04:08:08.010 に答える
5

バグではなく、ひねくれた動作ですが、十分に文書化されています。*.doc は、8.3 フォールバック ルックアップに基づいて *.docx と一致します。

doc で終わる結果を手動で事後フィルター処理する必要があります。

于 2009-01-13T04:05:00.327 に答える
0

これは短期的には役に立ちませんが、この問題についてMS Connectの投稿に投票すると、将来的に状況が変わる可能性があります。

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=95415

于 2009-01-13T10:08:11.590 に答える
0

"*.abc" の場合、GetFiles は 3 つ以上の拡張子を返すため、"." の後に長さが 3 の拡張子が返されます。は完全に一致し、それより長いものは一致しません。

string[] fileList = Directory.GetFiles(path, "*.abc");

foreach (string file in fileList)
{
   FileInfo fInfo = new FileInfo(file);

   if (fInfo.Extension.Length == 4) // "." is counted in the length
   {
      // exact extension match - process the file...
   }
}

上記のパフォーマンスについては不明です。文字列操作ではなく単純な長さの比較を使用していますが、ループのたびに new FileInfo() が呼び出されます。

于 2009-01-13T11:12:02.383 に答える
0

linqを使用してください....

    string strSomePath = "c:\\SomeFolder";
string strSomePattern = "*.abc";
string[] filez = Directory.GetFiles(strSomePath, strSomePattern);

var filtrd = from f in filez
         where f.EndsWith( strSomePattern )
         select f;

foreach (string strSomeFileName in filtrd)
{
    Console.WriteLine( strSomeFileName );
}
于 2009-01-13T07:06:07.340 に答える