Private Sub SetCheck(Check As Boolean, nodes As TreeNodeCollection) For Each n As TreeNode In nodes n.Checked = Check SetCheck(Check, n.Nodes) Next End Sub
Private Sub SetChildren(baseNode As TreeNode) For Each subDir As String In Directory.GetDirectories(baseNode.FullPath) Dim n As TreeNode = baseNode.Nodes.Add(Path.GetFileName(subDir)) n.Checked = baseNode.Checked Try If Directory.GetDirectories(subDir).Any() Then n.Nodes.Add("NUL") End If Catch ex As Exception End Try Next
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown TreeView1.CheckBoxes = True Dim rootNode As TreeNode = TreeView1.Nodes.Add("C:", "C:\") SetChildren(rootNode) rootNode.Expand() End Sub
Private Sub TreeView1_BeforeExpand(sender As Object, e As TreeViewCancelEventArgs) Handles TreeView1.BeforeExpand
If e.Node.Nodes(0).Text = "NUL" Then e.Node.Nodes.RemoveAt(0) SetChildren(e.Node) End If
End Sub
Private Sub Button0_Click(sender As System.Object, e As System.EventArgs) Handles Button0.Click 'FolderBrowserDialogクラスのインスタンスを作成 Dim fbd As New FolderBrowserDialog 'fbdに表示するテキスト指定 fbd.Description = "バックアップフォルダを選択もしくは作成を行なって下さい" 'ダイアログ表示 If fbd.ShowDialog(Me) = DialogResult.OK Then End If 'TEXTBOX1に表示 TextBox1.Text = fbd.SelectedPath End Sub
Private Sub GetFolders(node As TreeNode) '子ノードをクリア node.Nodes.Clear() '設定されたフォルダの直下のサブフォルダを検索 For Each folder As String In Directory.GetDirectories(node.FullPath) '子ノードを追加 node.Nodes.Add(Path.GetFileName(folder))
If node.Checked Then node.Nodes(node.Nodes.Count - 1).Checked = True End If
Try 'サブフォルダが存在していたらダミーのノードを追加 If Directory.GetDirectories(folder).Count > 0 Then node.Nodes(node.Nodes.Count - 1).Nodes.Add("dmy") End If
Catch ex As Exception End Try Next End Sub
Private Sub GetCopyFolders(node As TreeNode, folders As List(Of String))
'最下層のノードを対象にチェックボックスがオンのノードのフルパスをリストに追加 For Each n As TreeNode In node.Nodes GetCopyFolders(n, folders) Next
'ノードのチェックボックスがオンならリストに追加 If node.Nodes.Count = 0 Then Exit Sub If node.Checked Then folders.Add(node.FullPath) End If
End Sub
Private Sub Button6_Click(sender As System.Object, e As System.EventArgs) Handles Button6.Click
Dim TFolders As New List(Of String)
'バックアップ対象フォルダのリストを取得 For Each node As TreeNode In TreeView1.Nodes(0).Nodes GetCopyFolders(node, TFolders) Next
'バックアップ対象未選択
If TFolders.Count = 0 Then MessageBox.Show("チェック", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning) Exit Sub End If
'バックアップ対象選択済 If MessageBox.Show("コピーを行ないますか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then 'Exit Sub
'「はい」ならバックアップを実行…
For Each srcFolder As String In TFolders
Me.Cursor = Cursors.WaitCursor Try Dim bkFolder As String = System.IO.Path.Combine(TextBox1.Text, Path.GetFileName(srcFolder)) My.Computer.FileSystem.CopyDirectory(srcFolder, bkFolder, FileIO.UIOption.AllDialogs)
Catch ex As Exception MessageBox.Show(srcFolder & vbCrLf & "コピー失敗", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning) Me.Cursor = Cursors.Default Exit Sub End Try Next
'「いいえ」ならメッセージ表示… ElseIf Windows.Forms.DialogResult.No Then MessageBox.Show("コピー不可", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning) End If
End Sub
Private Sub Button9_Click(sender As System.Object, e As System.EventArgs) Handles Button9.Click 'TREEVIEWチェックを外す For Each node As TreeNode In TreeView1.Nodes(0).Nodes node.Checked = False Next node
たとえば、サブフォルダの存在を確認する部分で > If Directory.GetDirectories(subDir).Any() Then > If Directory.GetDirectories(folder).Count > 0 Then のような表記揺れが見られ、コードに一貫性がありません。
> '「いいえ」ならメッセージ表示… > ElseIf Windows.Forms.DialogResult.No Then
判定方法が間違っています。
こういう場合は、メッセージボックスの結果を変数に受け取り、 その値と比較するようにしましょう。
Dim 変数 = MessageBox.Show("コピーを行ないますか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) If 変数 = System.Windows.Forms.DialogResult.Yes Then '…… ElseIf 変数 = Windows.Forms.DialogResult.No Then '…… End If
Private Sub SampleButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles SampleButton.Click ListBox1.Items.Clear() EnumCheckedPath(TreeView1.Nodes(0)) End Sub
Private Sub Form1_Notice(ByVal sourceDir As String) Handles Me.Notice '実際には ListBox に表示するのではなく、 'このフォルダーにあるファイル群をコピーするための処理を記述します ListBox1.Items.Add(sourceDir) End Sub
Public Sub EnumCheckedPath(ByVal node As TreeNode) If node Is Nothing Then Throw New ArgumentNullException("node") End If
'チェックがついていれば、コピー対象として通知します If node.Checked AndAlso node.Text <> "NUL" Then RaiseEvent Notice(node.FullPath)
'チェック付きノードの下に NUL マーカーがあった場合は '下位のフォルダーもチェックが付いているものとみなして、 'サブディレクトリすべてを列挙します If Not node.FirstNode Is Nothing AndAlso node.FirstNode.Text = "NUL" Then Try For Each subDir In Directory.GetDirectories(node.FullPath, "*", SearchOption.AllDirectories) RaiseEvent Notice(subDir) Next Catch End Try End If End If
For Each subNode As TreeNode In node.Nodes EnumCheckedPath(subNode) Next End Sub