快速遍历文件与目录相关API
1 class Program 2 { 3 static void Main( string[] args) 4 { 5 DateTime mytime = DateTime.Now; 6 Program myProgram = new Program(); 7 myProgram.FindFileInDir( @" \\172.20.1.10\BOM表\ "); 8 Console.WriteLine(DateTime.Now.Subtract(mytime).Seconds); 9 } 10 11 12 [Serializable,System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential,CharSet = System.Runtime.InteropServices.CharSet.Auto),System.Runtime.InteropServices.BestFitMapping( false)] 13 private struct WIN32_FIND_DATA 14 { 15 public int dwFileAttributes; 16 public int ftCreationTime_dwLowDateTime; 17 public int ftCreationTime_dwHighDateTime; 18 public int ftLastAccessTime_dwLowDateTime; 19 public int ftLastAccessTime_dwHighDateTime; 20 public int ftLastWriteTime_dwLowDateTime; 21 public int ftLastWriteTime_dwHighDateTime; 22 public int nFileSizeHigh; 23 public int nFileSizeLow; 24 public int dwReserved0; 25 public int dwReserved1; 26 [System.Runtime.InteropServices.MarshalAs 27 (System.Runtime.InteropServices.UnmanagedType.ByValTStr, 28 SizeConst = 260)] 29 public string cFileName; 30 [System.Runtime.InteropServices.MarshalAs 31 (System.Runtime.InteropServices.UnmanagedType.ByValTStr, 32 SizeConst = 14)] 33 public string cAlternateFileName; 34 } 35 [System.Runtime.InteropServices.DllImport( " kernel32.dll ", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)] 36 private static extern IntPtr FindFirstFile( string pFileName, ref WIN32_FIND_DATA pFindFileData); 37 [System.Runtime.InteropServices.DllImport( " kernel32.dll ", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)] 38 private static extern bool FindNextFile(IntPtr hndFindFile, ref WIN32_FIND_DATA lpFindFileData); 39 [System.Runtime.InteropServices.DllImport( " kernel32.dll ", SetLastError = true)] 40 private static extern bool FindClose(IntPtr hndFindFile); 41 42 // 具体方法函数 43 44 Stack< string> m_scopes = new Stack< string>(); 45 private static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(- 1); 46 WIN32_FIND_DATA FindFileData; 47 private System.IntPtr hFind = INVALID_HANDLE_VALUE; 48 void FindFileInDir( string rootDir) 49 { 50 int count = 0; 51 string path = rootDir; 52 start: 53 new FileIOPermission(FileIOPermissionAccess.PathDiscovery, Path.Combine(path, " . ")).Demand(); 54 if (path[path.Length - 1] != ' \\ ') 55 { 56 path = path + " \\ "; 57 } 58 // Console.WriteLine("文件夹为:" + path + "<br>"); 59 hFind = FindFirstFile(Path.Combine(path, " * "), ref FindFileData); 60 if (hFind != INVALID_HANDLE_VALUE) 61 { 62 do 63 { 64 if (FindFileData.cFileName.Equals( @" . ") || FindFileData.cFileName.Equals( @" .. ")) 65 continue; 66 if ((FindFileData.dwFileAttributes & 0x10) != 0) 67 { 68 m_scopes.Push(Path.Combine(path, FindFileData.cFileName)); 69 } 70 else 71 { 72 Regex mygex = new Regex( " ^.*5233.*\\.xls$ "); 73 if (mygex.IsMatch(FindFileData.cFileName)) 74 { 75 Console.WriteLine(path + " \\ " + FindFileData.cFileName); 76 count = count + 1; 77 } 78 } 79 } 80 while (FindNextFile(hFind, ref FindFileData)); 81 } 82 FindClose(hFind); 83 if (m_scopes.Count > 0) 84 { 85 path = m_scopes.Pop(); 86 goto start; 87 } 88 89 Console.WriteLine(count.ToString()); 90 } 91 }