6月 17

編集結果をファイルに保存する

RichTextBoxの編集結果をファイルに保存するには
SaveFile 関数を利用します。

通常はテキストファイルだと思いますが
リッチテキスト(RTF)なども利用できます。
ファイルの種類は第2パラメータで指定します。

    // 第2パラメータでファイルの種類を指定します。(ここではPlainText)
    // 第2パラメータは省略可能です。その場合はASCIIテキストファイルになります。
    richTextBox1.SaveFile(@"c:\unko.txt", RichTextBoxStreamType.PlainText);


    // その他の第2パラメータの種類
    RichTextBoxStreamType.PlainText;        // テキストファイル(通常はこれ)
    RichTextBoxStreamType.RichNoOleObjs;    // OLEオブジェクトの代わりに空白を持つリッチテキスト
    RichTextBoxStreamType.RichText;         // リッチテキスト(RTF)
    RichTextBoxStreamType.TextTextOleObjs;  // OLEオブジェクトのテキスト表現を持つPlainText
    RichTextBoxStreamType.UnicodePlainText; // テキストファイル(Unicodeでエンコードされる)
6月 17

ファイルを読み込んで表示する

RichTextBoxにファイルを読み込んで表示するには
LoadFile 関数を利用します。

通常はテキストファイルだと思いますが
リッチテキスト(RTF)なども利用できます。
ファイルの種類は第2パラメータで指定します。

    // テキストファイルを読み込んで表示させます。
    // 第2パラメータでファイルの種類を指定します。(ここではPlainText)
    // 第2パラメータは省略可能です。その場合はASCIIテキストファイルになります。
    richTextBox1.LoadFile(@"c:\boot.ini", RichTextBoxStreamType.PlainText);


    // その他の第2パラメータの種類
    RichTextBoxStreamType.PlainText;        // テキストファイル(通常はこれ)
    RichTextBoxStreamType.RichNoOleObjs;    // OLEオブジェクトの代わりに空白を持つリッチテキスト
    RichTextBoxStreamType.RichText;         // リッチテキスト(RTF)
    RichTextBoxStreamType.TextTextOleObjs;  // OLEオブジェクトのテキスト表現を持つPlainText
    RichTextBoxStreamType.UnicodePlainText; // テキストファイル(Unicodeでエンコードされる)
6月 12

ファイルシステムを監視する(ファイルの作成監視例)

FileSystemWatcherコンポーネントを利用します。
Formにドラッグ&ドロップするだけで
ファイルシステムを監視し、ファイルの更新や作成を知ることができます。

例ではCドライブ以下をすべて監視し、
ファイルが作成されたらそれを捕捉、ファイル名のフルパスを出力パネルに表示します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            fileSystemWatcher1.Created +=new System.IO.FileSystemEventHandler(fileSystemWatcher1_Created);

            // 監視対象フォルダ
            fileSystemWatcher1.Path = @"c:\";

            // すべてのファイルを監視
            fileSystemWatcher1.Filter = "*.*";

            // サブディレクトリも監視に含める
            fileSystemWatcher1.IncludeSubdirectories = true;

            // 監視の種類を設定(複数組み合わせも可)
            fileSystemWatcher1.NotifyFilter = System.IO.NotifyFilters.FileName;

            // 監視有効
            fileSystemWatcher1.EnableRaisingEvents = true;
        }

        private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
        {
            // ファイルを作成したりコピーしたりするとフルパスで出力されます
            System.Diagnostics.Debug.WriteLine(e.FullPath);
        }
    }
}
6月 12

2つのファイルを比較する

2つのファイルをバイナリで比較する関数の例です。
FileStreamを利用するので
using System.IO;
を忘れずに追加してください。

