C# 复制文件
最后修改于 2025 年 4 月 22 日
本教程演示了如何使用 File.Copy 方法在 C# 中复制文件,该方法是 System.IO 命名空间的一部分。 学习如何高效地处理单个和多个文件的复制。
C# File.Copy 概要
public static void Copy(string sourceFileName, string destFileName);
此方法接受源文件路径和目标文件路径,并将源文件复制到指定的目标。
public static void Copy(string sourceFileName, string destFileName, bool overwrite);
重载方法包含一个 overwrite 布尔参数,如果设置为 true,则允许覆盖目标文件。
C# 复制文件示例
此示例演示了将单个文件复制到磁盘上的新位置。
var source = @"C:\Users\Jano\Documents\words.txt";
var destination = @"C:\Users\Jano\Documents\words_bck.txt";
File.Copy(source, destination);
Console.WriteLine("File copied");
此程序将文本文件从源路径复制到目标路径,并确认操作成功。
var source = @"C:\Users\Jano\Documents\words.txt"; var destination = @"C:\Users\Jano\Documents\words_bck.txt";
源和目标文件路径使用逐字字符串定义,以提高清晰度和平台兼容性。
File.Copy(source, destination);
File.Copy 方法执行复制操作,在目标位置创建一个新文件。
$ dotnet run File copied $ dotnet run Unhandled exception. System.IO.IOException: The file 'C:\Users\Jano\Documents\words_bck.txt' already exists. ...
在不覆盖的情况下运行该程序两次会导致异常,因为目标文件已存在。 使用带有 overwrite: true 的重载方法可以防止此问题。
C# 复制多个文件示例
此示例演示了将多个文本文件复制到备份目录。
string sourceDir = @"C:\Users\Jano\Documents\";
string backupDir = @"C:\Users\Jano\Documents\backup\";
string[] textFiles = Directory.GetFiles(sourceDir, "*.txt");
foreach (string textFile in textFiles)
{
string fileName = textFile.Substring(sourceDir.Length);
File.Copy(Path.Combine(sourceDir, fileName),
Path.Combine(backupDir, fileName), true);
}
Console.WriteLine("Files copied");
此程序将所有文本文件从源目录复制到备份目录,覆盖现有文件。
string[] textFiles = Directory.GetFiles(sourceDir, "*.txt");
Directory.GetFiles 方法根据“*.txt”模式检索源目录中的所有文本文件。
foreach (string textFile in textFiles)
{
string fileName = textFile.Substring(sourceDir.Length);
File.Copy(Path.Combine(sourceDir, fileName),
Path.Combine(backupDir, fileName), true);
}
该程序迭代文本文件,使用 Substring 提取文件名,并使用 Path.Combine 进行路径构造,将每个文件复制到备份目录。
C# 复制文件并进行错误处理
此示例演示了一种在 C# 中复制文件的健壮方法,同时结合了错误处理,以解决常见的诸如缺少源文件、访问冲突或意外异常等问题。错误处理确保程序可以优雅地恢复或在出现问题时通知用户,从而使其更可靠和用户友好。
var source = @"C:\Users\Jano\Documents\words.txt";
var destination = @"C:\Users\Jano\Documents\words_bck.txt";
try
{
File.Copy(source, destination, true);
Console.WriteLine("File copied successfully");
}
catch (FileNotFoundException)
{
Console.WriteLine("Error: Source file not found");
}
catch (IOException ex)
{
Console.WriteLine($"Error copying file: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Unexpected error: {ex.Message}");
}
File.Copy 方法用于将文件从指定的 source 路径复制到 destination 路径。第三个参数 true 确保该方法覆盖目标文件(如果目标文件已经存在),从而提供更新的灵活性。通过将操作包装在 try-catch 块中,程序可以优雅地处理潜在的错误,并向用户提供有意义的反馈。
该程序考虑了文件操作期间可能发生的潜在错误。如果未找到源文件,则会抛出 FileNotFoundException,并且程序会显示清晰的错误消息以通知用户。对于其他输入/输出错误(例如,访问冲突、磁盘空间不足或文件锁定),会捕获 IOException,并显示其消息以帮助识别问题。
此外,任何其他意外错误都会使用泛型 Exception 块捕获,从而确保不可预见的情况不会导致程序崩溃。
C# 复制文件并报告进度
此示例复制一个大文件并报告进度,这对于长时间操作期间的用户反馈很有用。
using System.IO;
var source = @"C:\Users\Jano\Documents\large_file.dat";
var destination = @"C:\Users\Jano\Documents\large_file_copy.dat";
using var sourceStream = new FileStream(source, FileMode.Open, FileAccess.Read);
using var destStream = new FileStream(destination, FileMode.Create, FileAccess.Write);
var buffer = new byte[81920];
long totalBytes = sourceStream.Length;
long bytesCopied = 0;
int bytesRead;
while ((bytesRead = sourceStream.Read(buffer, 0, buffer.Length)) > 0)
{
destStream.Write(buffer, 0, bytesRead);
bytesCopied += bytesRead;
double progress = (double)bytesCopied / totalBytes * 100;
Console.WriteLine($"Progress: {progress:F2}%");
}
Console.WriteLine("File copied successfully");
此程序使用流手动复制文件,并根据复制的字节数以百分比形式报告进度,非常适合大型文件。
C# 递归复制目录
此示例演示了如何将整个目录(包括其子目录和文件)递归复制到指定的新位置。 递归复制是复制复杂目录结构的一种常用方法,可确保在此过程中保留所有嵌套的文件和文件夹。 此方法对于创建备份或在环境之间传输项目目录等任务特别有用。
string sourceDir = @"C:\Users\Jano\Documents\project";
string destDir = @"C:\Users\Jano\Documents\project_backup";
void CopyDirectory(string source, string dest)
{
Directory.CreateDirectory(dest);
foreach (var file in Directory.GetFiles(source))
{
string fileName = Path.GetFileName(file);
File.Copy(file, Path.Combine(dest, fileName), true);
}
foreach (var dir in Directory.GetDirectories(source))
{
string dirName = Path.GetFileName(dir);
CopyDirectory(dir, Path.Combine(dest, dirName));
}
}
CopyDirectory(sourceDir, destDir);
Console.WriteLine("Directory copied successfully");
在此程序中,CopyDirectory 函数旨在将源目录的所有内容复制到目标目录。 它首先使用 Directory.CreateDirectory 创建目标目录,即使目录结构尚不存在,也可以确保已设置该目录结构。
然后,该函数使用 Directory.GetFiles 迭代源目录中的所有文件。 对于每个文件,使用 File.Copy 方法将其复制到目标目录,从而保留原始文件名。 File.Copy 中的 true 参数确保覆盖目标目录中已经存在的文件,从而为更新或替换提供了灵活性。
接下来,该函数使用 Directory.GetDirectories 处理源目录中的子目录。 它为每个子目录递归调用 CopyDirectory,从而确保复制整个目录树。 这种递归方法允许高效地遍历和复制嵌套的目录结构。
C# 异步复制文件
此示例演示了如何使用 C# 中的流异步复制文件。 通过利用异步编程,它可以提高 I/O 绑定操作的性能,从而使您的应用程序即使在执行可能耗时的任务(如文件复制)时也能保持响应。
using System.IO;
var source = @"C:\Users\Jano\Documents\words.txt";
var destination = @"C:\Users\Jano\Documents\words_bck.txt";
async Task CopyFileAsync(string sourcePath, string destPath)
{
using var sourceStream = new FileStream(sourcePath, FileMode.Open, FileAccess.Read);
using var destStream = new FileStream(destPath, FileMode.Create, FileAccess.Write);
await sourceStream.CopyToAsync(destStream);
}
await CopyFileAsync(source, destination);
Console.WriteLine("File copied asynchronously");
在此程序中,CopyFileAsync 函数通过使用 Stream 类提供的异步 CopyToAsync 方法,有效地将文件从一个位置复制到另一个位置。 此方法执行非阻塞复制操作,这意味着调用线程可以自由地处理其他任务,同时复制文件。 异步编程在需要高响应性的应用程序中尤其有利,例如图形用户界面 (GUI) 或处理多个并发请求的服务器端应用程序。
await 关键字确保等待异步复制操作,从而允许程序仅在操作完成后才继续执行。 这提供了一种干净有效的方式来处理 I/O 操作,而不会阻塞主线程,使其成为可伸缩性和响应能力至关重要的场景的理想选择。
通过以这种异步方式实现文件复制,开发人员可以在需要大量文件操作或与外部资源交互的应用程序中实现更高的效率和更好的用户体验。
来源
本文探讨了在 C# 中复制文件和目录的各种技术,包括错误处理和异步操作。
作者
列出所有 C# 教程。