単純な非再帰ハードディスクファイル遍歴プログラム(C#版)

13191 ワード

最近自分でgalgameマネージャのようなものを作っているので、ハードディスク検索に触れました.MSは検索のインタフェースに直接アクセスしてくれませんでしたが、C#にFindFirstFileとFindNextFileを提供してアルゴリズムを構築してくれました.ネット上のいくつかの比較的に効率的なアルゴリズムはすべてこのパッケージを採用して、私自身が書いたこの非再帰ファイル遍歴アルゴリズムはそれほど効率的ではありませんが・・・しかし構想が簡単で、手当たり次第に書くことができて使うことができて、その上効率は受け入れることができて、Systemを採用します.IOの下のDirectoryクラスが持ついくつかの方法.(私のマシンでこのアルゴリズムは7 Wファイルをスキャンするのに15 sかかります)
ソースコードを先に貼り付けます.
 1 public static void getAllDir(string path)
 2         {
 3             //
 4             List<string> folders = new List<string>();
 5 
 6             if (Directory.Exists(path))
 7             {
 8                 folders.Add(path);//    
 9 
10 
11                 while (folders.Count > 0)
12                 {
13                     string[] fileList;//    
14 
15                     //
16                     try
17                     {
18                         fileList = Directory.GetFileSystemEntries(path);
19                     }
20                     catch (System.Exception ex)
21                     {
22                         if (folders.Count > 0)//        
23                         {
24                             folders.RemoveAt(0);//    
25                             path = folders[0];
26                         }
27 
28                         continue;
29                     }
30 
31                     folders.RemoveAt(0);//    
32 
33                     foreach (string file in fileList)
34                     {
35                         if (Directory.Exists(file))
36                         {
37                             //                 
38                             folders.Add(file);
39                         }
40                         else
41                         {
42                             //  
43                             string fileName = Path.GetFileName("@" + file);//     
44 
45                             //        
46                             if (fileName.LastIndexOf('.') != -1)
47                             {
48                                 string exname = fileName.Substring(fileName.LastIndexOf('.') + 1);//     
49                                 Match exnameMatch = Regex.Match(exname, "(exe|iso|rar)");//       
50                                 if (exnameMatch.Success)
51                                 {
52                                     ListViewItem lvi = new ListViewItem();
53                                     ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem();
54 
55                                     //     (    )
56                                     lvi.Text = fileName.Substring(0, fileName.LastIndexOf('.'));
57                                     lvi.Tag = fileName;
58 
59                                     //     (    )
60                                     lvsi.Text = Path.GetFullPath(file);
61                                     lvi.SubItems.Add(lvsi);
62 
63                                     //      
64                                     GV.galFileNameGroup.Add(lvi);
65                                 }
66                             }
67                         }
68                     }
69                     if (folders.Count > 0)//        
70                         path = folders[0];
71                 }
72             }
73         }

全体の構想は1階を見つけた後、ファイルであれば、ファイルの拡張子が規範に合っているかどうかを判断し、合致すれば参加する.フォルダの場合は、すべてのファイルレイヤがスキャンされるまで、そのレイヤに入って判断を続けます.ここでは非再帰方式を採用し、listで現在のレイヤのフォルダを記録し、遭遇したら直接入るのではなくリストに参加し、このレイヤがスキャンされた後、listのフォルダを少しずつ処理し、listが空になるまで処理します.
これにより、ハードディスク(HDD)を巡回することで、各ディスクに対してアルゴリズムを呼び出すことで、ハードディスク(HDD)を巡回することができます.
 1 public static void Refresh()
 2         {
 3             //    
 4             GV.galFileNameGroup = new List<ListViewItem>();
 5 
 6             //             
 7             DriveInfo[] dr = DriveInfo.GetDrives();
 8             foreach (DriveInfo di in dr)
 9             {
10                   if (di.IsReady)
11                       getAllDir(di.ToString());
12             }
13         }