クリエイターの教科書

ChatGPT, Stable Diffusion, Visual Studio, Excelなど教科書

【Visual Studioの教科書】C#でファイルを扱うには?ファイルダイアログを使うには?

C#でのファイルの取り扱い方についてまとめていきます。

ファイルを扱うプログラミング 

William and Holly in Westlake

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ファイルが使えるようになります。

f:id:apicode:20190730105725p:plain

 

 

ファイルダイアログを利用する 

 

 

ファイルを選択する OpenFileDialog

ファイルを開くときに使うダイアログです。対応拡張子を指定することもできます。 

f:id:apicode:20191205191903p:plain

 

プログラムはまず「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

ファイルではなくフォルダーを選択させるためのダイアログです。

画像を出力するためのフォルダを選んだりといった使い方ができます。

f:id:apicode:20191205134912p:plain

 

ファイルを保存する SaveFileDialog

ファイルを保存するときのダイアログです。ファイルを開くダイアログに似てますが、こちらは「保存」ボタンとなります。

f:id:apicode:20191205191939p:plain

 

まず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);
}

 

ファイル用のツールはツールボックスにも用意されています。それを使って同じようなプログラムを書くこともできます。

f:id:apicode:20200821093833p:plain

 

 

 

ファイルの不具合

ファイルの読み込みがうまくいない?

ファイルの読み込みは、「ファイルのパス名が違う」「ファイルが破損等で読み込めない」 などのエラーが起きやすいです。

 

そこで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();
}
}

このブログは、ネットや書籍上の情報、個人の体験や感想を中心にまとめたものです。 正確性を期していはいますが、間違い・誤訳等あるかもしれません。 当サイトの情報によって生じたいかなる損失について一切の責任を負わないものとします. あらかじめご了承ください。

プライバシーポリシー |〇利用規約 |〇問い合わせ