无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 4753|回复: 18
打印 上一主题 下一主题

按照序号合并文件怎么弄?

[复制链接]
跳转到指定楼层
1#
发表于 2020-11-29 07:21:24 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 窄口牛 于 2020-11-29 08:32 编辑

需要考虑两位00开始,三位000开始,四位0000开始,一部电影的块儿也就一千来个吧,做到2000应该够了。分享现在合并视频的成品,合并前用重命名软件修改文件名称,复制一下电影名称,然后双击,选择要合并的文件夹,合并后的文件在当前目录。
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. reg query HKU\S-1-5-20>nul || echo;CreateObject^("Shell.Application"^).ShellExecute "%~f0", "", "", "runas", 1 > "%temp%\getadmin.vbs" && cscript //b "%temp%\getadmin.vbs" && exit /b & del "%temp%\getadmin.vbs" /f /q>nul 2>nul
  4. pushd "%CD%"&& CD /D "%~dp0"
  5. for /f %%a in ('mshta "javascript:var s=clipboardData.getData('text');if(s)new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(s);close();"^|more') do (set name=%%a)
  6. for /f "delims=" %%a in ('mshta "%~f0"') do set path1=%%a
  7. for /f "delims=" %%a in ('dir "!path1!" /b') do (
  8. if %%a LSS 10 (ren "!path1!\%%a" 00%%a) else (
  9. if %%a LSS 100 (ren "!path1!\%%a" 0%%a) ))
  10. del "!path1!\index.m3u8" /q
  11. copy /b "!path1!\*.*" %name%.mp4
  12. pause>nul
  13. <script>
  14. var Shell = new ActiveXObject("Shell.Application");
  15. var Folder = Shell.BrowseForFolder(0, "请选择文件夹", 0); //起始目录为:桌面
  16. if (Folder != null) {
  17.     Folder = Folder.items();
  18.     Folder = Folder.item();
  19.     Folder = Folder.Path;
  20.     new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Folder);
  21. }
  22. close();
  23. </script>






  24. pause>nul
复制代码


2#
 楼主| 发表于 2020-11-29 07:25:19 来自手机 | 只看该作者
本帖最后由 窄口牛 于 2020-11-29 08:28 编辑

问题源自刚看过的一部电影,它本身不是时序的,导致我下载了几次,感觉直接copy/b合并排序有问题。于是想干脆弄个写死,发现好难。建立测试
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. reg query HKU\S-1-5-20>nul || echo;CreateObject^("Shell.Application"^).ShellExecute "%~f0", "", "", "runas", 1 > "%temp%\getadmin.vbs" && cscript //b "%temp%\getadmin.vbs" && exit /b & del "%temp%\getadmin.vbs" /f /q>nul 2>nul
  4. pushd "%CD%"&& CD /D "%~dp0"
  5. md test1
  6. md test2
  7. for /l %%a in (100,1,199) do set a=%%a&echo !a:~1!>.\test1\!a:~1!.ts
  8. for /l %%a in (10000,1,11200) do set a=%%a&echo !a:~1!>.\test2\!a:~1!.ts
  9. pause>nul
复制代码


回复

使用道具 举报

3#
发表于 2020-11-29 08:28:29 | 只看该作者
等高手来回复吧
回复

使用道具 举报

4#
发表于 2020-11-29 08:59:08 | 只看该作者
DVD的?那么MediaCoder应该能做。使用功能->工具箱->tsMuxer UI。实在不行先使用MediaCoder把所有片断转成MKV,然后再使用MKVMerge GUI把它们合并。
回复

使用道具 举报

5#
发表于 2020-11-29 10:18:06 | 只看该作者
用硕鼠合并不香嘛
回复

使用道具 举报

6#
发表于 2020-11-29 11:20:17 | 只看该作者
按位数分开合并
回复

使用道具 举报

7#
 楼主| 发表于 2020-11-29 11:24:07 来自手机 | 只看该作者
