C#でのファイルの取り扱い方についてまとめていきます。
ファイルを扱うプログラミング
Visual Studioでは、いろんなファイル操作をする場面があることでしょう。
ファイルやディレクトリについて、ロードや存在確認など基本的なことは以下のように行います。
ファイルを読み込む
ファイルを読むには「System.IO.StreamReader」を使います。
ファイル名と文字エンコードの種類をしてからファイルを読み込みます。
String fileName = @"c:\_work\sample.txt";
System.IO.StreamReader sr = new System.IO.StreamReader(fileName,
System.Text.Encoding.GetEncoding("shift_jis"));
String s = sr.ReadToEnd();
sr.Close();
ファイルがあるか調べる
ファイルの存在は「System.IO.File.Exists」で調べることができます。
if (System.IO.File.Exists(fileName)){
}
ディレクトリを作る・調べる
「using System.IO;」を指定し、以下のように「Directory.Exists」でディレクトリの有無をし食べたり、「CreateDirectory」で作ることができます。
String fCache=”cache¥¥";
if (!Directory.Exists(fCache))
{
Directory.CreateDirectory(fCache);
}
iniファイルを使う
プログラムを作る場合、設定の一部をiniファイルのように外部ファイルにしておくと後々の変更が楽です。
C#の場合、WinAPIからGetPrivateProfileStringを利用可能にします。
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
private static extern int GetPrivateProfileString(
string lpApplicationName,
string lpKeyName,
string lpDefault,
StringBuilder lpReturnedstring,
int nSize,
string lpFileName);
あとはセクション名、キー、初期値、iniファイルのパスを渡して値を読み込むことができます。
public string GetValue(string section, string key, string defaultvalue, string filePath)
{
StringBuilder sb = new StringBuilder(256);
GetPrivateProfileString(section, key, defaultvalue, sb, sb.Capacity, filePath);
return sb.ToString();
}
iniファイルは以下のように記述します。
[]がセクション名です。gameセクションのgameModeの値を取得すると「test」とかえってきます。先頭に#をつけると、その行は無視されます。
[game]
gameMode=test
full=0
debug=0
# buffer=1000
iniファイル自体はプロジェクトへ組み込んで置き、プロパティで「出力ディレクトリにコピー」から「常にコピー」まはた「新しい場合コピー」にしておきます。
これでプロジェクト内のiniファイルを編集すると、ビルド後のバージョンでもそれと同じ内容のiniファイルが使えるようになります。
ファイルダイアログを利用する
ファイルを選択する OpenFileDialog
ファイルを開くときに使うダイアログです。対応拡張子を指定することもできます。
プログラムはまず「OpenFileDialog 」オブジェクトを作成。
最初に開く場所(InitialDirectory )、ファイルの拡張子のフィルター(Filter)、ダイアログの名(Title)などを指定してから実行。
結果がOKなら指定されたファイルパスを取得という流れになります。
private void videoOpenDlog()
{
OpenFileDialog ofd = new OpenFileDialog()
{InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.CommonVideos),
Filter = "Video file(*.avi;*.mp4;*.mov)|*.avi;*.mp4;*.mov|All file(*.*)|*.*",
FilterIndex = 0,
Title = "Select a video"
};
if (ofd.ShowDialog() == DialogResult.OK)
{
videoOpen(ofd.FileName);}
}
フォルダを選択 FolderBrowserDialog
ファイルではなくフォルダーを選択させるためのダイアログです。
画像を出力するためのフォルダを選んだりといった使い方ができます。
ファイルを保存する SaveFileDialog
ファイルを保存するときのダイアログです。ファイルを開くダイアログに似てますが、こちらは「保存」ボタンとなります。
まずSaveFileDialog オブジェクトを作成。
ファイル名(FileName)、最初に開くディレクトリ(InitialDirectory )、拡張子(Filter )、ダイアログ名(Title)などを指定します。
ShowDialog() が実行されてOKだったら、「sfd.FileName」でパスを取得できます。
SaveFileDialog sfd = new SaveFileDialog()
{FileName = "temp.jpg",
InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
Filter = "JPEG(*.jpg)|*.jpg",
FilterIndex = 0,
Title = "Create jpg file",
RestoreDirectory = true
};if (sfd.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}
ファイル用のツールはツールボックスにも用意されています。それを使って同じようなプログラムを書くこともできます。
ファイルの不具合
ファイルの読み込みがうまくいない?
ファイルの読み込みは、「ファイルのパス名が違う」「ファイルが破損等で読み込めない」 などのエラーが起きやすいです。
そこでtry、catch型の構文を使って、エラーが起きた時の処理を書いたり、最終的には開いたファイルをちゃんとクローズするといった処理を書けるようにしましょう。
String fileName = @"c:\_work\sample.txt";
System.IO.StreamReader sr = new System.IO.StreamReader(fileName,
System.Text.Encoding.GetEncoding("shift_jis"));
try{ String s = sr.ReadToEnd();
}
catch (Exception)
{
MessageBox.Show("エラー!");
}
finally
{
if (sr != null)
{
sr.Close();
}
}