快速遍历文件与目录相关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 }
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 }