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
35m 07s
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();
}
}
}Imports 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";Dim rootPath As String = "C:\temp\demos\filesystem"他解释说,@符号允许在路径中使用反斜杠而无需对它们进行转义。
Tim演示了如何使用Directory.GetDirectories方法检索指定根路径内的所有目录。
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)
Next该代码将打印根目录下所有子目录的完整路径。

为了在搜索中包含子目录,Tim在GetDirectories方法中添加了一个搜索模式和搜索选项。
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)
Next这一修改可确保所有嵌套子目录都包含在搜索中。
Tim展示了如何使用Directory.GetFiles方法检索目录类和指定根路径中的所有文件。
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)
Next该代码将打印根目录及其子目录中所有文件的完整路径。

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
}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
Next本代码片段演示了如何提取和打印指定路径下同一文件的不同部分。
Tim在(12:10)展示了如何使用FileInfo类检索有关文件的详细信息。 这包括获取文件大小、最后访问时间、创建时间和其他属性。
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")
Next此代码片段将打印文件名及其大小(以字节为单位)。 Tim 提到,您可以通过重复除以 1024 将此大小转换为千字节或兆字节。
他进一步解释说,FileInfo类提供其他有用的属性:
LastWriteTime:文件最后一次被修改的时间。
LastAccessTime:文件最后一次被访问的时间。
CreationTime:文件的创建时间。
Attributes:文件的属性,如只读或归档。
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");
}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 If这段代码将检查目录是否存在,并打印相应的信息。
Tim解释了如何使用Directory.CreateDirectory方法创建一个新的目录。 如果指定路径下的所有目录和子目录都不存在,则使用此方法创建这些目录和子目录。
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")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);
}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)
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 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等。
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 ex As IOException
Console.WriteLine($"File already exists: {ex.Message}")
End Try这种方法有助于安全地管理文件副本和处理文件不应被覆盖的情况。
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);
}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)
Next这段代码将文件从根目录移动到subfolderA,并从源目录中删除它们。
Tim 鼓励开发人员思考可以使用 C# 自动执行文件系统任务和创建实用程序的各种方法。 他建议从简单的任务开始,逐步建立更复杂的自动化解决方案。
实用程序示例:
清理临时文件:自动删除临时文件以释放空间。
备份到外部驱动器:创建一个备份工具,将重要文件复制到外部驱动器。
项目文件夹同步:在计算机和优盘之间同步项目文件夹,确保始终备份和恢复最新更改。
Tim Corey 对 C# 中文件系统操作的探索为自动执行文件任务和管理目录提供了实用的见解。 按照他的示例,开发人员可以高效地自动执行日常文件管理任务并创建自定义实用程序。
要深入理解并查看这些概念的实际应用,我强烈建议您观看 Tim Corey 关于 File System 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