无忧启动论坛

标题: 按照序号合并文件怎么弄? [打印本页]

作者: 窄口牛    时间: 2020-11-29 07:21
标题: 按照序号合并文件怎么弄?
本帖最后由 窄口牛 于 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
复制代码



作者: 窄口牛    时间: 2020-11-29 07:25
本帖最后由 窄口牛 于 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
复制代码



作者: dx163    时间: 2020-11-29 08:28
等高手来回复吧
作者: hanzsim    时间: 2020-11-29 08:59
DVD的?那么MediaCoder应该能做。使用功能->工具箱->tsMuxer UI。实在不行先使用MediaCoder把所有片断转成MKV,然后再使用MKVMerge GUI把它们合并。
作者: 江南一根葱    时间: 2020-11-29 10:18
用硕鼠合并不香嘛
作者: caocaofff    时间: 2020-11-29 11:20
按位数分开合并
作者: 窄口牛    时间: 2020-11-29 11:24
按四位合并就行,先把暂时不是四位的增加至四位,这样就简单些了。问题是怎么搞成从小往大的累加链。
作者: 窄口牛    时间: 2020-11-30 07:59
本帖最后由 窄口牛 于 2020-11-30 08:44 编辑

弄了个四位的,却只能到1136,再多就没了,或者开始跳序,悲哀的bat。
作者: winpefk    时间: 3 天前
窄口牛 发表于 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小时.)
作者: winpefk    时间: 3 天前
附 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;
}

作者: 菲菲18866    时间: 3 天前
进来学习学习
作者: 甲方    时间: 3 天前
看看是怎么合并的
作者: 技束源    时间: 3 天前
谢谢分享
作者: 我是李刚    时间: 3 天前
看看是怎么处理的
作者: 俪尚皇    时间: 3 天前
学习学习
作者: tong2025tong    时间: 3 天前
谢谢分享
作者: idcicp    时间: 3 天前
谢谢楼主分享
作者: cnjd1079    时间: 3 天前
感谢楼主分享
作者: afang158    时间: 3 天前
刚好找这方面的文章




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3