2017年2月15日水曜日

VB.NET:フォルダ優先で一覧を表示させる

ファイル・フォルダ一覧のパスがあるけどフォルダを優先して出したい。
深さ優先探索みたいなソートを再帰無しで書きたい。
そんなときに!

下のコードの表示先はListBox1だから気を付けてね。

やってることは簡単で、
符号の順序を利用してソートすれば、
再帰的なソートを必要とするモノでも再帰コード書かなくていいよ、速いよって事。

並び替えるモノを符号化してソートすると意外と簡単にできたりする。
もちろん一旦符号化しないといけないからその分の時間は掛かるけどね。

Dim folders As String() = System.IO.Directory.GetDirectories("C:\hogehoge\", "*", 1)
Dim files As String() = System.IO.Directory.GetFiles("C:\hogehoge", "*", 1)

'ソート
Array.Sort(folders)
Array.Sort(files)


'見つけたものを次々に符号化
Dim 符号リスト As New Hashtable
Dim パス As String
Dim ノードリスト As String()
Dim ノード As String
Dim インデックス As Int32 = 0
For Each パス In folders
  ノードリスト = パス.Split("\"c)
  For Each ノード In ノードリスト
If Not 符号リスト.ContainsKey(ノード) Then
  符号リスト(ノード) = "," & インデックス.ToString("D6")
  インデックス += 1
End If
  Next
Next
For Each パス In files
  Dim ファイルデータ = New System.IO.FileInfo(パス)
  ノードリスト = パス.Split("\"c)
  For Each ノード In ノードリスト
If ノード = ファイルデータ.Name Then
  符号リスト(ノード) = "-" & インデックス.ToString("D6")
  インデックス += 1
ElseIf Not 符号リスト.ContainsKey(ノード) Then
  符号リスト(ノード) = "," & インデックス.ToString("D6")
  インデックス += 1
End If
  Next
Next



'ソートリストを用意
Dim sss As New SortedList(Of String, String)
Dim aaa As New Text.StringBuilder



'Keyは符号化したやつ、
For Each パス In folders
  ノードリスト = パス.Split("\"c)
  aaa.Clear()
  For Each ノード In ノードリスト
aaa.Append(符号リスト(ノード))
  Next
  sss.Add(aaa.ToString, パス)
Next
For Each パス In files
  Dim ファイルデータ = New System.IO.FileInfo(パス)
  ノードリスト = パス.Split("\"c)
  aaa.Clear()
  For Each ノード In ノードリスト
aaa.Append(符号リスト(ノード))
  Next
  sss.Add(aaa.ToString, パス)
Next


For Each パス In sss.Values
  ListBox1.Items.Add(パス)
Next