3

我想拥有扩展名为 xls 和 xlsx 的 Excel 文件,以及来自特定目录的 FileInfo 对象,所以我输入了以下代码

    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:

在 searchPattern 中使用星号通配符(例如“*.txt”)时,扩展名正好是三个字符长时的匹配行为与扩展名长度多于或少于三个字符时的匹配行为不同。文件扩展名正好为三个字符的 searchPattern 返回具有三个或更多字符扩展名的文件,其中前三个字符与 searchPattern 中指定的文件扩展名匹配。具有一个、两个或三个以上字符的文件扩展名的 searchPattern 仅返回具有与 searchPattern 中指定的文件扩展名完全匹配的扩展名的文件。使用问号通配符时,此方法仅返回与指定文件扩展名匹配的文件。例如,给定两个文件,“file1.txt”和“file1.txt”。

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

于 2013-04-29T09:16:00.960 回答
0

This code will work if you're using .NET 4.0 and will improves memory usage when compared to GetFiles():

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

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

Sources:

于 2013-04-29T09:24:29.440 回答
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

如果您不想要隐式不精确匹配,您可以随时回退到 WinAPIPathMatchSpec函数,该函数几乎用于处理系统中的通配符,而不会像 one in 这样的烦恼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 回答