You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#实现指定文件夹内大文件AES加密并迁移至目标目录

C# 批量AES加密指定文件夹文件并迁移到目标目录

你现有的单文件AES加密代码可以正常工作,要实现批量处理只需添加文件夹遍历、路径映射的逻辑,以下是完整实现方案:

批量加密核心方法

在你的现有类中添加以下方法,用于遍历源文件夹、加密文件到目标目录,并可选择删除原文件实现“迁移”效果:

/// <summary>
/// 批量加密指定文件夹内的文件,并输出到目标目录
/// </summary>
/// <param name="sourceDir">源文件夹路径</param>
/// <param name="targetDir">目标文件夹路径</param>
/// <param name="password">加密密码</param>
/// <param name="includeSubdirectories">是否包含子目录</param>
/// <param name="deleteSourceFiles">加密完成后是否删除原文件(实现迁移)</param>
public void BatchEncryptFiles(string sourceDir, string targetDir, string password, bool includeSubdirectories = false, bool deleteSourceFiles = false)
{
    // 验证源目录是否存在
    if (!Directory.Exists(sourceDir))
        throw new DirectoryNotFoundException($"源目录不存在:{sourceDir}");
    
    // 创建目标目录(包括子目录)
    Directory.CreateDirectory(targetDir);

    // 获取源目录下的所有文件
    var searchOption = includeSubdirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
    var sourceFiles = Directory.GetFiles(sourceDir, "*.*", searchOption);

    foreach (var sourceFile in sourceFiles)
    {
        try
        {
            // 计算目标文件路径,保持原目录结构
            var relativePath = Path.GetRelativePath(sourceDir, sourceFile);
            var targetFile = Path.Combine(targetDir, relativePath);
            
            // 创建目标文件所在的子目录
            Directory.CreateDirectory(Path.GetDirectoryName(targetFile)!);

            // 调用你已有的加密方法
            EncryptFile(sourceFile, targetFile, password, salt, iterations);

            // 如果需要迁移,加密完成后删除原文件
            if (deleteSourceFiles)
            {
                File.Delete(sourceFile);
            }
            
            Console.WriteLine($"已处理:{sourceFile} -> {targetFile}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"处理失败 {sourceFile}:{ex.Message}");
            // 可根据需求选择是否继续处理其他文件
            // throw;
        }
    }
}

调用示例

在主程序中可以这样调用:

var cryptoHelper = new YourCryptoClassName(); // 替换成你的类名
string sourceFolder = @"C:\待加密文件";
string targetFolder = @"D:\已加密文件";
string password = "你的强密码";

// 加密所有文件(包括子目录),并删除原文件实现迁移
cryptoHelper.BatchEncryptFiles(sourceFolder, targetFolder, password, includeSubdirectories: true, deleteSourceFiles: true);

重要注意事项

  • 盐值修改:你当前代码中的salt是全0的固定值,这非常不安全!建议生成随机盐值(比如用RandomNumberGenerator.GetBytes(16)),并将盐值和加密文件一起保存(比如存储在文件头部或单独的配置文件中),否则无法解密。
  • 迭代次数优化:建议将iterations调高到10000次以上,提升破解难度。
  • 异常处理:实际使用中要考虑文件占用、权限不足、磁盘空间不足等异常,可根据需求调整异常处理逻辑。
  • 文件覆盖:如果目标目录已有同名文件,EncryptFile中的FileMode.CreateNew会抛出异常,可改成FileMode.Create覆盖,或者在代码中先判断文件是否存在。
  • 过时API提示:AesManaged已标记为过时,建议替换为Aes.Create(),用法完全一致,更符合.NET最佳实践。

内容的提问来源于stack exchange,提问作者Don

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:31:15