您的位置:

C#复制文件的详细指南

一、复制文件的基本介绍

复制文件是计算机世界中最常见的任务之一。在 C# 编程中,可以使用 System.IO 命名空间中的 File 类来实现此操作。File 类提供了一组方法,其中最重要的是 Copy() 和 CopyTo() 方法。

在复制文件之前,要确保原始文件存在。可以使用 File 类中的 Exists() 方法来检查文件是否存在。另外,如果目标文件已经存在,则可以使用 File 类中的 Delete() 方法删除该文件。

if (File.Exists(sourceFile)) 
{
    if (File.Exists(destinationFile)) 
    {
        File.Delete(destinationFile);
    }
    File.Copy(sourceFile, destinationFile);
}

二、复制文件夹

除了复制单个文件外,还可以使用 C# 语言复制整个文件夹,包括文件夹内的所有文件和子文件夹。可通过使用递归方式复制文件夹中的所有文件。

以下是一个递归函数的示例,可以将源文件夹中的所有文件和子文件夹复制到目标文件夹中:

private static void CopyFolder(string sourceFolder, string destinationFolder)
{
    string[] files = Directory.GetFiles(sourceFolder);    
    foreach (string file in files) 
    {
        string name = Path.GetFileName(file);
        string dest = Path.Combine(destinationFolder, name);
        File.Copy(file, dest);
    }
    string[] folders = Directory.GetDirectories(sourceFolder);    
    foreach (string folder in folders) 
    {
        string name = Path.GetFileName(folder);
        string dest = Path.Combine(destinationFolder, name);
        Directory.CreateDirectory(dest);
        CopyFolder(folder, dest);
    }
}

三、文件复制的错误处理

在复制文件时,有一些常见的错误需要处理。例如,在写入目标文件时可能会发生错误,如目标磁盘已满或受写入保护。可以使用 try-catch 块来处理这些错误。

try 
{
    File.Copy(sourceFile, destinationFile, true);
}
catch (IOException e) 
{
    Console.WriteLine(e.Message);
}
catch (UnauthorizedAccessException e) 
{
    Console.WriteLine(e.Message);
}

四、复制文件的高级选项

File.Copy() 方法提供了一些高级选项,让您可以更好地控制文件复制。

例如,您可以使用 Copy() 方法将文件复制到目标文件以及目标文件夹,并使用 CopyOptions 枚举来指定如果源文件和目标文件相同,复制操作应该如何进行操作。以下示例将源文件复制到多个目标,并在目标文件夹中保存所有文件的副本:

File.Copy(sourceFile, Path.Combine(destinationFolder, sourceFileName));
File.Copy(sourceFile, Path.Combine(destinationFolder, DateTime.Now.ToString("yyyyMMddHHmmss") + sourceFileName));

五、复制大文件

在处理大型文件(例如视频或音频文件)时,复制速度会非常重要。在这种情况下,您可以使用流操作或使用异步操作来复制文件。

下面是使用流操作复制大型文件的示例:

FileStream sourceStream = new FileStream(sourceFile, FileMode.Open);
FileStream destinationStream = new FileStream(destinationFile, FileMode.CreateNew);

byte[] buffer = new byte[1024 * 1024];
int bytesRead;
while ((bytesRead = sourceStream.Read(buffer, 0, buffer.Length)) > 0) 
{
    destinationStream.Write(buffer, 0, bytesRead);
}

sourceStream.Close();
destinationStream.Close();

下面是使用异步操作来复制大型文件的示例:

async Task CopyFileAsync(string source, string destination) 
{
    using (FileStream sourceStream = new FileStream(source, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
    using (FileStream destinationStream = new FileStream(destination, FileMode.CreateNew, FileAccess.Write, FileShare.None, 4096, true))
    {
        await sourceStream.CopyToAsync(destinationStream);
    }
}