寻找用于加密备份的工具或者RAR GUI

应用场景举例:有1000个数据文件,每个即使到几百M不等,总体大概500G。
现在想把这些文件做成若干不大于4G的压缩包(因为多数国内网盘免费用户单文件不能超过4G)。
要求不用分卷压缩的形式,因为分卷压缩临时找一个小文件很可能要下载整个压缩包太麻烦。
想要的是备份工具自动选择若干个文件合成一个4G的RAR,在压缩的过程中自动加密文件名(WINRAR的基本功能),同时生成本rar包含的文件列表txt。

根据需求描述,应该是没有现成的工具可以直接用。需要定制开发。
大致可以分为两部分功能:
1、文件体积分析及组合,有点类似于“凑数”;
2、压缩文件及相关细节工作。

组合优化问题,能完美解决这问题的算法那可值钱了

以前刻录数据光盘时就遇到过这问题
当时衡量了下自己的脑子和时间成本
最终是用贪心算法的思路手动凑文件解决

所有数值按从大到小排列成数组
先正向累加最大值,直至余下数组的中位数大于累加值与目标的差距
然后反向从最小值尝试寻找一个最大的不超限的“最小值”,循环至找不到

2 个赞

我大概有个想法。

先按从大到小排列,获取大小,按大小小于4G做分组,因为实际上并不用完全考虑4G压缩包的占用率只要小于4g就行了 :rofl: 手工压缩吧。

1 个赞

个人思路
1.按文件夹顺序遍历文件,累加文件大小直到4G(不考虑压缩比)后,将该部分文件移动至临时文件夹1(保留文件结构),并生成文件夹内部文件结构的txt或xlsx,依次类推,处理剩余文件
2.使用rar手工压缩全部文件夹
第一步挺简单的,第二步的话可以用7zip命令行替代,总体来说面向gpt编程应该也能直接做出来并且不报错,语言用python

1 个赞

这个办法,包括上面@syun的办法,对于本问题都是足够解决问题的。
当然如果继续深入考虑,这种“手工排序凑数”的办法可能不够完美的地方在于,“误差”可能会比较大,换句话说就是凑出来的文件组合的体积,没有尽量逼近极值(4G)。或者从局部看已经足够逼近了,但从全局看,不是最优解。这个就有待算法专家来继续优化了。

1 个赞

还要算文件大小,凑数,只能写脚本,先分文件夹,再调用rar的命令行打包

1 个赞

试试 Duplicati,可以自定义加密备份文件大小。

1 个赞

描述: 1000个文件, 大小不等, 共计500G

问题: 通过算法实现, 把文件分散压缩成≤4G的压缩包.

回答:

首先, 这个问题有一个前置条件, 就是文件压缩后的尺寸是无法预估的. 尤其是文本文件和视频文件的压缩率区别非常大.

所以, 我们先假定, 压缩率为0%

实现原理:

  1. 先实现文件大小顺序排序.
  2. 实现分组算法

A: 按照1+1000 , 2+999 的方法计算分组文件大小 ≤4G
B: ≤4G前粗暴的累加

  1. 获取分组的文件名. 写入txt
  2. 调用winrar 的命令行参数, 直接打包分组文件和 分组txt.
1 个赞

百度AI 的答复

处理大量、大小不等的文件,并将其压缩成多个小于或等于4G的压缩包是一个常见的文件管理任务。以下是一个基本的算法和步骤来实现这一目标:

算法概述

  1. 初始化:创建一个空的压缩包,并设置一个变量来跟踪当前压缩包的大小。
  2. 文件排序:根据文件大小对所有文件进行降序排序。这样可以确保最大的文件首先被处理。
  3. 遍历文件
    • 检查当前文件是否可以添加到当前压缩包中,而不会使其超过4G。
    • 如果可以,将文件添加到当前压缩包,并更新压缩包的大小。
    • 如果不可以,关闭当前压缩包,创建一个新的压缩包,并将文件添加到新压缩包中。
  4. 完成:遍历完所有文件后,关闭最后一个压缩包。

