テキストファイルを読む
プログラムからテキストファイルを読み込む場合、テキストファイルをシーケンシャル(連続)ファイルと捉えて、頭から一
気にテキスト末まで読
込みます。テキスト操作のために必要なクラスは、System.IO
クラスとSystem.Textクラスで
す。
プログラムコードの冒頭の 「using ・・・」が並んでいる辺りに、次の2行を追加してください。
using System.IO;
using System.Text;
ファイル名"sample.txt"が、
次のような3行からなるテキストファイルであったとします。(テキストファイルの各行末には、通常、改行コード
「\r\n」が入っています。)
「古池や
かわず飛び込む
水の音」
string[] s=new string[3];
//テキスト保存用の配列
string
r;
//
テキスト読込用文字列
int
i=1;
//
配列インデックス
//テキストストリームを開く
StreamReader readtext = new StreamReader("sample.txt",Encoding.GetEncoding("Shift_JIS")) ;
※
Encodeク
ラスとしては、Shift_JIS
コード、 EUC-JPコードなど日本語、外国語の様々なコード体系が指定できます。日本語を扱う場
合、Windowsの標準では、Shift_JISコードを用います。
どのよう
なコードが指定可能かについては、次のページが参考になります。
http://www.atmarkit.co.jp/fdotnet/dotnettips/013enumenc/enumenc.html
while (r=readtext.ReadLine() != null)
{
s[i]=r; //テキスト配
列に読み込む
i+=1; //配列インデックスのインクリメント
}
readtext.Close() ;
//テキストストリームを閉じる
以上のプログラムを実行すると、s[1]〜s[3]に、「古池や」〜「水の音」の各行のテキストが入ります。
|
テキストファイルを書く
プログラムからテキ
ストファイルを書き込む場合も、コードの冒頭でSystem.IOクラスとSystem.Textクラスを読み込みます。
using System.IO;
using System.Text;
後は、テキスト読込みの逆を行うだけです。
string[] s=new string[3];
//テキスト保存用の配列
string
r;
//
テキスト読込用文字列
int
i=1;
//
配列インデックス
s[1]="古池や";
s[2]="かわず飛び込む";
s[3]="水の音";
//テキストストリームを開く StreamWriter writetext = new StreamWriter("sample.txt",false,Encoding.GetEncoding("Shift_JIS")) ; for (i=1;i<4;i++) { writetext.WriteLine(s[i]); //テキスト配列を書き出す i+=1; //配列インデックスのインクリメント writetext.Close(); //テキストストリームを閉じる
|
バイナリ−ファイルを読む
バイナリ−ファイル(2進ファイル)の読込みは、基本的にはテキストファイルの読込みと変わりません。ただし、ファイルの生データ(2進データ)を直
接扱うため、バイト単位の読み込みとなること、Encodingクラスの指定ができないことが相違点となります。
Encodingクラスを用いないため、System.Textクラスの読込みは必要ありません。
ファイル名"sample.bin"が、
ここで扱うバイナリーファイルであったとします。
using System.IO;
後は、バイナリーファイル読込みの逆を行うだけです。
bytes[] bytedata=new bytes[3];
//読込みバイトデータ保存用の配列
bytes
b;
//
バイトデータ読込用文字列
int
i=1;
//
配列インデックス
//バイナリーストリームを開く FileStream readbytes = new FileStream("sample.bin",FileMode.Open,FileAccess.Read) ;
while (b=readbytes.ReadByte() != null)
{
bytedata[i]=b; //バイトデータ配
列に読み込む
i+=1; //配列インデックスのインクリメント
}
readbytes.Close() ;
//バイナリーストリームを閉じる
|
バイナリ−ファイルを書く
プロ
グラムからバイナリーファイルを書き込む場合も、コードの冒頭でSystem.IOクラスを読み
込みます。
using System.IO;
bytes[]
bytedata=new bytes[3];
//読込みバイトデータ保存用
int
i=1;
//
配列インデックス
bytedata[1]=1;
bytedata[2]=100;
bytedata[3]=255; //byteデータ形式の最大値は255で
す。
//バイナリーストリームを開く FileStream writebyte = new FileStream("sample.bin",FileMode.Create,FileAccess.Write); for (i=1;i<4;i++) { writebyte.WriteByte(bytedata[i]); //バイナリー配列を書き出す i+=1; //配列インデックスのインクリメント } writebyte.Close(); //テキストストリームを閉じる
|
ランダム
(固定長)ファイルを読む
|
ランダム(固定長)ファイルを書く
|
ファイルの属性を取得する
プログ
ラムからファイルの属性を取得する場合は、コードの冒頭でSystem.IOクラスを読み
込みます。
using System.IO;
ファイル属性の取得には、文字
どおりFileAttributes
クラスを用います。
FileAttributes zokusei; //FileAttributesクラスのインスタンスをつくる string[] a=new string[8]; 属性は、フラグがビットとして立っていますので、FileAttributesクラスとのandをとります。 zokusei=File.GetAttributes("sample.txt"); if ((zokusei & FileAttributes.Archive)!=0) a[1]="アーカイブファイル"; if ((zokusei & FileAttributes.Compressed)!=0)a[2]="圧縮ファイル"; if ((zokusei & FileAttributes.Directory)!=0) a[3]="ディレクトリファイル"; if ((zokusei & FileAttributes.Encrypted)!=0) a[4]="暗号化ファイル"; if ((zokusei & FileAttributes.Hidden)!=0) a[5]="隠しファイル"; if ((zokusei & FileAttributes.ReadOnly)!=0) a[6]="読取専用ファイル"; if ((zokusei & FileAttributes.System)!=0) a[7]="システムファイル"; if ((zokusei & FileAttributes.Temporary)!=0) a[8]="テンポラリ(一時)ファイル";
|
ファイルの属性を設定する
属性の設定は、属性取得の逆を行うことになります。
using System.IO;
FileAttributes zokusei; //FileAttributesクラスのインスタンスをつくる string[] a=new string[8]; 属性は、FileAttributeクラスのインスタンスとorをとることにより、設定します。
zokusei |=FileAttributes.Archive; //アーカイブファイル設定 zokusei |=FileAttributes.Compressed; //圧縮ファイル設定 zokusei |=FileAttributes.Hidden; //隠しファイル設定 zokusei |=FileAttributes.Archive; //アーカイブ設定 zokusei |=FileAttributes.ReadOnly; //読取専用設定 zokusei |=FileAttributes.System; //システムファイル設定 zokusei |=FileAttributes.Temporary; //テンポラリ設定
File.SetAttributes("sample.txt", zokusei) ; //ファイルに属性を設定
|
ファイルの大きさ(容量)を取得する
プログ
ラムからファイルの大きさを取得する場合は、コードの冒頭でSystem.IOクラスを読み
込みます。
using System.IO;
ファイル情報の取得に
は、FileInfoクラスを用います。
int volume; string b,k,m,g; FileInfo zyoho = new FileInfo("sample.txt") ; //ファイル情報の取得
volume=(int)zyoho.Length; //ボリューム情報の取得
b=volume.ToString()+"byte"; //バイト単位
k=(int)(volume/1024).ToString()+"Kbyte";
//キロバイト単位
m=(int)(volume/1024/1024).ToString()+"Mbyte";
//メガバイト単位
|
ファイルを
削除する
ファイルを削除するには、FileクラスのDeleteメソッドを使います。
using System.IO;
File.Delete("sample.txt") ;
|
ファイルを
移動する(ファイル名を変更する)
ファイルを移動するには、FileクラスのMoveメソッドを使います。
using System.IO;
次のコードでは、
"sample1.txt"という名称のファイルを"sample2.txt"に移動します。元のファイルは消去されますので、ファイル名の変更も同じMoveメソッドで行うことができます。
File.Move("sample1.txt","sample2.txt") ;
|
ファイルがあるか確認する
ファ
イルがあるか確認するには、FileクラスのExistsメソッドを使います。
using
System.IO;
Bool ex; ex=File.Exists("sample.txt") ; //ファイルが存在すれば、ex=trueとなる。
|
ファイルを
コピーする
ファイルをコピーするには、FileクラスのCopyメソッドを使います。
using System.IO;
"sample1.txt"という名称のファイルを"sample2.txt"にコピーします。元のファイルは消去されません。
File.Copy("sample1.txt","sample2.txt",true) ; //コピーする。trueを省略すると上書きされない。
|
マウスクリックされたノードを選択状態にする
マウスイベントには、マウスダウン、マウスアップなど関連イベントが多数ありますが、
マウスクリックされたノードを取得するには、
マウスダ
ウンイベントを使うと便利です。
private void treeView1_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{
string s,name;
treeView1.SelectedNode=treeView1.GetNodeAt(e.X,
e.Y); //マウス座標から選択位置のノードを取得
if (treeView1.SelectedNode!=null) //ノード上でクリックされたか?
{
s=treeView1.SelectedNode.FullPath; //ノードパスの取得
name=treeView1.SelectedNode.Text; //ノード名の取得
}
}
|
ノードイン
デックスを取得する
これまで、ノードインデックスを何度か使って来ました。
明示的に、ノードインデックスを取得するには、次のとおりコーデイングします。
int i,j;
i=treeView1.SelectedNode.Index; //ノードインデックスの取得
j=treeView1.SelectedNode.Parent.Index; //親ノードのノードインデックスの取得
上記の「種」ノードの場合、「ヒマワリ」ノードに「種」ノードは最初にぶら下がっていますから、i は 0、「ヒマワリ」ノードは、「花」ノード
に2番目にぶら下がっていますから、j=1となります。
|
ドライブのデイレクトリ情報をツリービューとして表示する
ツリービューの応用例として、コンピュータ上の各ドライブを走査し、デイレクトリとファイルを一連のツリーに全表示するプログラムを示し
ます。なお、ファイルについては、数が膨大になるため1MB以上の容量のファイルのみ表示することとしています。
用意しておくコントロールは、ツリービューtreeView1
と、処理時間の経過を表示するプログレスバー
progressBar1です。
少々長いですが、簡単な解説をコメント行として付けていま
す。
using
System.IO;
// デイレクトリ検索に用いるクラス
using System.Management; // ドライブ情報取得に用いるクラス
public int i;
int j;
public bool shoki;
string s;
int totalvol,k; //サーチ対象の総容量
//ドライブ情報の取得
string[]
totaldrive = Directory.GetLogicalDrives() ;
int drnum=totaldrive.Length;
//全接続ドライブ数の取得(内部、外部、ネットワークドライブを含む)
//ツリービューの初期化
treeView1.Nodes.Clear();
treeView1.ExpandAll();
//プログレスバーの初期化
progressBar1.Maximum=drnum; //最大値は全接続ドライブ数
progressBar1.Minimum=0;
//最小値
//値の初期化
totalvol=0;
totals=0;
i=-1; j=0;
progressBar1.Value=0;
//走査開始
ManagementObject disk = new
ManagementObject() ;
foreach(string drive in totaldrive)
{
disk.Path = new ManagementPath("Win32_LogicalDisk='"
+ drive[0] + ":'") ;
long disksize ;
try disksize = long.Parse("" + disk["Size"]) ; //デイスク容量の取得
catch disksize=0;
//ネットワーク接続権限がない場合、例外が発生するため、デイスク容量=0とする
i+=1;
progressBar1.Value=i;
if (disksize!=0) //アクセス可能なデイスクか?
{
treeView1.Nodes.Add(totaldrive[i]); //ドライブノードの生成
TreeNode node = treeView1.Nodes[j]; //ドライブノードを親ノードとしてデイレクトリ構造を展開
j+=1;
shoki=true;
CreateTree(node,i);
//ノード展開。すべてのデイレクトリを走査・展開するため、再起呼び出し処理
}
}
次のサブルーチンでは、ドライブ毎にデイレクトリを走査・展開するため、再起呼び出
し処理を行います。
private void CreateTree(TreeNode node,int i)
{
int l;
string dirName
= node.FullPath; //走査対象デイレクトリ
if
(Directory.Exists(dirName) == false) return; //デイレクトリが存在しない場合は復帰
DirectoryInfo directory = new
DirectoryInfo(dirName); //デイレクトリ情報の取得
FileInfo [] file1 =
directory.GetFiles();
//ファイル情報の取得
if (shoki)
{
//ドライブ直下のファイルノードの生成
shoki=false;
foreach(FileInfo file in file1)
{
l=(int)file.Length/1024/1024; // ファイル容量取得
if ( l>=1) node.Nodes.Add(file.Name); //1MB以上のファイルノードの生成
}
}
DirectoryInfo[]
subDirectories = directory.GetDirectories(); //サブデイレクトリ情報の取得
foreach(DirectoryInfo subDirectory in subDirectories)
{
TreeNode newNode =
node.Nodes.Add(subDirectory.Name); //サブデイレクトリノードの表示
try
{
FileInfo [] files =
subDirectory.GetFiles();
foreach(FileInfo file in files) //サブデイレクトリ内のファイル情報の取得
{
l=(int)file.Length/1024/1024; //
ファイル容量取得
if ( l>=1)
newNode.Nodes.Add(file.Name); //1MB以上のファイルノードの生成
}
}
catch {}
CreateTree(newNode,i); //子フォルダへの再帰呼び出し
}
}
|