📅  最后修改于: 2023-12-03 14:59:41.977000             🧑  作者: Mango
复制文件是C#语言中最常见的操作之一。有时候需要将文件复制到系统文件夹中,例如复制一个注册表项或者驱动程序。本篇文章将介绍如何在C#中实现这个功能。
using System.IO; // 文件操作命名空间
using Microsoft.Win32; // 注册表操作命名空间
首先需要创建一个FileInfo
对象,指定要复制的文件,然后再创建一个FileInfo
对象,指定复制到的目标位置。
FileInfo sourceFile = new FileInfo("sourceFile.txt");
FileInfo targetFile = new FileInfo(Path.Combine(Environment.SystemDirectory, "targetFile.txt"));
然后使用File.Copy
方法将源文件复制到目标文件。
File.Copy(sourceFile.FullName, targetFile.FullName, true);
如果目标文件已经存在,设置第三个参数为true
表示覆盖原有文件。
需要使用RegistryKey
类访问注册表,RegistryKey
代表一个注册表项。要复制一个注册表项,首先需要打开源注册表项和目标注册表项。
RegistryKey sourceKey = Registry.CurrentUser.OpenSubKey("Software\\MyApp\\Source", RegistryKeyPermissionCheck.ReadSubTree);
RegistryKey targetKey = Registry.CurrentUser.OpenSubKey("Software\\MyApp\\Target", RegistryKeyPermissionCheck.ReadWriteSubTree);
然后递归复制源注册表项的所有键值到目标注册表项中。
private static void CopyRegistryKey(RegistryKey sourceKey, RegistryKey targetKey)
{
foreach (string valueName in sourceKey.GetValueNames())
{
object value = sourceKey.GetValue(valueName);
RegistryValueKind kind = sourceKey.GetValueKind(valueName);
targetKey.SetValue(valueName, value, kind);
}
foreach (string subKeyName in sourceKey.GetSubKeyNames())
{
using (RegistryKey sourceSubKey = sourceKey.OpenSubKey(subKeyName, RegistryKeyPermissionCheck.ReadSubTree))
using (RegistryKey targetSubKey = targetKey.CreateSubKey(subKeyName, RegistryKeyPermissionCheck.ReadWriteSubTree))
{
CopyRegistryKey(sourceSubKey, targetSubKey);
}
}
}
这段代码递归复制所有键值和子项,直到遍历完整个注册表项树。
using System.IO;
using Microsoft.Win32;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
// 复制文件
FileInfo sourceFile = new FileInfo("sourceFile.txt");
FileInfo targetFile = new FileInfo(Path.Combine(Environment.SystemDirectory, "targetFile.txt"));
File.Copy(sourceFile.FullName, targetFile.FullName, true);
// 复制注册表项
RegistryKey sourceKey = Registry.CurrentUser.OpenSubKey("Software\\MyApp\\Source", RegistryKeyPermissionCheck.ReadSubTree);
RegistryKey targetKey = Registry.CurrentUser.OpenSubKey("Software\\MyApp\\Target", RegistryKeyPermissionCheck.ReadWriteSubTree);
CopyRegistryKey(sourceKey, targetKey);
}
private static void CopyRegistryKey(RegistryKey sourceKey, RegistryKey targetKey)
{
foreach (string valueName in sourceKey.GetValueNames())
{
object value = sourceKey.GetValue(valueName);
RegistryValueKind kind = sourceKey.GetValueKind(valueName);
targetKey.SetValue(valueName, value, kind);
}
foreach (string subKeyName in sourceKey.GetSubKeyNames())
{
using (RegistryKey sourceSubKey = sourceKey.OpenSubKey(subKeyName, RegistryKeyPermissionCheck.ReadSubTree))
using (RegistryKey targetSubKey = targetKey.CreateSubKey(subKeyName, RegistryKeyPermissionCheck.ReadWriteSubTree))
{
CopyRegistryKey(sourceSubKey, targetSubKey);
}
}
}
}
}