2012-02-02 85 views

回答

12

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

+0

對於和下面.NET 3.5,使用用FindFirstFile(),如圖我的例子如下。 – Corylulu 2012-02-02 22:36:29

0

你試過DirectoryInfo.GetFiles([你的模式],SearchOption.AllDirectories)。首先();

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; 
    } 
+0

需要4.0,但我+1你也是一個很好的答案,希望它能幫助其他人以及 – RiddlerDev 2012-02-03 14:59:39

+1

哇!這是一個很好的答案! – 2012-07-11 20:42:04

相關問題