はかせのラボ

私の頭の中を書いていく雑記ブログです

C# ファイルの読み書き

あいさつ

どうも、はかせです。
フォルダ操作系は一通りやったので
次はファイル操作です。

ファイル操作ができるようになれば、
極論プログラムを弄らずとも
プログラムの動作を変えれるようになりますよ。

今回はファイルの読み書きをやっていきますよ。
(実は生成/削除/コピー/移動(改名)はフォルダ操作と一緒にやってますw)

環境

Windows10
Visualstudio2017
.NET Framework 4.6.1

using

System.IO;

ファイルを開く

ファイル操作をするためにはまずファイルを開かなくてはいけません。
ファイルを開くにはFile.Open~系のメソッドを使います。

//書き込み権限で開く
using (var fs = File.OpenWrite("ファイルパス")){}
//読み取り権限で開く
using (var fs = File.OpenRead("ファイルパス")){}
//読み取り/書き込み権限で開く
using (var f = File.Open("ファイルパス", FileMode.OpenOrCreate)){}

OpenWrite()/OpenRead()はそのままの意味です。
引数に渡されたファイルをそれぞれの権限で開きます。
また渡されたファイルパスにファイルが存在しない場合
そのパスでファイルを新規生成します。

Open()メソッドは少し変わっていていくつかオーバーロードが存在します。

File.Open("ファイルパス",FileMode);
File.Open("ファイルパス",FileMode,FileAccess);
File.Open("ファイルパス",FileMode,FileAccess,FileShare);

FileModeはファイルを開く際に
・ファイルがない場合どうするか
・ファイルがある場合どう開くか

というのを指定するものになります。

FileAccessファイルのアクセス権限を指定します。
何も指定しなければ読み取り/書き込みで開かれます。

FileShareはファイルの共有設定です。
何も指定しなければ共有しない設定になります。

使い分けは
とりあえずファイル読みたい→OpenRead()
とりあえずファイル書きたい→OpenWrite()
色々設定してファイル開きたい→Open()

こんな感じでいいと思います。

小ネタ using

先ほどのコードで

using (var fs = File.OpenWrite("ファイルパス")){}

こんな感じで普段とは違うusingが出てきましたね。
このusingはかなり便利なものでして、
なんとリソース破棄を自動化してくれます。

どういうことかというと、
ファイルを開くということは
同時にファイルを閉じるということも
しなくてはいけなくなるわけです。

コードにするとこんな感じ

var fs = File.OpenWrite("ファイルパス"); //ファイルを開く部分

//~なんか色々処理~

if(fs != null) fs.Dispose(); //ファイルを閉じる部分

(本来はtry~catchみたいな感じでエラーも考えなきゃですが、
例なので目を瞑ってくださいm(__)m)

プログラマーってのは人間なわけで
人間って生き物は忘れるわけです。

最後に書いたファイルを閉じるって部分を書き忘れるわけですよ。
そしてメモリリークしたり、
もう一回使おうとしたらファイル開かれてて使えなかったりするわけです。

こんなしょうもないとこでめんどくさいエラー起こしたくない!
ってことで出てきたのがリソース破棄の自動化です。

usingの中でリソースを開くと、
スコープが外れた段階で勝手にDisposeを呼んでくれます

つまり

using (var fs = File.OpenWrite("ファイルパス"))
{
//~なんか色々処理~
}// ←ここで勝手にfs.Dispose()が呼ばれる!

勝手に必要なことをやってくれる!
何て素敵なんでしょう!using!
あなたも今日からusing使いましょうね。
上小ネタのコーナーでした~

ファイル読み込み

ファイル読み込みには○○Readerクラスを使います。

//テキストファイルを読み込む
using (var fs = File.OpenRead(fileName))
using (var sr = new StreamReader(fs, Encoding.UTF8))
{
        sr.Read();         // 1文字 
        sr.ReadLine();     // 1行
        sr.ReadToEnd();    // 全文              
}
//バイナリファイルを読み込む
using (var fs = File.OpenRead(fileName))
using (var br = new BinaryReader(fs, Encoding.UTF8))
{
        br.ReadInt32();    //  Int32で読み込む
        br.ReadString();   //  stringで読み込む
}

//容赦なく全文欲しければこれでもいいよ
File.ReadAllLines("ファイルパス");

StreamReaderクラスはテキストファイル
BinaryReaderクラスはバイナリファイル
読み込むクラスです。

読み込みたいファイルに応じて適切な方を選んで使いましょう。
各メソッドには非同期版があり、
読み込み完了を待つこともできます。

ちなみにとにかく全部欲しいって場合は
File.ReadAllLines()を使えばstringの配列で
File.ReadAllText()を使えばstringで
File.ReadAllBytes()を使えばbyteの配列で
それぞれ全文のデータが取得できます。

ファイル書き込み

ファイル書き込みには○○Writerクラスを使います。

//テキストファイルに書き込み
using (var fs = File.OpenWrite(fileName))
using (var sw = new StreamWriter(fs, Encoding.UTF8))
{
        sw.Write("a");     // 文字列
        sw.WriteLine("b"); // 文字列+改行        
}
//バイナリファイルに書き込み
using (var fs = File.OpenWrite(fileName))
using (var bw = new BinaryWriter(fs, Encoding.UTF8))
{
       bw.Write(3);       // intで書き込み
       bw.Write("c");     // stringで書き込み
}

StreamWriterクラスはテキストファイル
BinaryWriterクラスはバイナリファイル
書き込むクラスです。

書き込みたいファイルに応じて適切な方を選んで使いましょう。
各メソッドには非同期版があり、
書き込み完了を待つこともできます。

あとがき

今回はファイルを開いて読み書きをする方法でした。
開く→読む/書く→閉じる
この流れさえ守ればそんなめんどくさいエラーにはぶつからないと思います。

そしてこの流れを楽ちんにしてくれるusing
控えめに言って神ですよね。

この記事がいいと思いましたら、
はてなブックマークSNSへの拡散、
コメントよろしくお願いしますorz

それでは今回はこの辺でノシ