在C#程序里复制文件是一项基础但常用的操作,无论做数据备份、日志搬运还是资源发布都会用到。掌握正确的复制方式能避免路径错误和权限异常。

使用File.Copy方法复制文件
System.IO命名空间下的File类提供了静态方法Copy,可以直接把源文件复制到目标路径。它有两个常用重载:一个不覆盖已有文件,另一个通过参数控制是否覆盖。
基本步骤
- 引入System.IO命名空间
- 检查源文件是否存在
- 确保目标目录存在,不存在则创建
- 调用File.Copy并指定覆盖选项
代码示例
using System;
using System.IO;
class Program
{
static void Main()
{
string sourceFile = @"C:datatest.txt";
string destDir = @"D:backup";
string destFile = Path.Combine(destDir, Path.GetFileName(sourceFile));
// 确保目标目录存在
if (!Directory.Exists(destDir))
{
Directory.CreateDirectory(destDir);
}
// 复制文件,true表示覆盖已存在的文件
if (File.Exists(sourceFile))
{
File.Copy(sourceFile, destFile, true);
Console.WriteLine("文件已复制到:" + destFile);
}
else
{
Console.WriteLine("源文件不存在");
}
}
}
使用FileInfo类拷贝文件
FileInfo是面向对象的文件操作方式,先创建FileInfo实例再调用CopyTo方法,适合在已经持有文件对象时使用。
示例代码
using System;
using System.IO;
class Program
{
static void Main()
{
FileInfo file = new FileInfo(@"C:datatest.txt");
string destPath = @"D:backuptest.txt";
if (file.Exists)
{
// 确保目录存在
if (!Directory.Exists(Path.GetDirectoryName(destPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(destPath));
}
// 拷贝并覆盖
file.CopyTo(destPath, true);
Console.WriteLine("FileInfo复制完成");
}
}
}
用文件流方式自定义复制
如果需要在复制时做进度监控或转换内容,可以用FileStream配合读写缓冲区完成拷贝。
using System;
using System.IO;
class Program
{
static void Main()
{
string src = @"C:datatest.txt";
string dst = @"D:backuptest.txt";
using (FileStream inStream = new FileStream(src, FileMode.Open))
using (FileStream outStream = new FileStream(dst, FileMode.Create))
{
byte[] buffer = new byte[8192];
int read;
while ((read = inStream.Read(buffer, 0, buffer.Length)) > 0)
{
outStream.Write(buffer, 0, read);
}
}
Console.WriteLine("流复制完成");
}
}
常见错误处理
| 异常类型 | 原因 | 处理方式 |
|---|---|---|
| DirectoryNotFoundException | 目标目录不存在 | 调用Directory.CreateDirectory |
| FileNotFoundException | 源文件不存在 | 复制前用File.Exists检查 |
| UnauthorizedAccessException | 无写入权限 | 以管理员运行或修改目录权限 |
实际项目中建议把复制逻辑封装成方法,并加入日志和异常捕获,这样在C#里拷贝文件到指定目录会更稳定可靠。