C#システムファイルのマスター
C#は、ファイルシステムと対話するための堅牢な機能を提供し、ファイル操作、ディレクトリ管理、情報検索などのタスクを可能にします。 動画"Working With The File System in C# - Managing Folders and Files"では、ティム・コーリー(Tim Corey)が C# を使用してファイルとディレクトリを操作する基本について説明します。
この記事は、C#におけるファイルシステム操作の包括的な概要を提供することを目的としており、タスクの自動化、ディレクトリの管理、ファイルの処理に不可欠なテクニックに焦点を当てています。
はじめに
C#では、System.IO名前空間は、ファイルシステムと対話するための強力なクラスを提供します。 これらのクラス、例えばDirectoryInfoなどは、ファイルを作成したり、データを読み取ったり、ファイルに書き込んだり、指定されたパスに指定されたファイルがすでに存在するかどうかを確認するといったさまざまなファイル操作を可能にします。 これらのクラスを使用すると、テキストファイル、バイナリファイル、およびさまざまな拡張子のファイルを扱うことができます。 Delete()のようなメソッドは、開発者がファイルやディレクトリを効果的に管理することを可能にします。
例えば、Fileクラスは、ファイルがすでに存在するかどうかを確認したり、新しいファイルを作成したり、異なるモード(読み取り、書き込み、または追加など)でファイルを開くための静的メソッドを含んでいます。 また、FileInfoクラスを使用して、ファイルの作成日時やフルパスなどの詳細情報を取得することもできます。 DirectoryInfoクラスは、ディレクトリを操作し、ファイルを取得したり、新しいディレクトリを作成したりすることを可能にします。 これらのクラスとメソッドは、既存ファイルと新規ファイルの両方を処理し、複数のファイルを管理し、さらにバイトレベルでファイルデータを処理する柔軟性を提供し、C#をファイルシステム操作のための強力なツールにしています。
ティムは、バックアップの作成、ファイルの整理、ファイル情報の取得など、ファイルタスクの自動化のためのC#の強力な機能を強調することから始めます。 彼は、実践的な例とトレーニングリソースを通じて、C#の学習を容易にするという目標を述べて、ビデオを紹介しています。
デモ コンソール アプリケーションの作成
Timはゼロから始め、.NET Frameworkを使って"FileSystemDemo"という新しいコンソールアプリケーションを作成します。 このデモでは、.NET Coreよりも.NET Frameworkを選択したことを強調しています。
using System;
using System.IO;
namespace FileSystemDemo
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
}using System;
using System.IO;
namespace FileSystemDemo
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
}ルートパスの設定
Timは、デモ用にシステム上の特定のディレクトリを指すルートパス変数を設定します。
string rootPath = @"C:\temp\demos\filesystem";string rootPath = @"C:\temp\demos\filesystem";彼は@記号が、パスでのバックスラッシュの使用をエスケープせずに許可することを説明します。
パス内のすべてのディレクトリを読み取ります
ティムはDirectory.GetDirectoriesメソッドを使用して、指定されたルートパス内のすべてのディレクトリを取得する方法を実演します。
string[] directories = Directory.GetDirectories(rootPath);
foreach (string directory in directories)
{
Console.WriteLine(directory);
}string[] directories = Directory.GetDirectories(rootPath);
foreach (string directory in directories)
{
Console.WriteLine(directory);
}このコードは、ルートディレクトリ内のすべてのサブディレクトリのフルパスを表示します。

再帰的にサブディレクトリを読み取る
ティムはGetDirectoriesメソッドに検索パターンと検索オプションを追加して、検索にサブディレクトリを含める方法を紹介します。
string[] allDirectories = Directory.GetDirectories(rootPath, "*", SearchOption.AllDirectories);
foreach (string directory in allDirectories)
{
Console.WriteLine(directory);
}string[] allDirectories = Directory.GetDirectories(rootPath, "*", SearchOption.AllDirectories);
foreach (string directory in allDirectories)
{
Console.WriteLine(directory);
}この修正により、すべてのネストしたサブディレクトリが検索に含まれるようになります。
パス内のすべてのファイルの読み取り
ティムはDirectory.GetFilesメソッドを使用して、ディレクトリクラスおよび指定されたルートパス内のすべてのファイルを取得する方法を示します。
string[] files = Directory.GetFiles(rootPath, "*.*", SearchOption.AllDirectories);
foreach (string file in files)
{
Console.WriteLine(file);
}string[] files = Directory.GetFiles(rootPath, "*.*", SearchOption.AllDirectories);
foreach (string file in files)
{
Console.WriteLine(file);
}このコードは、ルートディレクトリとそのサブディレクトリ内のすべてのファイルのフルパスを表示します。

