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