99

重複の可能性:
複数のフィルターを使用してDirectory.GetFiles()を呼び出すことはできますか?

複数の拡張機能をどのようにフィルタリングしますか?

私はもう試した:

FileInfo[] Files = dinfo.GetFiles("*.jpg;*.tiff;*.bmp");
FileInfo[] Files = dinfo.GetFiles("*.jpg,*.tiff,*.bmp");
4

7 に答える 7

75

拡張メソッドを作成してみませんか?それはもっと読みやすいです。

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions)
{
    if (extensions == null) 
         throw new ArgumentNullException("extensions");
    IEnumerable<FileInfo> files = Enumerable.Empty<FileInfo>();
    foreach(string ext in extensions)
    {
       files = files.Concat(dir.GetFiles(ext));
    }
    return files;
}

編集:より効率的なバージョン:

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions)
{
    if (extensions == null) 
         throw new ArgumentNullException("extensions");
    IEnumerable<FileInfo> files = dir.EnumerateFiles();
    return files.Where(f => extensions.Contains(f.Extension));
}

使用法:

DirectoryInfo dInfo = new DirectoryInfo(@"c:\MyDir");
dInfo.GetFilesByExtensions(".jpg",".exe",".gif");
于 2010-08-20T02:15:09.323 に答える
72

すべてのファイルを取得してから、配列をフィルタリングできます。

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dirInfo, params string[] extensions)
{
    var allowedExtensions = new HashSet<string>(extensions, StringComparer.OrdinalIgnoreCase);

    return dirInfo.EnumerateFiles()
                  .Where(f => allowedExtensions.Contains(f.Extension));
}

これは、ここでの他のすべての回答よりも(わずかに)速くなります。
.Net 3.5では、(遅い)に置き換えEnumerateFilesますGetFiles

そして、次のように使用します。

var files = new DirectoryInfo(...).GetFilesByExtensions(".jpg", ".mov", ".gif", ".mp4");
于 2010-11-08T13:53:57.983 に答える
58

GetFiles単一の検索パターンしか受け入れないため、これを行うことはできません。代わりに、GetFilesパターンなしで呼び出し、結果をコードでフィルタリングできます。

string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };

FileInfo[] files =
    dinfo.GetFiles()
         .Where(f => extensions.Contains(f.Extension.ToLower()))
         .ToArray();

.NET 4を使用している場合は、このEnumerateFilesメソッドを使用して、メモリ内のすべてのFileInfoオブジェクトを一度にロードしないようにすることができます。

string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };

FileInfo[] files =
    dinfo.EnumerateFiles()
         .Where(f => extensions.Contains(f.Extension.ToLower()))
         .ToArray();
于 2010-08-20T00:12:13.967 に答える
23

LINQUnionメソッドを使用できます。

dir.GetFiles("*.txt").Union(dir.GetFiles("*.jpg")).ToArray();
于 2011-08-17T18:21:37.180 に答える
7

以下は、jpg、tiff、およびbmpファイルを取得し、IEnumerable<FileInfo>反復できるオーバーを提供します。

var files = dinfo.GetFiles("*.jpg")
    .Concat(dinfo.GetFiles("*.tiff"))
    .Concat(dinfo.GetFiles("*.bmp"));

本当に配列が必要な場合は.ToArray()、この最後に固執するだけです。

于 2010-08-20T00:15:18.210 に答える
3

それが可能かどうかはわかりません。MSDN GetFilesリファレンスには、検索パターンのリストではなく、検索パターンが記載されています。

各リストを個別にフェッチして、最終的なリストに「foreach」する傾向があるかもしれません。

于 2010-08-20T00:08:06.983 に答える
0

私はこれを行うためのよりエレガントな方法があることを知っています、そして私は提案を受け入れています...これは私がしたことです:

          try
            {


             // Set directory for list to be made of
                DirectoryInfo jpegInfo = new DirectoryInfo(destinationFolder);
                DirectoryInfo jpgInfo = new DirectoryInfo(destinationFolder);
                DirectoryInfo gifInfo = new DirectoryInfo(destinationFolder);
                DirectoryInfo tiffInfo = new DirectoryInfo(destinationFolder);
                DirectoryInfo bmpInfo = new DirectoryInfo(destinationFolder);

                // Set file type
                FileInfo[] Jpegs = jpegInfo.GetFiles("*.jpeg");
                FileInfo[] Jpgs = jpegInfo.GetFiles("*.jpg");
                FileInfo[] Gifs = gifInfo.GetFiles("*.gif");
                FileInfo[] Tiffs = gifInfo.GetFiles("*.tiff");
                FileInfo[] Bmps = gifInfo.GetFiles("*.bmp");

        //  listBox1.Items.Add(@"");  // Hack for the first list item no preview problem
        // Iterate through each file, displaying only the name inside the listbox...
        foreach (FileInfo file in Jpegs)
        {
                listBox1.Items.Add(file.Name);
                Photo curPhoto = new Photo();
                curPhoto.PhotoLocation = file.FullName;
                metaData.AddPhoto(curPhoto);
            }

          foreach (FileInfo file in Jpgs)
          {
              listBox1.Items.Add(file.Name);
                Photo curPhoto = new Photo();
                curPhoto.PhotoLocation = file.FullName;
                metaData.AddPhoto(curPhoto);
            }
          foreach (FileInfo file in Gifs)
          {
              listBox1.Items.Add(file.Name);
              Photo curPhoto = new Photo();
              curPhoto.PhotoLocation = file.FullName;
              metaData.AddPhoto(curPhoto);
          }
          foreach (FileInfo file in Tiffs)
          {
              listBox1.Items.Add(file.Name);
              Photo curPhoto = new Photo();
              curPhoto.PhotoLocation = file.FullName;
              metaData.AddPhoto(curPhoto);
          }
          foreach (FileInfo file in Bmps)
          {
              listBox1.Items.Add(file.Name);
              Photo curPhoto = new Photo();
              curPhoto.PhotoLocation = file.FullName;
              metaData.AddPhoto(curPhoto);
          }
于 2010-08-20T01:37:36.130 に答える