ファイル名とパスを抽出する
ティムはPathクラスを使用してファイル名とパスを抽出する方法を説明します。 これには、拡張子を除いたファイル名と各ファイルのディレクトリ名の取得も含まれます。
foreach (string file in files)
{
Console.WriteLine(Path.GetFileName(file)); // File name with extension
Console.WriteLine(Path.GetFileNameWithoutExtension(file)); // File name without extension
Console.WriteLine(Path.GetDirectoryName(file)); // Directory name
}foreach (string file in files)
{
Console.WriteLine(Path.GetFileName(file)); // File name with extension
Console.WriteLine(Path.GetFileNameWithoutExtension(file)); // File name without extension
Console.WriteLine(Path.GetDirectoryName(file)); // Directory name
}このコード・スニペットは、指定されたパスにある同じファイルの異なる部分を抽出して印刷する方法を示しています。
ファイル情報の取得
ティムは(12:10)でFileInfoクラスを使用してファイルについて詳細な情報を取得する方法を実演します。 これには、ファイルサイズ、最終アクセス時刻、作成時刻、その他の属性の取得が含まれます。
foreach (string file in files)
{
FileInfo info = new FileInfo(file);
Console.WriteLine($"{Path.GetFileName(file)}: {info.Length} bytes");
}foreach (string file in files)
{
FileInfo info = new FileInfo(file);
Console.WriteLine($"{Path.GetFileName(file)}: {info.Length} bytes");
}このコード・スニペットは、ファイル名とそのサイズをバイト単位で表示します。 ティムは、このサイズを1024で繰り返し割ることでキロバイトやメガバイトに変換できると述べている。
彼はさらに、FileInfoクラスが他の便利なプロパティを提供することを説明します:
LastWriteTime: ファイルが最後に変更された日時。LastAccessTime: ファイルが最後にアクセスされた日時。CreationTime: ファイルの作成日時。Attributes: 読み取り専用やアーカイブなどのファイル属性。
Automating File System Tasks with C
15:11)のティムは、さまざまなファイルシステムのタスクを自動化するためにC#を使用する方法について説明します。 これには、ディレクトリの作成、ファイルやディレクトリの存在の確認、その他の反復作業が含まれます。
ディレクトリが存在するかどうかの確認
ティムはDirectory.Existsメソッドを使用してディレクトリが存在するかどうかを確認する方法を示します。 これは、操作を実行する前に必要なディレクトリが配置されていることを確認するのに役立ちます。
string newPath = @"C:\temp\demos\filesystem\subfolderC";
if (Directory.Exists(newPath))
{
Console.WriteLine("Directory exists");
}
else
{
Console.WriteLine("Directory does not exist");
}string newPath = @"C:\temp\demos\filesystem\subfolderC";
if (Directory.Exists(newPath))
{
Console.WriteLine("Directory exists");
}
else
{
Console.WriteLine("Directory does not exist");
}このコードは、ディレクトリの存在をチェックし、適切なメッセージを表示します。
新しいディレクトリの作成
ティムはDirectory.CreateDirectoryメソッドを使用して新しいディレクトリを作成する方法を説明します。 このメソッドは、指定されたパスにすべてのディレクトリとサブディレクトリが存在しない場合に作成します。
string newPath = @"C:\temp\demos\filesystem\subfolderC\sub-subfolderD";
Directory.CreateDirectory(newPath);
Console.WriteLine("Directories created");string newPath = @"C:\temp\demos\filesystem\subfolderC\sub-subfolderD";
Directory.CreateDirectory(newPath);
Console.WriteLine("Directories created");Tim は、このメソッドが、既存のファイルやディレクトリを上書きすることなく、指定されたパスとそのサブディレクトリを作成することを示します。
ファイルのコピー
ティムは(21:35)でFile.Copyメソッドを使用してファイルをあるディレクトリから別のディレクトリにコピーする方法を実演します。 ファイルをバックアップしたり、ファイルを別のフォルダに整理したりする際に役立ちます。
string[] files = Directory.GetFiles(rootPath);
string destinationFolder = Path.Combine(rootPath, "subfolderA");
foreach (string file in files)
{
string destFile = Path.Combine(destinationFolder, Path.GetFileName(file));
File.Copy(file, destFile, true);
}string[] files = Directory.GetFiles(rootPath);
string destinationFolder = Path.Combine(rootPath, "subfolderA");
foreach (string file in files)
{
string destFile = Path.Combine(destinationFolder, Path.GetFileName(file));
File.Copy(file, destFile, true);
}この例では、ファイルはルートディレクトリからtrueパラメータにより既存のファイルは上書きされます。
コピー中のファイル名の変更
Timはまた、インデックス付きのforループを使用して、コピープロセス中にファイル名を変更する方法を示しています。
for (int i = 0; i < files.Length; i++)
{
string destFile = Path.Combine(destinationFolder, $"{i}.txt");
File.Copy(files[i], destFile, true);
}for (int i = 0; i < files.Length; i++)
{
string destFile = Path.Combine(destinationFolder, $"{i}.txt");
File.Copy(files[i], destFile, true);
}このコードはファイルを宛先ディレクトリにコピーし、それらを1.txtなどとして順に名前を変更します。
ファイルの上書きを処理する
ティムは上書きなしで既存のファイルを処理し、例外を回避するために上書きパラメータをfalseに設定する方法を説明します。 これは、既存のファイルが上書きされるのを防ぎ、ファイルがすでに存在する場合は例外をスローします。
try
{
File.Copy(sourceFile, destFile, false);
}
catch (IOException ex)
{
Console.WriteLine($"File already exists: {ex.Message}");
}try
{
File.Copy(sourceFile, destFile, false);
}
catch (IOException ex)
{
Console.WriteLine($"File already exists: {ex.Message}");
}このアプローチは、ファイルのコピーを安全に管理し、ファイルを上書きしてはならない状況に対処するのに役立ちます。
ファイルの移動
ティムは(28:28)でFile.Moveメソッドを使用してファイルを移動する方法を実演します。 File.Moveメソッドには上書きオプションがなく、宛先ファイルがすでに存在すれば例外を投げます。
string[] files = Directory.GetFiles(rootPath);
string destinationFolder = Path.Combine(rootPath, "subfolderA");
foreach (string file in files)
{
string destFile = Path.Combine(destinationFolder, Path.GetFileName(file));
File.Move(file, destFile);
}string[] files = Directory.GetFiles(rootPath);
string destinationFolder = Path.Combine(rootPath, "subfolderA");
foreach (string file in files)
{
string destFile = Path.Combine(destinationFolder, Path.GetFileName(file));
File.Move(file, destFile);
}このコードは、ファイルをルートディレクトリからsubfolderAに移動し、ソースディレクトリから削除します。
ユーティリティアプリの作成
Timは、ファイルシステムのタスクを自動化し、ユーティリティ・アプリケーションを作成するためにC#を使用できるさまざまな方法を考えるよう、開発者に勧めています。 簡単な作業から始め、徐々に複雑な自動化ソリューションを構築していくことを提案している。
ユーティリティアプリの例
一時ファイルのクリーンアップ:一時ファイルを削除するプロセスを自動化し、空き領域を確保します。
外付けドライブへのバックアップ:重要なファイルを外付けドライブにコピーするバックアップツールを作成します。
- プロジェクトフォルダの同期:コンピュータとUSBメモリ間でプロジェクトフォルダを同期し、常に最新の変更がバックアップされ、復元されるようにします。
結論
ティム・コーリーによるC#でのファイルシステム操作の探求は、ファイルタスクの自動化とディレクトリ管理の実用的な洞察を提供します。 彼の例に従うことで、開発者は日常的なファイル管理タスクを効率的に自動化し、カスタム・ユーティリティ・アプリケーションを作成することができます。
これらの概念をより深く理解し、実際に見るには、ティム・コーリーのビデオのファイル システム in C#をぜひご覧ください。 彼の詳細なウォークスルーと実用的な例は、理解を深め、独自のファイル管理アプリケーションを構築するのに役立ちます。

