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
相关产品推荐
相关产品推荐

