C#には、ディスク(ドライブ)内のファイルを操作する様々なツールが用意されています。
  


  テキスト ファイルを読む
  テキストファイルを書く
  バイナリ−ファイルを読む
  バイナリ−ファイルを書く
  ランダム (固定長)ファイルを読む
  ランダム(固定長)ファイルを書く
  ファイルの属性を取得する
  ファイルの属性を設定する
  ファイルの大きさ(容量)を取得する
  ファイルを削除する
  ファイルを 移動する(ファイル名 を変更する)
  ファイルが あるか確認する
  ファイルをコピーする
 

テキストファイルを読む
  
プログラムからテキストファイルを読み込む場合、テキストファイルをシーケンシャル(連続)ファイルと捉えて、頭から一 気にテキスト末まで読
 込みます。テキスト操作のために必要なクラスは、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);  //子フォルダへの再帰呼び出し
                        }
                    }