ファイルをバイナリ形式で表示する (C#/VB Winow Form編)
ディレクトリツリーの表示は System.Windows.Forms.TreeViewクラス側で行いますので、アプリケーションとしてはツリーの各ノードにディレクトリ名を登録していくことになります。
ツリーのルートノード(最上位のノード)には、コンピュータ名を登録します。
コンピュータ名のすぐ下のノードには、接続されているドライブ名(ドライブレター)を登録します。
各ドライブ名の下のノードが、それぞれのドライブのディレクトリ構造をツリーで登録します。
ルートノードを作成してコンピュータ名をディレクトリツリーに登録します。
C# ソースコード [FileTreeView.cs]
// -----------------------------------------------------------------------
/// <summary>
/// コンピュータ名をツリーのルートノードにセットする.
/// </summary>
/// <returns>
/// 生成したルートノード.
/// </returns>
private TreeNode AddRootNode()
{
//! コンピュータ名をディレクトリツリーのルートに登録する.
var root = new TreeNode( Environment.MachineName );
//! コンピュータ名をツリーのルートノードにセットする.
FileTree.Nodes.Add( root );
return root;
}
VB ソースコード [FileTreeView.vb]
'' -----------------------------------------------------------------------
''' <summary>
''' コンピュータ名をツリーのルートノードにセットする.
''' </summary>
''' <returns>
''' 生成したルートノード.
''' </returns>
Private Function AddRootNode() As TreeNode
' コンピュータ名をディレクトリツリーのルートに登録する.
Dim root As new TreeNode( Environment.MachineName )
' コンピュータ名をツリーのルートノードにセットする.
FileTree.Nodes.Add( root )
Return root
End Function
コンピュータ名は Environment.MachineName から取得します。
取得したコンピュータ名を引数にしてツリーのノードを生成します。
生成したノードをツリービューに登録します。
Directory.GetLogicalDrives()を呼び出して、コンピュータに接続されている論理ドライブのリストを取得します。
foreach()ループで回しながらドライブ名リストからドライブ名の文字列を取り出します。
取り出したドライブ名の最後にセパレータ文字「\」が付いているので、これを取り除いてツリーに登録します。
さらにドライブのルートディレクトリが存在する場合は、ドライブのノードに子ノードを追加してドライブのノードが展開できるようにします。
C# ソースコード [FileTreeView.cs]
// -----------------------------------------------------------------------
/// <summary>
/// ディレクトリツリーにドライブ名を登録する.
/// </summary>
/// <param name="root">
/// ディレクトリツリーのルートノード.
/// </param>
private void AddDriveName( TreeNode root )
{
//! 論理ドライブ名をすべて取得する.
string[] stDrives = Directory.GetLogicalDrives();
//! 取得した論理ドライブ名をすべて表示する.
foreach( var drive in stDrives ){
//! ドライブ名をの最後にあるセパレータ("\")を取り除く.
var drvname = drive.Substring( 0, drive.Length - 1 );
//! ドライブ名をディレクトリツリーに登録する.
var drvnode = new TreeNode( drvname );
root.Nodes.Add( drvnode );
//! ドライブ名直下のディレクトリが存在するかを調べる.
AddDirectory( drvnode, drive, true );
}
}
VB ソースコード [FileTreeView.vb]
'' -----------------------------------------------------------------------
''' <summary>
''' ディレクトリツリーにドライブ名を登録する.
''' </summary>
''' <param name="root">
''' ディレクトリツリーのルートノード.
''' </param>
Private Sub AddDriveName( root As TreeNode )
' 論理ドライブ名をすべて取得する.
Dim stDrives() As String = System.IO.Directory.GetLogicalDrives()
' 取得した論理ドライブ名をすべて表示する.
For Each drive As String In stDrives
' ドライブ名をの最後にあるセパレータ("\")を取り除く.
Dim drvname = drive.Substring( 0, drive.Length - 1 )
' ドライブ名をディレクトリツリーに登録する.
Dim drvnode As New TreeNode( drvname )
root.Nodes.Add( drvnode )
' ドライブ名直下のディレクトリが存在するかを調べる.
AddDirectory( drvnode, drive, true )
Next
End Sub
Directory.GetDirectories()を呼び出して、引数で指定されたディレクトリにあるファイル情報のリストを取得します。
public static string[] GetDirectories ( string path );
引数 | 説明 |
---|---|
path | 検索するディレクトリの相対パスまたは絶対パス。 |
戻り値 | 指定したパス内のサブディレクトリの絶対パスの配列。 |
foreach()ループで回しながらファイル情報リストからディレクトリの情報を取り出します。
取得したディレクトリが隠しディレクトリでない場合はディレクトリ名をツリーに登録します。
メソッドの呼び出しが「サブディレクトリの存在チェック」の場合(isDummyがTRUE)は、1個のディレクトリをツリーに登録した時点で処理は終了なのでループを抜けます。
展開→表示の場合は全てのディレクトリをツリーに登録するのでループを継続します。
展開→表示の場合、登録したディレクトリのノードが展開可能かどうかを設定する必要があるので、引数で指定されたディレクトリ名の絶対パスに登録したディレクトリ名を連結して、そのディレクトリにサブディレクトリがあるかどうかを調べます。
C# ソースコード [FileTreeView.cs]
// -----------------------------------------------------------------------
/// <summary>
/// ディレクトリツリーにディレクトリ名を登録する.
/// </summary>
/// <param name="parent">
/// ディレクトリ名を登録するノード.
/// </param>
/// <param name="path">
/// 該当ノードに対応した絶対パスのディレクトリ名.
/// </param>
/// <param name="isDummy">
/// true = サブディレクトリが存在するかどうかだけ調べる.
/// </param>
private void AddDirectory( TreeNode parent, string path, bool isDummy )
{
path += "\\";
try {
//! サブディレクトリを列挙する.
foreach( var dir in Directory.GetDirectories( path ) ){
//! ディレクトリの属性を取得する.
var di = new DirectoryInfo( dir );
//! 隠しディレクトリはツリーに含まない.
if( (di.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden ){
//! ディレクトリをツリーに追加する.
var sub = new TreeNode( di.Name );
parent.Nodes.Add( sub );
//! サブディレクトリの存在チェックの場合は、1件検出した時点で処理を終了する.
if( isDummy ){
return;
}
//! サブディレクトリの存在チェックを行う.
string subpath = path + sub.Text;
AddDirectory( sub, subpath, true );
}
}
}catch( Exception ){
}
}
VB ソースコード [FileTreeView.vb]
'' -----------------------------------------------------------------------
''' <summary>
''' ディレクトリツリーにディレクトリ名を登録する.
''' </summary>
''' <param name="parent">
''' ディレクトリ名を登録するノード.
''' </param>
''' <param name="path">
''' 該当ノードに対応した絶対パスのディレクトリ名.
''' </param>
''' <param name="isDummy">
''' true = サブディレクトリが存在するかどうかだけ調べる.
''' </param>
Private Sub AddDirectory( parent As TreeNode, path As String, isDummy As Boolean )
path += "\"
Try
' サブディレクトリを列挙する.
For Each dir As String In System.IO.Directory.GetDirectories( path )
' ディレクトリの属性を取得する.
Dim di As New System.IO.DirectoryInfo( dir )
' 隠しディレクトリはツリーに含まない.
If (di.Attributes And System.IO.FileAttributes.Hidden) <> System.IO.FileAttributes.Hidden Then
' ディレクトリをツリーに追加する.
Dim subDir As New TreeNode( di.Name )
parent.Nodes.Add( subDir )
' サブディレクトリの存在チェックの場合は、1件検出した時点で処理を終了する.
If isDummy Then
Return
End If
' サブディレクトリの存在チェックを行う.
Dim subPath As String = path + subDir.Text
AddDirectory( subDir, subPath, true )
End If
Next
Catch ex As System.Exception
End Try
End Sub
親ノードを再帰呼び出しで遡って、指定されたノードに対応したディレクトリの絶対パスを生成します。
C# ソースコード [FileTreeView.cs]
// -----------------------------------------------------------------------
/// <summary>
/// 指定されたノードに対応した絶対パスを取得する.
/// </summary>
/// <param name="node">
/// 絶対パスを取得するノード.
/// </param>
/// <returns>
/// 指定されたノードに対応した絶対パス.
/// </returns>
private string GetAbsolutePath( TreeNode node )
{
string path = string.Empty;
var parent = node.Parent;
if( parent != null ){
//! 親ディレクトリの絶対パスを取得する.
path += GetAbsolutePath( parent );
//! 親ディレクトリがある場合は連結する為にセパレータ("\")を付ける.
if( path.Length > 0 ){
path += "\\";
}
//! 親ディレクトリとファイル名を連結して絶対パス名にする.
path += node.Text;
}else{
;
}
return path;
}
VB ソースコード [FileTreeView.vb]
'' -----------------------------------------------------------------------
''' <summary>
''' 指定されたノードに対応した絶対パスを取得する.
''' </summary>
''' <param name="node">
''' 絶対パスを取得するノード.
''' </param>
''' <returns>
''' 指定されたノードに対応した絶対パス.
''' </returns>
Private Function GetAbsolutePath(node As TreeNode) As String
Dim path As String = String.Empty
Dim parent As TreeNode = node.Parent
If Not parent Is Nothing Then
' 親ディレクトリの絶対パスを取得する.
path += GetAbsolutePath(parent)
' 親ディレクトリがある場合は連結する為にセパレータ("\")を付ける.
If path.Length > 0 Then
path += "\"
End If
' 親ディレクトリとファイル名を連結して絶対パス名にする.
path += node.Text
Else
End If
Return path
End Function