📜  c# 复制文件到系统文件夹 - C# (1)

📅  最后修改于: 2023-12-03 14:59:41.977000             🧑  作者: Mango

C# 复制文件到系统文件夹

复制文件是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);
                }
            }
        }
    }
}