ファイルをバイナリ形式で表示する (C#/VB Winow Form編)
ディレクトリツリーでノード(ディレクトリ)を選択したときに、ファイル一覧ビューで選択したディレクトリ直下のサブディレクトリとファイル名を一覧表示します。
処理の流れは以下のようになります。
ディレクトリの選択が変更されるときのイベントハンドラ
ファイル一覧ビューの表示を更新する
ルートノード(コンピュータ名)を選択した場合
ファイル一覧にドライブ名リストを表示する
ルートノード以外を選択した場合
ファイル一覧にディレクトリ名またはファイル名を表示する
ディレクトリツリーのノードが選択されたときに呼び出されるイベント処理です。
ディレクトリツリーのノード(ディレクトリ)を選択したときのイベント処理を行うために、BeforeSelect()メソッドをオーバーライドします。
「FileTree」の「BeforeSelect」プロパティに「FileTree_BeforeSelect」を追加します。
選択されたノードに対応したディレクトリの絶対パスを取得して、ファイル一覧表示ビューに対してを表示するディレクトリが変更されることを通知します。
C# ソースコード [FileTreeView.cs]
// -----------------------------------------------------------------------
/// <summary>
/// ディレクトリツリーのディレクトリの選択が変更されるときのイベント処理.
/// </summary>
/// <param name="sender">
/// イベントを発生させたオブジェクト.
/// </param>
/// <param name="e">
/// イベント・パラメータ.
/// </param>
private void FileTree_BeforeSelect( object sender, TreeViewCancelEventArgs e )
{
var node = e.Node;
if( node == null ){
return;
}
//! ファイル一覧を更新する.
UpdateFileList( GetAbsolutePath( node ) );
}
VB ソースコード [FileTreeView.vb]
'' -----------------------------------------------------------------------
''' <summary>
''' ディレクトリツリーのディレクトリの選択が変更されるときのイベント処理.
''' </summary>
''' <param name="sender">
''' イベントを発生させたオブジェクト.
''' </param>
''' <param name="e">
''' イベント・パラメータ.
''' </param>
Private Sub FileTree_BeforeSelect( sender As Object, e As TreeViewCancelEventArgs ) Handles FileTree.BeforeSelect
Dim node As TreeNode = e.Node
If node Is Nothing Then
Return
End If
' ファイル一覧を更新する.
UpdateFileList( GetAbsolutePath( node ) )
End Sub
ファイル一覧に表示するディレクトリの絶対パスは保存しておきます。
ファイル一覧に表示するディレクトリの絶対パスが指定された場合は、該当するディレクトリのファイルリストを作ります。
ファイル一覧に表示するディレクトリの絶対パスが指定されなかった場合は、ドライブ名一覧を作って、これをファイルリストにします。
C# ソースコード [FileListView.cs]
// -----------------------------------------------------------------------
/// <summary>
/// ファイル一覧を更新する.
/// </summary>
/// <param name="path">
/// 一覧表示するディレクトリ名.
/// </param>
private void UpdateFileList( string path )
{
//! 一覧表示するディレクトリ名を保存する.
CurrentDir = path;
if( CurrentDir.Length > 0 ){
//! 指定されたパスのファイル一覧を生成する.
ShowFileName( path );
}else{
//! パスが指定されていない場合はドライブ一覧を生成する.
ShowDriveName();
}
}
VB ソースコード [FileListView.vb]
'' -----------------------------------------------------------------------
''' <summary>
''' ファイル一覧を更新する.
''' </summary>
''' <param name="path">
''' 一覧表示するディレクトリ名.
''' </param>
Private Sub UpdateFileList( path As String )
' 一覧表示するディレクトリ名を保存する.
CurrentDir = path
If CurrentDir.Length > 0 Then
' 指定されたパスのファイル一覧を生成する.
ShowFileName( path )
Else
' パスが指定されていない場合はドライブ一覧を生成する.
ShowDriveName()
End If
End Sub
ファイル一覧ビューに表示するディレクトリ名とファイル名をに追加します。
C# ソースコード [FileListView.cs]
// -----------------------------------------------------------------------
/// <summary>
/// ファイル一覧にファイル名の一覧を表示する.
/// </summary>
/// <param name="path">
/// ファイル一覧を表示するディレクトリの絶対パス.
/// </param>
private void ShowFileName( string path )
{
//! ファイル一覧の表示を一旦クリアする.
FileList.Items.Clear();
//! 一つ上のディレクトリに移動する為の「..」をリストの先頭に追加する.
FileList.Items.Add( new ListViewItem( new string[] { "..", "<DIR>", "" }) );
try {
//! 指定されたディレクトリ直下のサブディレクトリ名のリストを取得する.
path += "\\";
foreach( var dir in Directory.GetDirectories( path ) ){
//! ディレクトリの属性を取得する.
var di = new DirectoryInfo( dir );
//! 隠しディレクトリはリストに表示しない.
if( (di.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden ){
//! 更新日付を文字列にする.
var dateStr = di.LastWriteTime.ToString( "yyyy/MM/dd hh:mm" );
//! ファイル一覧に生成したディレクトリ情報を追加する.
FileList.Items.Add( new ListViewItem( new string[] { di.Name, "<DIR>", dateStr }) );
}
}
//! 指定されたディレクトリ直下のファイル名のリストを取得する.
foreach( var file in Directory.GetFiles( path, "*", SearchOption.TopDirectoryOnly ) ){
//! ファイル属性を取得する.
var attr = File.GetAttributes( file );
//! 隠しファイルはリストに表示しない.
if( (attr & FileAttributes.Hidden) != FileAttributes.Hidden ){
//! ファイル名からファイル情報を取得する.
var fi = new FileInfo( file );
//! ファイルサイズを右詰の文字列に変換する.
var sizeStr = fi.Length.ToString( "#,0" );
//! 更新日付を文字列にする.
var dateStr = fi.LastWriteTime.ToString( "yyyy/MM/dd hh:mm" );
//! ファイル一覧に生成したファイル情報を追加する.
FileList.Items.Add( new ListViewItem( new string[] { fi.Name, sizeStr, dateStr }) );
}
}
}catch( Exception ){
}
}
VB ソースコード [FileListView.vb]
'' -----------------------------------------------------------------------
''' <summary>
''' ファイル一覧にファイル名の一覧を表示する.
''' </summary>
''' <param name="path">
''' ファイル一覧を表示するディレクトリの絶対パス.
''' </param>
Private Sub ShowFileName( path As String )
' ファイル一覧の表示を一旦クリアする.
FileList.Items.Clear()
' 一つ上のディレクトリに移動する為の「..」をリストの先頭に追加する.
FileList.Items.Add( New ListViewItem( New string() { "..", "<DIR>", "" }) )
Try
' 指定されたディレクトリ直下のサブディレクトリ名のリストを取得する.
path += "\"
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 dateStr As String = di.LastWriteTime.ToString( "yyyy/MM/dd hh:mm" )
' ファイル一覧に生成したディレクトリ情報を追加する.
FileList.Items.Add( New ListViewItem( New string() { di.Name, "<DIR>", dateStr }) )
End If
Next
' 指定されたディレクトリ直下のファイル名のリストを取得する.
For Each file As String In System.IO.Directory.GetFiles( path, "*", System.IO.SearchOption.TopDirectoryOnly )
' ファイル属性を取得する.
Dim attr As System.IO.FileAttributes = System.IO.File.GetAttributes( file )
' 隠しファイルはリストに表示しない.
If (attr And System.IO.FileAttributes.Hidden) <> System.IO.FileAttributes.Hidden Then
' ファイル名からファイル情報を取得する.
Dim fi As New System.IO.FileInfo( file )
' ファイルサイズを右詰の文字列に変換する.
Dim sizeStr As String = fi.Length.ToString( "#,0" )
' 更新日付を文字列にする.
Dim dateStr As String = fi.LastWriteTime.ToString( "yyyy/MM/dd hh:mm" )
' ファイル一覧に生成したファイル情報を追加する.
FileList.Items.Add( New ListViewItem( New string() { fi.Name, sizeStr, dateStr }) )
End If
Next
Catch ex As System.Exception
End Try
End Sub
最初に現在表示しているリストをクリアします。
一つ上のディレクトリに移動する為の「..」をリストの先頭に追加します。
項目 | 値 |
---|---|
ファイル名 | 「..」 |
ファイルサイズ | 「<DIR>」 |
更新日時 | 空白 |
次にディレクトリ名とファイル名をファイル一覧に追加します。
先にサブディレクトリ名を表示リストに追加します。
Directory.GetDirectories()を呼び出して、指定されたディレクトリ直下のディレクトリのリストを取得します。
for()ループで回しながらディレクトリのリストからディレクトリ情報を取り出して、表示リストにディレクトリ情報を追加します。
(このとき隠しファイルは表示リストに追加しません。)
表示リストに追加する「ディレクトリ」のファイル情報は以下のとおりです。
項目 | 値 |
---|---|
ファイル名 | ディレクトリ情報から取得したディレクトリ名 |
ファイルサイズ | 「<DIR>」 |
更新日時 | ディレクトリ情報から取得した最終更新日時 |
次にファイル名を表示リストに追加します。
Directory.GetFiles()を呼び出して、指定されたディレクトリ直下のファイルのリストを取得します。
for()ループで回しながらファイルリストからファイル情報を取り出して、表示リストにファイル情報を追加します。
(このとき隠しファイルは表示リストに追加しません。)
表示リストに追加する「ファイル」のファイル情報は以下のとおりです。
項目 | 値 |
---|---|
ファイル名 | ファイル情報から取得したファイル名 |
ファイルサイズ | ファイル情報から取得したファイルサイズ |
更新日時 | ファイル情報から取得した最終更新日時 |
ファイル一覧ビューに表示するドライブ名を表示リストに追加します。
C# ソースコード [FileListView.cs]
// -----------------------------------------------------------------------
/// <summary>
/// ファイル一覧にドライブ名の一覧を表示する.
/// </summary>
private void ShowDriveName()
{
//! ファイル一覧の表示を一旦クリアする.
FileList.Items.Clear();
//! 論理ドライブ名をすべて取得する.
string[] stDrives = Directory.GetLogicalDrives();
//! 取得した論理ドライブ名をすべて表示する.
foreach( var drive in stDrives ){
//! ドライブ名をの最後にあるセパレータ("\")を取り除く.
var drvname = drive.Substring( 0, drive.Length - 1 );
//! ファイル一覧に生成したファイル情報を追加する.
FileList.Items.Add( new ListViewItem( new string[] { drvname, "", "" }) );
}
}
VB ソースコード [FileListView.vb]
'' -----------------------------------------------------------------------
''' <summary>
''' ファイル一覧にドライブ名の一覧を表示する.
''' </summary>
Private Sub ShowDriveName()
' ファイル一覧の表示を一旦クリアする.
FileList.Items.Clear()
' 論理ドライブ名をすべて取得する.
Dim stDrives As String() = System.IO.Directory.GetLogicalDrives()
' 取得した論理ドライブ名をすべて表示する.
For Each drive As String In stDrives
' ドライブ名をの最後にあるセパレータ("\")を取り除く.
Dim drvname As String = drive.Substring( 0, drive.Length - 1 )
' ファイル一覧に生成したファイル情報を追加する.
FileList.Items.Add( New ListViewItem( New string() { drvname, "", "" }) )
Next
End Sub
最初に現在表示しているリストをクリアします。
次にDirectory.GetLogicalDrives()を呼び出してコンピュータに接続されている有効なドライブのドライブ名リストを取得します。
for()ループで回しながらドライブ名リストからドライブ名のファイル情報を取り出します。
表示リストに追加する情報は以下のとおりです。
項目 | 値 |
---|---|
ファイル名 | ドライブ名 |
ファイルサイズ | 空白 |
更新日時 | 空白 |