步骤详解

  1. 准备工作:确保你的系统有足够的存储空间来创建压缩包,以及足够的内存来运行压缩程序。

  2. 文件排序:使用文件系统命令或编程语言中的排序函数对文件进行排序。例如,在Linux中,你可以使用ls -lSh命令按大小降序列出文件。在Python中,你可以使用sorted()函数,并通过os.path.getsize()获取文件大小。

  3. 遍历文件并创建压缩包

    • 使用循环遍历排序后的文件列表。
    • 对于每个文件,检查是否可以将其添加到当前压缩包中。这通常涉及到检查压缩包的当前大小和文件的大小。
    • 如果文件可以添加到当前压缩包中,使用压缩工具(如ziptar7z等)将其添加到压缩包中,并更新压缩包的大小。
    • 如果文件无法添加到当前压缩包中,关闭当前压缩包(确保它被正确保存),然后创建一个新的空压缩包,并将文件添加到新压缩包中。
  4. 完成:当所有文件都已处理并添加到相应的压缩包中时,关闭最后一个压缩包。现在你应该有一系列小于或等于4G的压缩包,包含了原始的所有文件。

  5. 验证和清理:验证每个压缩包的完整性和大小,确保它们符合你的要求。删除任何临时文件或不再需要的文件。

  6. 记录和日志:记录下所创建的压缩包的数量、大小和位置,以便于将来参考或进一步处理。

注意事项

  • 错误处理:确保在文件处理或压缩过程中出现错误时有适当的错误处理机制。
  • 大文件处理:如果单个文件的大小超过4G,你可能需要将其分割成更小的部分,然后再进行压缩。
  • 备份原始文件:在进行任何大规模的文件操作之前,始终备份原始文件以防止数据丢失。
1 个赞

微软 AI 的回答:

这是一个经典的背包问题,可以通过贪心算法动态规划来解决。这里,我们可以使用一种简单的贪心策略来解决这个问题。

以下是一个可能的Python代码实现:

def distribute_files(files, max_size):
    files.sort(reverse=True)  # 从大到小排序
    bags = []  # 存储每个压缩包中的文件

    for file in files:
        # 查找是否有足够空间的压缩包
        for bag in bags:
            if sum(bag) + file <= max_size:
                bag.append(file)
                break
        else:
            # 如果没有找到足够空间的压缩包,就新建一个
            bags.append([file])

    return bags

# 假设files是一个包含所有文件大小的列表
files = [...]  # 请将这里替换为实际的文件大小
max_size = 4 * 1024  # 压缩包的最大大小,这里假设单位是GB

bags = distribute_files(files, max_size)

# 打印每个压缩包中的文件
for i, bag in enumerate(bags):
    print(f"Bag {i+1}: {bag}")

这个代码首先将文件按大小从大到小排序,然后对于每个文件,它会尝试找到一个已经存在的压缩包,该压缩包有足够的空间来存储这个文件。如果找不到这样的压缩包,它就会创建一个新的压缩包。

请注意,这个解决方案可能不是最优的,因为它依赖于文件的初始顺序。对于更复杂的情况,可能需要使用更复杂的算法,如动态规划。但是,对于许多实际情况,这个贪心策略已经足够好了。

希望这个答案对你有所帮助!如果你有其他问题,欢迎随时向我提问。:blush:

1 个赞

谢谢各位,目前综合以上意见的方案是这样的,
目标是一个利用国内网盘做不常用文件的加密备份,制作加密的文件目录,外加提取文件的操作流程,如下:

1.把文件分组到几个文件夹,每组大概30G,文件夹的命名包含大致的文件内容提示和编号等信息
2.在每个文件夹内用dir列出文件列表输出到文件列表.txt,再把文件列表.txt的内容追加到一个外部的总目录.txt
3.在每个文件夹内单独用winrar分卷压缩所有文件,分卷大小4G,设置密码并隐藏文件名,测试和自动删除已压缩,压缩包的名字就用文件夹的名字
4.把按上述处理好的每个文件夹(内含压缩包)拖到网盘上传
5.用rar加密保存总目录.txt

提取方法:
在总目录.txt中查询要找的文件名所在的压缩包
从网盘下载所对应的压缩包的全部卷,解压使用

