需要搜索目錄/子目錄以查找文件,希望一旦找到文件就停下來。如何使用DirectoryInfo.GetFiles並找到第一場比賽後停止?
這是一個內置於DirectoryInfo.GetFiles中的功能,我缺少該功能,還是應該使用其他功能(自我實現的遞歸搜索)?
需要搜索目錄/子目錄以查找文件,希望一旦找到文件就停下來。如何使用DirectoryInfo.GetFiles並找到第一場比賽後停止?
這是一個內置於DirectoryInfo.GetFiles中的功能,我缺少該功能,還是應該使用其他功能(自我實現的遞歸搜索)?
使用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)
你試過DirectoryInfo.GetFiles([你的模式],SearchOption.AllDirectories)。首先();
的最好方法用於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;
}
需要4.0,但我+1你也是一個很好的答案,希望它能幫助其他人以及 – RiddlerDev 2012-02-03 14:59:39
哇!這是一個很好的答案! – 2012-07-11 20:42:04
對於和下面.NET 3.5,使用用FindFirstFile(),如圖我的例子如下。 – Corylulu 2012-02-02 22:36:29