MicrosoftlearnにてC#におけるディレクトリ操作を学んだのでアウトプットしていきます。
※あくまで初学者の備忘録なので、御覧の方は参考程度にご覧ください。
学習ソース:Microsoft learn
この記事を執筆している時点での筆者の技術レベルは以下です。
- プログラミング学習1年ほど経過
- 来月から本業としてエンジニア
- プログラミングを学習するまでPCは趣味程度
- PHP・Python・Java・C#の基礎が軽く分かる
それでは、学習内容をアウトプットしていきます。
1. ディレクトリとパスの操作
現在のディレクトリを取得する
カレントディレクトリ(アプリケーションが実行されているディレクトリ)を取得するには、Directory.GetCurrentDirectory()
メソッドを使用します。
var currentDirectory = Directory.GetCurrentDirectory();
Console.WriteLine(currentDirectory);
特殊フォルダのパスを取得する
Windowsの「マイドキュメント」フォルダやLinuxのホームディレクトリなど、OSに依存する特殊なフォルダへのパスを取得するには、Environment.GetFolderPath()
メソッドを使用します。
string docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
パスの結合とプラットフォーム間の互換性
パスを結合する場合、単純に文字列連結すると、プラットフォーム間の互換性の問題が生じることがあります。これを回避するために、Path.Combine()
メソッドとPath.DirectorySeparatorChar
を使用します。
// OS間で互換性のあるパス区切り文字を使用
Console.WriteLine($"stores{Path.DirectorySeparatorChar}201");
// 出力例:
// Windows: stores\201
// macOS/Linux: stores/201
// より簡単な方法でパスを結合
Console.WriteLine(Path.Combine("stores", "201")); // 出力: stores/201(または stores\201)
2. ディレクトリ操作
ディレクトリの作成
Directory.CreateDirectory()
メソッドを使用すると、指定したパスにディレクトリを作成できます。親ディレクトリが存在しない場合は、自動的に作成されます。
// 階層的なディレクトリを一度に作成
Directory.CreateDirectory(Path.Combine(Directory.GetCurrentDirectory(), "stores", "201", "newDir"));
ディレクトリの存在確認
ディレクトリが存在するかどうかを確認するには、Directory.Exists()
メソッドを使用します。
bool doesDirectoryExist = Directory.Exists(filePath);
3. ファイル操作
ファイルの作成と書き込み
新しいファイルを作成し、内容を書き込むには、File.WriteAllText()
メソッドを使用します。
// カレントディレクトリにファイルを作成して内容を書き込む
File.WriteAllText(Path.Combine(Directory.GetCurrentDirectory(), "greeting.txt"), "Hello World!");
ファイル情報の取得
ファイルに関する詳細情報を取得するには、FileInfo
クラスを使用します。
string fileName = $"stores{Path.DirectorySeparatorChar}201{Path.DirectorySeparatorChar}sales{Path.DirectorySeparatorChar}sales.json";
FileInfo info = new FileInfo(fileName);
Console.WriteLine($"Full Name: {info.FullName} {Environment.NewLine}" +
$"Directory: {info.Directory} {Environment.NewLine}" +
$"Extension: {info.Extension} {Environment.NewLine}" +
$"Create Date: {info.CreationTime}");
ファイルの拡張子を取得
ファイル名から拡張子を取得するには、Path.GetExtension()
メソッドを使用します。
Console.WriteLine(Path.GetExtension("sales.json")); // 出力: .json
ファイルからデータを読み取る
ファイルの内容をすべて読み込むには、File.ReadAllText()
メソッドを使用します。
// ファイルの内容を文字列として読み込む
string content = File.ReadAllText($"stores{Path.DirectorySeparatorChar}201{Path.DirectorySeparatorChar}sales.json");
ファイルにデータを追加する
既存のファイルに内容を追加するには、File.AppendAllText()
メソッドを使用します。
// 既存のファイルに内容を追加する
File.AppendAllText($"salesTotalDir{Path.DirectorySeparatorChar}totals.txt", $"{data.Total}{Environment.NewLine}");
// totals.txt の内容
// 22385.32
// 22385.32
4. ファイル検索
ディレクトリ内のファイルを検索
特定のディレクトリ内のファイルを検索するには、Directory.EnumerateFiles()
メソッドを使用します。
IEnumerable<string> FindFiles(string folderName)
{
List<string> salesFiles = new List<string>();
// サブディレクトリを含むすべてのファイルを検索
var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
foreach (var file in foundFiles)
{
// 拡張子でフィルタリング
var extension = Path.GetExtension(file);
if (extension == ".json")
{
salesFiles.Add(file);
}
}
return salesFiles;
}
特定のファイル名パターンで検索
ファイル名の末尾などで検索する場合は、EndsWith()
メソッドが便利です。
IEnumerable<string> FindFiles(string folderName)
{
List<string> salesFiles = new List<string>();
var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
foreach (var file in foundFiles)
{
// ファイル名の末尾でフィルタリング
if (file.EndsWith("sales.json"))
{
salesFiles.Add(file);
}
}
return salesFiles;
}
5. JSONデータの処理
Newtonsoft.Jsonの導入
JSONデータを処理するために、NuGetパッケージマネージャーを使用して「Newtonsoft.Json」(Json.NET)を導入します。
// コマンドラインからパッケージをインストール
$ dotnet add package Newtonsoft.Json
// コードの先頭で名前空間をインポート
using Newtonsoft.Json;
JSONのデシリアライズ
JSONデータをC#オブジェクトに変換(デシリアライズ)するには、JsonConvert.DeserializeObject<T>()
メソッドを使用します。
// JSONファイルを読み込む
var salesJson = File.ReadAllText($"stores{Path.DirectorySeparatorChar}201{Path.DirectorySeparatorChar}sales.json");
// JSONをC#オブジェクトに変換
var salesData = JsonConvert.DeserializeObject<SalesTotal>(salesJson);
// データを使用する
Console.WriteLine(salesData.Total);
// データモデルクラス
class SalesTotal
{
public double Total { get; set; }
}
6. 実践例:売上データの集計
以下は、複数のJSONファイルから売上データを集計し、結果をファイルに出力する完全な例です。
using Newtonsoft.Json;
// 現在のディレクトリとパスを設定
var currentDirectory = Directory.GetCurrentDirectory();
var storesDirectory = Path.Combine(currentDirectory, "stores");
var salesTotalDir = Path.Combine(currentDirectory, "salesTotalDir");
// 出力ディレクトリを作成
Directory.CreateDirectory(salesTotalDir);
// JSONファイルを検索
var salesFiles = FindFiles(storesDirectory);
// 売上データを集計
var salesTotal = CalculateSalesTotal(salesFiles);
// 結果をファイルに追記
File.AppendAllText(Path.Combine(salesTotalDir, "totals.txt"), $"{salesTotal}{Environment.NewLine}");
// JSONファイルを検索するメソッド
IEnumerable<string> FindFiles(string folderName)
{
List<string> salesFiles = new List<string>();
var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
foreach (var file in foundFiles)
{
var extension = Path.GetExtension(file);
if (extension == ".json")
{
salesFiles.Add(file);
}
}
return salesFiles;
}
// 売上データを集計するメソッド
double CalculateSalesTotal(IEnumerable<string> salesFiles)
{
double salesTotal = 0;
foreach (var file in salesFiles)
{
string salesJson = File.ReadAllText(file);
SalesData? data = JsonConvert.DeserializeObject<SalesData?>(salesJson);
salesTotal += data?.Total ?? 0;
}
return salesTotal;
}
// データモデル(レコード型を使用した簡潔な定義)
record SalesData(double Total);
注意点: Json.NETを使用する際は、適切なnullチェックを行うことが重要です。C# 8.0以降では、null許容参照型(?
)とnull合体演算子(??
)を使用すると、より堅牢なコードを書くことができるそうです。
まとめ
この記事では、C#でのファイルシステム操作の基本から、ディレクトリの操作、ファイルの読み書き、JSON処理まで幅広く紹介しました。これらの知識を活用することで、より効率的なデータ処理アプリケーションを開発できるようになれるようにしていきます!