按四位合并就行,先把暂时不是四位的增加至四位,这样就简单些了。问题是怎么搞成从小往大的累加链。
回复

使用道具 举报

8#
 楼主| 发表于 2020-11-30 07:59:34 来自手机 | 只看该作者
本帖最后由 窄口牛 于 2020-11-30 08:44 编辑

弄了个四位的,却只能到1136,再多就没了,或者开始跳序,悲哀的bat。

点评

我自行写了一个. #include #include unsigned int calc_num_length(unsigned int a){ register unsigned int length=0; for(;;){ length++; a=a/10;  详情 回复 发表于 前天 11:16
回复

使用道具 举报

9#
发表于 前天 11:16 来自手机 | 只看该作者
窄口牛 发表于 2020-11-30 07:59
弄了个四位的,却只能到1136,再多就没了,或者开始跳序,悲哀的bat。

我自行写了一个.
#include <stdio.h>
#include <stdlib.h>

unsigned int calc_num_length(unsigned int a){
        register unsigned int length=0;
        for(;;){
                length++;
                a=a/10;
                if (a == 0){
                        break;
                }
        }
        return length;
}

void write_number(char * str,unsigned int num,char fill,unsigned int required_len){
        // register unsigned int num_r=num; 尝试用寄存器加速整数除法
        int str_real_len=calc_num_length(num);
        int offset=required_len - str_real_len;
//      int offset=0;

        for(register unsigned int i=1;i <= str_real_len;i++){
                str[offset+str_real_len-i]=num%10 + '0';
                num=num/10;
        }
        for(register unsigned int i=0;i < offset;i++){
                str=fill;
        }
}

int main(int argc,char * argv[]){
        if(argc != 7){
                printf("Usage: ./combination Filename_Prefix File_name_suffix start stop step Out_File\n");
        return 0;
        }
        printf("Initing.\n");

        int start=atoi(argv[3]);
        int stop=atoi(argv[4]);
        int step=atoi(argv[5]);
        int str_number_safe_len=calc_num_length(stop);
        int str_safe_length=str_number_safe_len + strlen(argv[1]) + strlen(argv[2]) + strlen(argv[6]);
        unsigned int offset=0;
        FILE * fp=fopen(argv[6],"wb+");
        if (fp == NULL){
                printf("Failed to create outfile!\n");
                return -1;
        }
        fclose(fp);
        fp=NULL;

        char * temp=(char *)calloc( str_safe_length + 3 + 5 + 1 ,sizeof(char)); // 3: ' ' '>>'

        if(temp == NULL){
                printf("Failed to allocate memory.\n");
        }
        memcpy (temp,"type ",5);
        offset += 5;
        memcpy( temp+offset,argv[1],strlen(argv[1]) );
        offset+=strlen(argv[1]);

        for (register unsigned int i=start;i<stop;i+=step){
                write_number( temp+offset,i,'0',calc_num_length(i) );
                if (calc_num_length(i) == calc_num_length(i-step)){
                } else {
                        unsigned int tmp_len=strlen(argv[2]);
                        memcpy( (void *)(temp+offset+calc_num_length(i)) ,argv[2], tmp_len);
                        memcpy( temp+offset+calc_num_length(i)+tmp_len," >> " ,4);
                        memcpy( (void *)(temp+offset+calc_num_length(i)+tmp_len + 4) ,argv[6], strlen(argv[6]));
                }
                system(temp);
        }

        free(temp);
        return 0;
}
请用mingw编译.
(没有使用ai除错和编写,测试通过. C语言还是编写10min,调试1小时.)
回复

使用道具 举报

10#
发表于 前天 11:26 来自手机 | 只看该作者
附 deepseek生成版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

// 计算整数位数 (0 返回长度1)
unsigned int calc_num_length(unsigned int a) {
    if (a == 0) return 1;
    unsigned int length = 0;
    while (a > 0) {
        length++;
        a /= 10;
    }
    return length;
}

