ファイルの操作方法について知りたい。。。
ファイルの作成、コピー、移動、削除、パスの取得などの操作は、C# では .NET に標準で用意されている System.IO.File クラスを使います。
アプリケーションの開発ではファイルを操作する機会は多く、よく使うものを1つの記事に纏めてみました。サンプルコードも紹介していますので、参考にしてみて下さい。
フォルダの操作についても知りたい方は、次のリンクから確認してみて下さい。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
ファイルを操作するには
C#ではファイル(File)に関する操作を行えるいくつかのクラスが用意されています。
まず、ファイルの作成、コピー、移動、削除、ファイルの存在確認など一般的な操作には File クラスを使用します。全てのメソッドは静的メソッドで、メソッドの引数には必ずファイルの名前またはパスを指定します。
ファイルの読み書きは File クラスでも行えますが、StreamReader クラスや StreamWriter クラスでも行えます。テキストファイルやCSVファイル等の読み書きができます。
ファイルの作成日や更新日、容量などの情報を取得するには FileInfo クラスを使います。
これらのクラスは全て System.IO という名前空間に定義されています。
フォルダの操作まとめ
Visual Studio を起動して新規プロジェクトを作成します。ここではプロジェクト名を FileSample とします。
ファイルに関するクラスは「System.IO」名前空間に存在するので、コード先頭のusingディレクティブに以下を追加しておきましょう。
using System.IO;
System.IO にはファイルの他にフォルダを操作するためのクラスも提供されています。
ファイルを作成する
ファイルを作成または上書きする場合は Create メソッドを使います。
第1引数はファイルの名前またはパスを指定します。ファイルの名前を指定した場合は、アプリケーションの実行ファイルがある場所に作成されます。
Create(ファイル名);
以下のコードは空(容量 0 KB)の Sample テキストファイルを作成するサンプルです。もし、ファイルが既に存在した場合、ファイルは上書きされます。
// Sample.txtを作成する
using (File.Create("Sample.txt")) { }
実行するとファイルが作成されます。
Create メソッドの戻り値である FileStream は、ファイルの読み取りと書き込みの操作をサポートしています。
次の例では、指定した名前でファイルを作成し、ファイルに情報を書き込みます。
using (var fileStream = File.Create("Sample.txt"))
{
//書き込み
byte[] info = new UTF8Encoding().GetBytes("ここにはファイルのコンテンツを書きます");
fileStream.Write(info, 0, info.Length);
}
ファイルをコピーする
ファイルをコピーする場合は Copy メソッドを使います。
第1引数はファイルの名前またはパスを指定します。第2引数はコピー先のファイルの名前またはパスを指定します。
Copy(コピー元のファイル名, コピー先のファイル名);
以下のコードSample.txt を Sample_copy.txt へコピーするサンプルです。もし、コピー元が存在しない場合は、FileNotFoundException 例外が発生します。また、コピー先のファイルが既に存在する場合は、IOException 例外が発生します。
// コピーする
File.Copy("Sample.txt", "Sample_copy.txt");
コピー先のファイルが既に存在した場合、第3引数を true にすることで上書き保存ができます。これにより、既存のファイルへコピーされ、IOException 例外は発生しません。
// コピーする
File.Copy("Sample.txt", "Sample_copy.txt", true);
ファイルを移動する(名前を変更する)
ファイルを移動する場合は Move メソッドを使います。
第1引数は移動元となるファイルの名前またはパスを指定します。第2引数は移動先となるファイルの名前またはパスを指定します。
Move(移動元のファイル名, 移動先のファイル名);
このメソッドは、別のドライブへ移動することはできないので注意しましょう。同じドライブ内でしか移動ができません。
Copy メソッドと同様で、コピー元が存在しない場合は、FileNotFoundException 例外が発生します。また、コピー先のファイルが既に存在する場合は、IOException 例外が発生します。
以下のコードは Sample.txt から Temp.txt へ移動するサンプルです。移動するというよりは名前を変更すると言った方が正しいかもしれません。
// Sample.txtをTemp.txtへ移動する(名前を変更する)
File.Move("Sample.txt", "Temp.txt");
移動先のファイルが既に存在した場合、第3引数を true にすることで上書き保存ができます。これにより、既存のファイルが移動され、IOException 例外は発生しません。
// コピーする
File.Move("Sample.txt", "Sample_copy.txt", true);
ファイルを削除する
ファイルを削除する場合は Delete メソッドを使います。
第1引数はファイルの名前またはパスを指定します。このメソッドは他のメソッドとは異なり、指定したファイルが存在しなくても例外が発生しません。
DeleteDelete(ファイル名);
以下のコードは Sample.txt を削除するサンプルです。
// 削除する
File.Delete("Sample");
ファイルの存在確認をする
ファイルの存在確認をする場合は Exists メソッドを使います。
第1引数はファイルの名前またはパスを指定します。ここで指定したファイルの名前またはパスが存在するかどうかを確認できます。
戻り値はファイルが存在するかどうかの結果です。true ならファイルは存在し、false ならファイルは存在しないか判定中にエラーが発生しています。
ファイルの有無 = Exists(ファイル名);
以下のコードは Sample.txt が存在するかどうかをチェックするサンプルです。
if (File.Exists("Sample.txt"))
{
Debug.WriteLine("ファイルは存在します");
}
else
{
Debug.WriteLine("ファイルは存在しません");
}
ファイルの読み取りをする
ファイルの中身を読み込む場合は File クラスに定義されている Read 系のメソッドを使います。
ファイルの中身を1行ずつ読み込みなら ReadLines、すべて読み込むなら ReadAllText を使うといいでしょう。
- ReadLines(ファイル名);
- ReadAllText(ファイル名);
以下のコードは Sample.txt のデータを読み取るサンプルです。
// 1行ずつ読み込み
foreach (string line in File.ReadLines("Sample.txt"))
{
Debug.WriteLine(line);
}
// 1度に全て読み込み
string readText = File.ReadAllText("Sample.txt");
Debug.WriteLine(readText);
ファイルの読み込みは StreamReader クラスでも行えます。
このクラスを使ったファイルの読み込み方法は次の記事を参考にしてみてください。
ファイルの書き込みをする
ファイルに何かを書き込む場合は File クラスに定義されている WriteAllText メソッドや AppendAllLines メソッドを使います。
ファイルに文字列を書き込むなら WriteAllText、コレクションの要素を1行ずつ書き込むなら AppendAllLines を使うといいでしょう。どちらのメソッドもターゲットになるファイルが存在しない場合は、ファイルを作成してから書き込みをします。
また、AppendAllLinesは既存ファイルがある場合は末尾の行に追加します。そのため元のデータは消去されません。
- WriteAllText(ファイル名, 書き込む文字列);
- AppendAllLines(ファイル名, 書き込むコレクション);
以下のコードは Sample.txt にデータを書き込むサンプルです。
//文字列の書き込み
File.WriteAllText("Sample.txt", "文字列");
// コレクションの書き込み
var contents = new string[] { "要素1", "要素2", "要素3" };
File.AppendAllLines("Sample.txt", contents);
WriteAllText で書き込みした後、AppendAllLines で更に同じファイルへ書き込みしていますが、初めに書き込みしたデータが残っていることが上記の結果から分かります。AppendAllLines は元データを残して書き込みしたい時に使えそうです。
ファイルの読み込みは StreamWriter クラスでも行えます。
このクラスの使い方は上のリンクを参考にしてください。
ファイルの情報を取得する
ファイルのパスや拡張子、容量などファイルに関する情報を取得したい場合は、FileInfo クラスのプロパティを利用します。
FileInfo の引数にファイルの名前またはパスを指定してインスタンスを生成して、欲しい情報を持っているプロパティを呼び出すと取得できます。
下のコードは Sample.txt の情報を取得するサンプルです。
var info = new FileInfo("Sample.txt");
//ファイル名と拡張子
Debug.WriteLine($"FileInfo Name = {info.Name}");
//ドライブ名 フォルダパス ファイル名 拡張子
Debug.WriteLine($"FileInfo FullName = {info.FullName}");
//ドライブ名 フォルダパス
Debug.WriteLine($"FileInfo DirectoryName = {info.DirectoryName}");
Debug.WriteLine($"FileInfo DirectoryName = {info.FullName.Replace(info.Name, "")}");
//ファイルがあるフォルダ名のみ取得
Debug.WriteLine($"FileInfo Directory.Name = {info.Directory.Name}");
//拡張子
Debug.WriteLine($"FileInfo Extension = {info.Extension}");
//拡張子なしのファイル名
Debug.WriteLine($"FileInfo Name only = {info.Name.Replace(info.Extension, "")}");
//ファイルのサイズ
Debug.WriteLine($"FileInfo Size = {info.Length} bytes");
//ファイルが読み取り専用かどうか
Debug.WriteLine($"FileInfo read only = {(info.IsReadOnly ? "yes" : "no")}");
//ファイルの作成日時
Debug.WriteLine($"FileInfo Creation time = {info.CreationTime}");
//ファイルの最終更新日時
Debug.WriteLine($"FileInfo Last write time = {info.LastWriteTime}");
実行すると次のような結果になります。
FileInfo Name = Sample.txt
FileInfo FullName = C:\FileSample\Sample.txt
FileInfo DirectoryName = C:\FileSample
FileInfo DirectoryName = C:\FileSample
FileInfo Directory.Name = FileSample
FileInfo Extension = .txt
FileInfo Name only = Sample
FileInfo Size = 38 bytes
FileInfo read only = no
FileInfo Creation time = 2023/03/23 12:00:00
FileInfo Last write time = 2023/03/23 13:30:30
使用例
次のコードでは、ファイルの作成、移動、削除を行う簡単なサンプルを記述しています。
ファイルの操作は比較的エラーの起きやすい処理です。ファイル操作中にエラーが発生して例外がスローされた場合に備えて、try-catch 文を記述して例外に対する処理を行っておきましょう。
// バックアップフォルダのパス
var currentDirectory = Directory.GetCurrentDirectory();
var backupDirectory = Path.Combine(currentDirectory, "Backup");
try
{
// バックアップのフォルダ作成
Directory.CreateDirectory(backupDirectory);
// ファイルの作成と書き込み
for (int i = 1; i <= 5; i++)
{
File.WriteAllText($"Sample_{i}.txt", $"カウント:{i}");
}
// テキストファイル一覧取得
var txtFiles = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.txt");
// ファイルのコピー
foreach (var txtFile in txtFiles)
{
// コピー先のファイル名
var copyFileName = txtFile.Substring(currentDirectory.Length + 1);
// コピー先のファイル名作成
var copyFullFileName = Path.Combine(backupDirectory, copyFileName);
// コピー先に同じファイル名が存在するかどうか確認
if (!File.Exists(copyFileName))
{
// バックアップフォルダへコピー
File.Copy(txtFile, copyFullFileName);
}
// ファイルの読み込み
var readText = File.ReadAllText(copyFullFileName);
Debug.WriteLine(readText);
}
foreach (var txtFile in txtFiles)
{
File.Delete(txtFile);
}
}
catch (Exception ex)
{
Debug.WriteLine($"例外: {ex.Message}");
}
まとめ
この記事では、ファイルの作成、コピー、移動、削除、パスの取得などの操作方法を紹介しました。
C# では .NET に標準で用意されている System.IO.File クラスを使うことで、お手軽にファイル操作が可能です。ファイル操作する機会があれば参考にしてみて下さい。
以上、最後まで読んで頂きありがとうございました。