3

特定のディレクトリの FileInfo オブジェクトを使用して、拡張子が xls および xlsx の Excel ファイルが必要なため、次のコードを配置します。

    System.IO.FileInfo[] files = null;
        System.IO.DirectoryInfo dirInfo;

        dirInfo = new System.IO.DirectoryInfo(this.tbFolderTo.Text);

        string[] extensions = new[] { "*.xls", "*.xlsx" };
        List<string> _searchPatternList = new List<string>(extensions);            
        List<string> fileList = new List<string>();
        foreach (string ext in _searchPatternList)
        {
            foreach (string subFile in Directory.GetFiles(this.tbFolderTo.Text, ext))
            {
                fileList.Add(subFile);
            }
        }

        foreach (string file in fileList)
        {
            this.lbFileNamesTo.Items.Add(file);
        }

しかし、 filexp2.xlsq や filexp.xlsa のような偽のファイルでテストすることによる問題は、リスト ボックスにこれらのファイルが表示され、見つかったファイルのリストが表示されます。コードでは、拡張子を xls と xlsx に制限しています。結果のこれらのファイル

その結果、私が入れたコードとこのコードの間に違いは見られません

        System.IO.FileInfo[] files = null;
        System.IO.DirectoryInfo dirInfo;

        dirInfo = new System.IO.DirectoryInfo(this.tbFolderTo.Text);
        files = dirInfo.GetFiles("*.xls*");

手伝ってくれてありがとう

4

4 に答える 4

10

MSDN から:

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

http://msdn.microsoft.com/it-it/library/wz42302f.aspx

于 2013-04-29T09:16:00.960 に答える
0

暗黙の不正確な一致が必要ない場合はPathMatchSpec、システム全体でワイルドカードを処理するためにほとんど使用される WinAPI 関数にいつでもフォールバックできますDirectory.GetFiles

public static class DirectoryEx
{
    [DllImport("shlwapi.dll", CharSet = CharSet.Auto)]
    private static extern bool PathMatchSpec(string file, string spec);

    public static IEnumerable<string> GetFilesExact(string path, string searchPattern)
    {
        var files = Directory.GetFiles(path, searchPattern).ToList();
        foreach (var file in files)
        {
            if (PathMatchSpec(file, searchPattern))
            {
                yield return file;
            }
        }
    }
}

そうすれば、ワイルドカードを引き続き使用できますが、予測可能な方法で使用できます。したがって、内側のループを次のように変更します。

foreach (string subFile in DirectoryEx.GetFilesExact(this.tbFolderTo.Text, ext))
{
    fileList.Add(subFile);
}

そして、あなたは行ってもいいです。

于 2013-04-29T09:39:25.500 に答える
0

@qwertoyo が MSDN からのメモを正確に引用して、問題が発生した理由を示しているので、別の解決策を提供しようと思いました。

ディレクトリ内のすべてのファイルを列挙し (EnumerateFiles代わりに使用することによりGetFiles、ディレクトリ全体を待つ必要はありません)、要件に一致するファイルのみを抽出できます。

string[] extensions = new[] { ".xls", ".xlsx" };
var excelFiles = Directory.EnumerateFiles(this.tbFolderTo.Text)
                     .Where(f => extensions.Contains(File.GetExtension(f)));

.NET 3.5 以前を使用している場合は、GetFilesソリューションにフォールバックする必要がありますが、ディレクトリが大きいと遅くなります!

string[] extensions = new[] { ".xls", ".xlsx" };
var excelFiles = Directory.GetFiles(this.tbFolderTo.Text)
                     .Where(f => extensions.Contains(Path.GetExtension(f)));
于 2013-04-29T09:20:54.560 に答える
0

このコードは、.NET 4.0 を使用している場合に機能し、以下に比べてメモリ使用量が改善されますGetFiles()

string[] patterns = new { ".xls", ".xlsx" };

return patterns.AsParallel().SelectMany(p => 
    Directory.EnumerateFiles(path, p, SearchOption.AllDirectories));

ソース:

于 2013-04-29T09:24:29.440 に答える