本文へスキップ
BecomeCoder

C#文法コース · 第8章 標準ライブラリの必需品 · レッスン55

ファイルとテキスト入出力(ローカル実施)

ローカル実施

導入

設定・ログ・CSV——実務ではファイルの読み書きが欠かせません。C#ではSystem.IO名前空間のFileStreamReaderPathDirectoryで扱います。ブラウザ内実行はセキュリティ上ファイルシステムに触れないため、この回は手元の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

手を動かす(ローカル)

  1. dotnet new console -o FileDemo でコンソールアプリを作り、cd FileDemo
  2. Program.csに上のサンプルを貼り付けてdotnet run
  3. 生成されたnotes.txtをエディタで開き、書き込んだ内容を確認する
  4. File.ReadAllTextFile.ReadAllLinesの違い(丸ごと文字列 / 行の配列)を見比べる

補足

  • Path.CombineOSごとの区切り文字(\/)の違いを吸収する。パスは文字列連結せず必ずこれを使う
  • 大きなファイルを1行ずつ処理するならStreamReaderusing(finally/using)でストリームを確実に閉じる
  • 相対パスは「実行時のカレントディレクトリ」基準。意図しない場所を読まないよう絶対パスを意識する

まとめ

  • ファイルの丸ごと読み書きはFile.ReadAllText/WriteAllText、行単位はReadAllLines
  • パスはPath.Combine、フォルダはDirectoryで扱う
  • ブラウザでは動かないので、標準ライブラリのSystem.IOはローカルで試す

次回: 日付と時刻の扱い(ブラウザ実施に戻ります)です。