目次
経緯
これまでCSVファイルを読み込む際に**絶対パス(フルパス)**を使っていましたが、
他の人が同じコードを実行する際に、環境依存でエラーが発生しやすいと感じました。
そこで今回は、相対パスでCSVファイルを読み込む方法を学習しました。
相対パスを使用すれば、環境に依存せずどのPCでも動く柔軟なコードを作ることができます。
使用環境と前提条件
- Windows Forms アプリケーション
- 読み込むCSVファイルは、プロジェクト直下の
data
フォルダ内に配置 - 読み込む対象はすべての
.csv
ファイル(拡張子指定も可能)
実装コード:相対パスを使ってCSVを読み込む
以下は、フォームに設置したボタン btnReadcsv
をクリックしたときに、
プロジェクト内の data
フォルダからCSVファイルを読み込むコード例です。
private void btnReadcsv_Click(object sender, EventArgs e)
{
// 実行ファイルの2階層上(プロジェクトのルート)を取得
string projectDir = Directory.GetParent(Environment.CurrentDirectory).Parent.FullName;
// プロジェクト直下の data フォルダを指定
string dataDir = Path.Combine(projectDir, "data");
// data フォルダ内のすべてのCSVファイルを取得
var files = Directory.GetFiles(dataDir, "*.csv");
foreach (var file in files)
{
// ファイル内のすべての行を読み込む
var lines = File.ReadAllLines(file);
foreach (var line in lines)
{
var values = line.Split(',');
// 必要な処理をここに記述(例:データ表示や加工)
}
}
}
このコードのポイント
Directory.GetParent(Environment.CurrentDirectory).Parent.FullName
→ アプリケーションの実行フォルダから2つ上の階層(=プロジェクトのルート)を取得Path.Combine()
でディレクトリを結合し、環境に依存しない形式でパスを構築.csv
拡張子を指定して、対象ファイルを限定
応用例
- 別フォルダ(例:
resources
、input
)への対応も容易 - データロギング、CSVによる初期設定読込処理などにも応用可能
- 開発時とリリース時の環境差異にも強い構造
注意点
- 相対パスでアクセスするディレクトリ(例:
data
)は、プロジェクトと一緒に配布する必要があります - 実行時にフォルダが存在しない場合、エラーになります。必要に応じて
Directory.Exists()
で存在チェックを加えると安全です ReadAllLines()
ではすべての行を一度にメモリに読み込むため、非常に大きなファイルにはReadLines()
の使用が推奨されます
まとめ
相対パスを使えば、環境依存のない柔軟なファイル読み込み処理が実現できます。
特にチーム開発や複数PCでのアプリ共有を行う場合には必須の知識です。
今後もCSVファイルを扱う機会があれば、ぜひ相対パスでの読み込みをベースに設計してみてください。
最後までお読みいただきありがとうございました。