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

需要搜索目录/子目录以查找文件,更愿意在找到文件后停止。

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

使用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)

用于.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; } 

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