C# 如何使用DirectoryInfo.GetFiles并在找到第一个匹配项后使其停止?

C# 如何使用DirectoryInfo.GetFiles并在找到第一个匹配项后使其停止?,c#,getfiles,file-search,C#,Getfiles,File Search,需要搜索目录/子目录以查找文件,希望在找到文件后立即停止 这是我缺少的DirectoryInfo.GetFiles中内置的功能,还是我应该使用其他功能(自我实现的递归搜索)?使用延迟返回文件的功能(而不是先将完整文件列表放入内存的GetFiles)-您可以添加FirstOrDefault()要实现您的目标: var firstTextFile = new DirectoryInfo(someDirectory).EnumerateFiles("*.txt")

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

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

使用延迟返回文件的功能(而不是先将完整文件列表放入内存的
GetFiles
)-您可以添加
FirstOrDefault()
要实现您的目标:

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

EnumerateFiles和GetFiles方法的区别如下: 使用EnumerateFiles,可以开始枚举 返回整个集合之前的FileInfo对象;当你使用 GetFiles,您必须等待整个FileInfo对象数组被删除 在您可以访问阵列之前返回。因此,当你 使用许多文件和目录时,枚举文件可能会更复杂 效率高


DirectoryInfo.EnumerateFiles
需要.NET 4.0)

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

在.NET 4.0之前使用的最佳方法是使用

需要此结构

    //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;
    }

对于.NET 3.5及以下版本,请使用FindFirstFile(),如我下面的示例所示。对于递归搜索,正如主题初学者所提到的,只需使用搜索选项来实现方法:EnumerateFiles(“*.txt”,SearchOption.AllDirectory)需要4.0,但我+1您也需要一个很好的答案,希望它也能在这方面帮助其他人
    //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;
    }