Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
35分07秒
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();
}
}
}Imports System
Imports System.IO
Namespace FileSystemDemo
Module Program
Sub Main(args As String())
Console.ReadLine()
End Sub
End Module
End NamespaceImports System
Imports System.IO
Namespace FileSystemDemo
Module Program
Sub Main(args As String())
Console.ReadLine()
End Sub
End Module
End NamespaceTimは、デモ用にシステム上の特定のディレクトリを指すルートパス変数を設定します。
string rootPath = @"C:\temp\demos\filesystem";string rootPath = @"C:\temp\demos\filesystem";Dim rootPath As String = "C:\temp\demos\filesystem"Dim rootPath As String = "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);
}Dim directories As String() = Directory.GetDirectories(rootPath)
For Each directory As String In directories
Console.WriteLine(directory)
NextDim directories As String() = Directory.GetDirectories(rootPath)
For Each directory As String In directories
Console.WriteLine(directory)
Nextこのコードは、ルートディレクトリ内のすべてのサブディレクトリのフルパスを表示します。

検索にサブディレクトリを含めるために、ティムは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);
}Dim allDirectories As String() = Directory.GetDirectories(rootPath, "*", SearchOption.AllDirectories)
For Each directory As String In allDirectories
Console.WriteLine(directory)
NextDim allDirectories As String() = Directory.GetDirectories(rootPath, "*", SearchOption.AllDirectories)
For Each directory As String In allDirectories
Console.WriteLine(directory)
Nextこの修正により、すべてのネストしたサブディレクトリが検索に含まれるようになります。
ティムは、ディレクトリクラスと指定したルートパス内のすべてのファイルを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);
}Dim files As String() = Directory.GetFiles(rootPath, "*.*", SearchOption.AllDirectories)
For Each file As String In files
Console.WriteLine(file)
NextDim files As String() = Directory.GetFiles(rootPath, "*.*", SearchOption.AllDirectories)
For Each file As String In files
Console.WriteLine(file)
Nextこのコードは、ルートディレクトリとそのサブディレクトリ内のすべてのファイルのフルパスを表示します。

ティムは、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
}For Each file As String 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
NextFor Each file As String 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
Nextこのコード・スニペットは、指定されたパスにある同じファイルの異なる部分を抽出して印刷する方法を示しています。
ティムは(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");
}For Each file As String In files
Dim info As New FileInfo(file)
Console.WriteLine($"{Path.GetFileName(file)}: {info.Length} bytes")
NextFor Each file As String In files
Dim info As New FileInfo(file)
Console.WriteLine($"{Path.GetFileName(file)}: {info.Length} bytes")
Nextこのコード・スニペットは、ファイル名とそのサイズをバイト単位で表示します。 ティムは、このサイズを1024で繰り返し割ることでキロバイトやメガバイトに変換できると述べている。
彼はさらに、FileInfoクラスが他にも有用なプロパティを提供していることを説明します。
LastWriteTime: ファイルが最後に変更された時間。
LastAccessTime: ファイルが最後にアクセスされた時間。
CreationTime: ファイルの作成時間。
Attributes: 読み取り専用やアーカイブなどのファイル属性。
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");
}Dim newPath As String = "C:\temp\demos\filesystem\subfolderC"
If Directory.Exists(newPath) Then
Console.WriteLine("Directory exists")
Else
Console.WriteLine("Directory does not exist")
End IfDim newPath As String = "C:\temp\demos\filesystem\subfolderC"
If Directory.Exists(newPath) Then
Console.WriteLine("Directory exists")
Else
Console.WriteLine("Directory does not exist")
End Ifこのコードは、ディレクトリの存在をチェックし、適切なメッセージを表示します。
ティムは、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");Dim newPath As String = "C:\temp\demos\filesystem\subfolderC\sub-subfolderD"
Directory.CreateDirectory(newPath)
Console.WriteLine("Directories created")Dim newPath As String = "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);
}Dim files As String() = Directory.GetFiles(rootPath)
Dim destinationFolder As String = Path.Combine(rootPath, "subfolderA")
For Each file As String In files
Dim destFile As String = Path.Combine(destinationFolder, Path.GetFileName(file))
File.Copy(file, destFile, True)
NextDim files As String() = Directory.GetFiles(rootPath)
Dim destinationFolder As String = Path.Combine(rootPath, "subfolderA")
For Each file As String In files
Dim destFile As String = Path.Combine(destinationFolder, Path.GetFileName(file))
File.Copy(file, destFile, True)
Nextこの例では、ルートディレクトリから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);
}For i As Integer = 0 To files.Length - 1
Dim destFile As String = Path.Combine(destinationFolder, $"{i}.txt")
File.Copy(files(i), destFile, True)
NextFor i As Integer = 0 To files.Length - 1
Dim destFile As String = Path.Combine(destinationFolder, $"{i}.txt")
File.Copy(files(i), destFile, True)
Nextこのコードは、ファイルを宛先ディレクトリにコピーし、連番で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}");
}Try
File.Copy(sourceFile, destFile, False)
Catch ex As IOException
Console.WriteLine($"File already exists: {ex.Message}")
End TryTry
File.Copy(sourceFile, destFile, False)
Catch ex As IOException
Console.WriteLine($"File already exists: {ex.Message}")
End Tryこのアプローチは、ファイルのコピーを安全に管理し、ファイルを上書きしてはならない状況に対処するのに役立ちます。
ティムは(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);
}Dim files As String() = Directory.GetFiles(rootPath)
Dim destinationFolder As String = Path.Combine(rootPath, "subfolderA")
For Each file As String In files
Dim destFile As String = Path.Combine(destinationFolder, Path.GetFileName(file))
File.Move(file, destFile)
NextDim files As String() = Directory.GetFiles(rootPath)
Dim destinationFolder As String = Path.Combine(rootPath, "subfolderA")
For Each file As String In files
Dim destFile As String = Path.Combine(destinationFolder, Path.GetFileName(file))
File.Move(file, destFile)
Nextこのコードは、ルートディレクトリからsubfolderAにファイルを移動し、ソースディレクトリから削除します。
Timは、ファイルシステムのタスクを自動化し、ユーティリティ・アプリケーションを作成するためにC#を使用できるさまざまな方法を考えるよう、開発者に勧めています。 簡単な作業から始め、徐々に複雑な自動化ソリューションを構築していくことを提案している。
ユーティリティアプリの例
一時ファイルのクリーンアップ:一時ファイルを削除するプロセスを自動化し、空き領域を確保します。
外付けドライブへのバックアップ:重要なファイルを外付けドライブにコピーするバックアップツールを作成します。
プロジェクトフォルダの同期:コンピュータとUSBメモリ間でプロジェクトフォルダを同期し、常に最新の変更がバックアップされ、復元されるようにします。
ティム・コーリーによるC#でのファイルシステム操作の探求は、ファイルタスクの自動化とディレクトリ管理の実用的な洞察を提供します。 彼の例に従うことで、開発者は日常的なファイル管理タスクを効率的に自動化し、カスタム・ユーティリティ・アプリケーションを作成することができます。
これらの概念をより深く理解し、実際に見るには、ティム・コーリーのビデオのファイル システム in C#をぜひご覧ください。 彼の詳細なウォークスルーと実用的な例は、理解を深め、独自のファイル管理アプリケーションを構築するのに役立ちます。
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Join our newsletter, you’ll get exclusive access on article updates. We value your privacy