導入
設定・ログ・CSV——実務ではファイルの読み書きが欠かせません。C#ではSystem.IO名前空間のFile・StreamReader・Path・Directoryで扱います。ブラウザ内実行はセキュリティ上ファイルシステムに触れないため、この回は手元のVisual Studio / dotnet CLIで動かします。
図解
flowchart LR
APP["あなたのプログラム"] -->|WriteAllText| F["ファイル notes.txt"]
F -->|ReadAllText| APP
PATH["Path.Combine で<br/>OS差を吸収した安全なパス"] -.-> F
サンプル
using System.IO;
// 書き込み(丸ごと)
string path = Path.Combine(Directory.GetCurrentDirectory(), "notes.txt");
File.WriteAllText(path, "1行目\n2行目");
// 読み込み(丸ごと)
string all = File.ReadAllText(path);
Console.WriteLine(all);
// 1行ずつ読む(大きなファイル向け)
foreach (string line in File.ReadAllLines(path))
Console.WriteLine($"> {line}");
// 追記
File.AppendAllText(path, "\n3行目を追記");
// 存在確認・ディレクトリ作成
if (!Directory.Exists("logs")) Directory.CreateDirectory("logs");
Console.WriteLine(File.Exists(path)); // True
手を動かす(ローカル)
dotnet new console -o FileDemoでコンソールアプリを作り、cd FileDemoProgram.csに上のサンプルを貼り付けてdotnet run- 生成された
notes.txtをエディタで開き、書き込んだ内容を確認する File.ReadAllTextとFile.ReadAllLinesの違い(丸ごと文字列 / 行の配列)を見比べる
補足
Path.CombineはOSごとの区切り文字(\と/)の違いを吸収する。パスは文字列連結せず必ずこれを使う- 大きなファイルを1行ずつ処理するなら
StreamReader+using(finally/using)でストリームを確実に閉じる - 相対パスは「実行時のカレントディレクトリ」基準。意図しない場所を読まないよう絶対パスを意識する
まとめ
- ファイルの丸ごと読み書きは
File.ReadAllText/WriteAllText、行単位はReadAllLines - パスは
Path.Combine、フォルダはDirectoryで扱う - ブラウザでは動かないので、標準ライブラリの
System.IOはローカルで試す
次回: 日付と時刻の扱い(ブラウザ実施に戻ります)です。