4

需要搜索目录/子目录以查找文件,希望它在找到后停止。

这是我缺少的 DirectoryInfo.GetFiles 内置的功能,还是应该使用其他功能(自我实现的递归搜索)?

4

3 回答 3

13

使用DirectoryInfo.EnumerateFiles()它来懒惰地返回文件(而不是首先GetFiles将完整文件列表放入内存) - 您可以添加FirstOrDefault()以实现您想要的:

var firstTextFile = new DirectoryInfo(someDirectory).EnumerateFiles("*.txt")
                                                    .FirstOrDefault();

来自 MSDN:

EnumerateFiles 和 GetFiles 方法的区别如下: 使用 EnumerateFiles 时,可以在返回整个集合之前开始枚举 FileInfo 对象的集合;使用 GetFiles 时,必须等待返回整个 FileInfo 对象数组,然后才能访问该数组。因此,当您处理许多文件和目录时,EnumerateFiles 会更有效。

DirectoryInfo.EnumerateFiles需要 .NET 4.0)

于 2012-02-02T22:10:47.500 回答
4

用于 pre-.NET 4.0 的最佳方法,使用FindFirstFile()

    [DllImport("kernel32", CharSet = CharSet.Unicode)]
    public static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData);

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool FindClose(IntPtr hFindFile);

    public void findFile()
    {
        WIN32_FIND_DATA findData;
        var findHandle = FindFirstFile(@"\\?\" + directory + @"\*", out findData);
        FindClose(findHandle);
    }

需要这个结构

    //Struct layout required for FindFirstFile
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    struct WIN32_FIND_DATA
    {
        public uint dwFileAttributes;
        public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime;
        public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime;
        public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime;
        public uint nFileSizeHigh;
        public uint nFileSizeLow;
        public uint dwReserved0;
        public uint dwReserved1;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string cFileName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
        public string cAlternateFileName;
    }
于 2012-02-02T22:14:31.350 回答
0

您是否尝试过 DirectoryInfo.GetFiles([Your Pattern], SearchOption.AllDirectories).First();

于 2012-02-02T22:13:00.250 回答