// 智能文件名生成器
char* generate_filename(const char* prefix, unsigned int num,
                        const char* suffix, unsigned int max_len) {
    // 最大尝试长度 = 最大位数+1(应对意外情况)
    const unsigned int MAX_TRIES = 2;
    static char buffer[1024]; // 静态缓冲区避免重复分配
   
    // 尝试不同格式:补零格式 > 原始格式
    unsigned int lengths[] = {max_len, calc_num_length(num)};
   
    for (int i = 0; i < MAX_TRIES; i++) {
        char num_str[32] = {0};
        unsigned int len = lengths[i];
        
        // 数字部分生成(带前导零)
        for (int pos = len - 1; pos >= 0; pos--) {
            num_str[pos] = '0' + (num % 10);
            num /= 10;
        }
        
        // 组合完整文件名
        snprintf(buffer, sizeof(buffer), "%s%s%s", prefix, num_str, suffix);
        
        // 检查文件是否存在(优化点:可跳过检查直接尝试打开)
        FILE* test = fopen(buffer, "rb");
        if (test) {
            fclose(test);
            return buffer;
        }
    }
    return NULL; // 所有格式尝试失败
}

int main(int argc, char* argv[]) {
    if (argc != 7) {
        printf("Usage: %s Prefix Suffix start stop step OutFile\n", argv[0]);
        return 1;
    }

    // 参数解析
    const char* prefix = argv[1];
    const char* suffix = argv[2];
    unsigned int start = atoi(argv[3]);
    unsigned int stop = atoi(argv[4]);
    unsigned int step = atoi(argv[5]);
    const char* outfile = argv[6];
   
    // 计算最大数字位数(用于补零)
    unsigned int max_len = calc_num_length(stop > 1 ? stop - 1 : stop);
   
    // 预计算缓冲区大小
    size_t buf_size = 64 * 1024; // 64KB缓冲区
    char* buffer = malloc(buf_size);
    if (!buffer) {
        perror("Memory allocation failed");
        return 1;
    }

    // 统一打开输出文件
    FILE* out_fp = fopen(outfile, "ab"); // 二进制追加模式
    if (!out_fp) {
        perror("Failed to open output file");
        free(buffer);
        return 1;
    }

    // 主处理循环
    for (unsigned int num = start; num < stop; num += step) {
        // 生成智能文件名
        char* filename = generate_filename(prefix, num, suffix, max_len);
        if (!filename) {
            fprintf(stderr, "File not found for number %u\n", num);
            continue;
        }

        // 打开输入文件
        FILE* in_fp = fopen(filename, "rb");
        if (!in_fp) {
            perror("Failed to open input file");
            continue;
        }

        // 大块数据复制
        size_t bytes_read;
        while ((bytes_read = fread(buffer, 1, buf_size, in_fp)) {
            size_t bytes_written = fwrite(buffer, 1, bytes_read, out_fp);
            if (bytes_written != bytes_read) {
                perror("Write error");
                break;
            }
        }

        // 关闭当前输入文件
        fclose(in_fp);
    }

    // 清理资源
    fclose(out_fp);
    free(buffer);
    printf("Files merged successfully\n");
    return 0;
}
回复

使用道具 举报

11#
发表于 前天 19:14 | 只看该作者
进来学习学习
回复

使用道具 举报

12#
发表于 前天 19:20 | 只看该作者
看看是怎么合并的
回复

使用道具 举报

13#
发表于 前天 19:23 | 只看该作者
谢谢分享
回复

使用道具 举报

14#
发表于 前天 19:26 | 只看该作者
看看是怎么处理的
回复

使用道具 举报

15#
发表于 前天 19:28 | 只看该作者
学习学习
回复

使用道具 举报

16#
发表于 前天 19:33 | 只看该作者
谢谢分享
回复

使用道具 举报

17#
发表于 前天 19:35 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

18#
发表于 前天 19:48 | 只看该作者
感谢楼主分享
回复

使用道具 举报

19#
发表于 前天 19:51 | 只看该作者
刚好找这方面的文章
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-6-10 02:37

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表