FileCompare関数は一致か否かをboolで返します。
引数は比較したいファイル1とファイル2のファイル名です。
絶対パス付きが望ましいです。

        private bool FileCompare(string file1, string file2)
        {
            if (file1 == file2)
                return true;

            FileStream fs1 = new FileStream(file1, FileMode.Open);
            FileStream fs2 = new FileStream(file2, FileMode.Open);
            int byte1;
            int byte2;
            bool ret = false;

            try
            {
                if (fs1.Length == fs2.Length)
                {
                    do
                    {
                        byte1 = fs1.ReadByte();
                        byte2 = fs2.ReadByte();
                    }
                    while ((byte1 == byte2) && (byte1 != -1));

                    if (byte1 == byte2)
                        ret = true;
                }
            }
            catch
            {
            }
            finally
            {
                fs1.Close();
                fs2.Close();
            }

            return ret;
        }
6月 12

ファイルの作成/書き込み/追記 Stream編

テキストファイルを新規に作成し、
文字列を書き込みます。
また、既存ファイルへの追記の方法も示します。

System.IO.StreamWriterクラスを使います。
同クラスのコンストラクタにて
・テキストファイル名
・既存ファイルが存在する場合の追記の有無
・エンコード(通常はShift-JIS)
を与えます。

最後にStreamをクローズすることを忘れずに。


System.IO.StreamWriter writer = null;

// Shift-JISのテキストファイルを作成します。
// 第2パラメータは既存ファイルが存在する場合の振る舞いを示します。
// false:上書き、true:追記
writer = new System.IO.StreamWriter( @"c:\hello.txt", false, System.Text.Encoding.Default );

writer.Write( "tako" );     // 文字列の書き込み
writer.Write( 123 );        // 数値の書き込み
writer.Write( "\r\n" );     // 改行文字の書き込み
writer.WriteLine( "unko" ); // 文字列の書き込み(1行分)

writer.Close();

6月 12

バイナリデータの書き込み

例としてbyte配列で用意された
バイナリデータを書き込むサンプルです。

【補足】
この他にも
System.IO.FileMode列挙体には以下の値を設定可能です。

・Append
追記。存在しない場合は新規作成
・Create
新規作成。ファイルが存在する場合は上書き
・CreateNew
新規作成。ファイルが存在する場合は例外発生(System.IO.FileNotFoundException)
・Open
既存ファイルを開く。ファイルが存在しない場合は例外発生(System.IO.FileNotFoundException)
・OpenOnCreate
読み書き両用で開く。
・Truncate
既存ファイルを開く。クローズ時にサイズ0となり、内容が捨てられる。


System.IO.FileStream fs = null;

// ファイルを新規作成(既に存在する場合は上書き)
fs = new System.IO.FileStream( @"c:\hello.txt", System.IO.FileMode.Create );

// バイナリデータの書き込み
byte[] data = { 0x31, 0x32, 0x33, 0x34, 0x35 };
fs.Write( data, 0, data.Length );

fs.Close();

6月 12

1行ずつ/1文字ずつ読み込む

テキストファイルの中身を
1行ずつ読み込んで表示するサンプルです。

System.IO.StreamReaderクラスを使います。
同クラスのコンストラクタにて
テキストファイル名と
エンコード方式を与えます。

あまり大きなサイズのファイルだと
読み込みに時間がかかってしまうので
サンプルを動かす場合は
小さめのファイルでまずは試してください。

最後にStreamをクローズすることを忘れずに。

サンプルでは
Peek()で事前に読取可能かどうか調べてから
実際にReadLine()で1行ずつ読み込んでいます。

1文字ずつ読み込みたい場合は
ReadLine()の替わりにRead()を使います。

なお、Peek()しただけでは
現在のファイルポインターの位置は変わりません。
Peek()の戻り値が-1の場合
それ以上読み込めるデータが無いことを示します。

【補足】
ReadLine()の戻り値はstringなので
加工したい場合は
1度string型の変数か何かで受けてご自由に。


System.IO.StreamReader m_reader = null;

m_reader = new System.IO.StreamReader( @"c:\hello.txt", System.Text.Encoding.Default );

// 1行ずつ読み込んでリストボックスに追加
while( m_reader.Peek() >= 0 )
    listBox1.Items.Add(m_reader.ReadLine());

m_reader.Close();