补充说明:
开始想的是按4G每组凑文件集中压缩,以避免分卷。后来干脆把每30G的文件一组按4G分卷压缩。这样就去掉了凑4G的复杂步骤,也相对减少了每次使用需要从网盘下载的数据量,30G在国内网盘下载还是蛮快的,适合不频繁的数据调用。

好多年没写代码了,文件量不大所以这次还是按纯手工
多谢各位大佬的帮助 :+1: :smiling_face_with_three_hearts:

百川AI. 号称超越 ChatGPT 4 的国内AI

为了将大量文件分散压缩到不超过4GB的压缩包中,可以采用以下步骤:

相关背景解释

在计算机科学领域,数据压缩是一种减少数据大小的技术。常见的压缩格式包括ZIP、RAR和7z等。对于大数据量的处理,通常需要考虑内存管理和磁盘I/O效率。

解决方案

第一步:确定每个压缩包的大小限制

由于要求单个压缩包的大小不得超过4GB,因此我们需要确保每次添加到压缩包中的文件总大小不会超过这个阈值。

第二步:遍历文件和计算压缩

  • 创建一个循环来遍历所有的文件。
  • 在循环内部,检查当前压缩包是否已满(即接近或达到4GB)。如果未满,则继续添加文件;如果已满,则关闭当前的压缩包并开始一个新的压缩包。

第三步:保存压缩包

  • 每当完成一个压缩包的填充后,将其保存到指定的路径。

代码示例

using System;
using System.IO;
using System.IO.Compression;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        // 假设所有文件都位于同一个目录下
        string directoryPath = @"C:\path\to\files";
        
        // 获取该目录下的所有文件
        var files = Directory.GetFiles(directoryPath);
        
        // 初始化压缩流
        using (FileStream fsOut = File.Create("compressed_file_01.zip"))
        using (ZipArchive archive = new ZipArchive(fsOut, ZipArchiveMode.Create, true))
        {
            int currentFileIndex = 0;
            foreach (var file in files)
            {
                // 计算当前压缩包的文件数量
                currentFileIndex++;
                
                // 检查是否需要开始新的压缩包
                if (currentFileIndex > 1 && fsOut.Length >= 4 * 1024 * 1024 * 1024) // 4GB
                {
                    // 关闭当前压缩包并创建新的压缩包
                    archive.Dispose();
                    fsOut.Dispose();
                    fsOut = File.Create($"compressed_file_{currentFileIndex}.zip");
                    archive = new ZipArchive(fsOut, ZipArchiveMode.Create, true);
                    currentFileIndex = 0;
                }
                
                // 添加文件到压缩包
                var zipEntry = archive.CreateEntryFromFile(file, Path.GetFileName(file));
            }
        }
    }
}

预期执行结果

程序会生成多个压缩包,每个压缩包包含若干个文件,且每个压缩包的大小都不会超过4GB。

对执行结果的解释和对代码的分析总结

上述代码首先定义了要处理的文件路径,然后获取该路径下的所有文件。接着,它进入了一个循环,逐个将这些文件添加到压缩包中。当检测到当前压缩包即将超出4GB大小时,它会关闭当前的压缩包并开始一个新的压缩包。这样确保了不会有单个压缩包超过4GB的限制。

需要注意的是,此代码没有进行异常处理,也没有对文件名进行排序或其他优化操作。在实际应用中,可能还需要增加这些功能以提高鲁棒性和性能。

1 个赞

如果只是这个需求,市面上有很成熟的商业软件和免费的开源软件了,支持网盘同步的软件基本都有加密后同步的功能。例如syncback free、duplicate、goodsync等等。

同类软件体验下来,goodsync个人感觉比较顺手,主要是加密解密对资源占用小,加密后的文件可以直接预览

1 个赞

分卷还是会导致想要其中某个文件的时候得全部下载下来;
虽说很快吧,但就是100MB/s下30GB也得5分钟吧。
我建议是每份文件打一个压缩包,然后凑成4GB打包成无压缩率的压缩包(zip、tar等)再上传。
这里“每份”指的是一套相关的文件,例如一个项目、一组同主题照片、一个文件夹等。
这样最终的压缩后大小是已知的,凑成无压缩率压缩包只是将一组文件变成一个文件而已。