掌握 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 Framework 而不是 .NET Core。
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";他解释说,@符号允许在路径中使用反斜杠而不需要转义它们。
读取路径中的所有目录
Tim演示了如何使用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);
}该代码将打印根目录下所有子目录的完整路径。

递归读取子目录
为了在搜索中包含子目录,Tim在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);
}这一修改可确保所有嵌套子目录都包含在搜索中。
读取路径中的所有文件
Tim展示了如何使用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);
}该代码将打印根目录及其子目录中所有文件的完整路径。

提取文件名和路径
Tim解释了如何使用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
}本代码片段演示了如何提取和打印指定路径下同一文件的不同部分。
检索文件信息
Tim在(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");
}此代码片段将打印文件名及其大小(以字节为单位)。 Tim 提到,您可以通过重复除以 1024 将此大小转换为千字节或兆字节。
他进一步解释道,FileInfo类提供了其他有用的属性:
LastWriteTime:文件最后修改的时间。LastAccessTime:文件最后访问的时间。CreationTime:文件的创建时间。Attributes:文件属性,如只读或存档。
Automating File System Tasks with C
Tim 在(15:11)讨论了如何使用 C# 自动执行各种文件系统任务。 这可能包括创建目录、验证文件或目录的存在以及其他重复性任务。
验证目录是否存在
Tim展示了如何使用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");
}这段代码将检查目录是否存在,并打印相应的信息。
创建新目录
Tim解释了如何使用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 演示了这种方法在不覆盖任何现有文件或目录的情况下创建指定路径及其子目录。
复制文件
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等。
处理文件重写
Tim解释了如何通过将覆盖参数设置为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}");
}这种方法有助于安全地管理文件副本和处理文件不应被覆盖的情况。
移动文件
Tim在(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# 自动执行文件系统任务和创建实用程序的各种方法。 他建议从简单的任务开始,逐步建立更复杂的自动化解决方案。
实用程序示例:
清理临时文件:自动删除临时文件以释放空间。
备份到外部驱动器:创建一个备份工具,将重要文件复制到外部驱动器。
- 项目文件夹同步:在计算机和优盘之间同步项目文件夹,确保始终备份和恢复最新更改。
结论
Tim Corey 对 C# 中文件系统操作的探索为自动执行文件任务和管理目录提供了实用的见解。 按照他的示例,开发人员可以高效地自动执行日常文件管理任务并创建自定义实用程序。
要深入理解并查看这些概念的实际应用,我强烈建议您观看 Tim Corey 关于 File System in C# 的完整 视频。 他详细的演练和实用的示例将帮助您巩固理解,并使您有能力构建自己的文件管理应用程序。

