中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-16 12:26
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 求一cmd下分割+合并文件的dos程序! 查看 7,596 回复 21
楼 主 求一cmd下分割+合并文件的dos程序! 发表于 2006-12-20 06:01 ·  中国 江苏 南京 电信
高级用户
★★
积分 623
发帖 214
注册 2006-09-22 20:48
UID 63387
状态 离线
dos编程高手们,我想有一个cmd下分割文件的dos程序,把它作为系统文件放到system32里,功能如下:
1,指定大小分割文件(基本功能)
2,合并分割后的文件(用这个程序合并和copy命令合并都可以)
3,音频和视频之类的文件分割后文件可以正常播放.
4,自定义分割文件存放目录.
精通编程的朋友编一个这样的程序难度不会大吧,帮我一下这个忙吧,谢谢!!!
[已使用 Gemini 解答]
Gemini 解答

需求可行性与技术实现说明

你提出的需求在 DOS/Windows 命令行环境下完全可实现,且核心功能可通过原生工具简单批处理/程序满足,以下是具体分析:

1. 核心功能的技术实现方案

(1)指定大小分割文件
  • DOS 原生工具:若使用 FreeDOS,其自带 split 命令(类似 Unix),支持按字节/KB/MB 分割(如 split -b 10M largefile.iso part_);MS-DOS 无原生 split,但可通过第三方工具(如 GNU Utils for DOS 中的 split.exe)实现,这类工具可放入 system32(Windows DOS 模拟环境)或 DOS 系统目录。
  • C 语言实现逻辑:通过 fopen 打开源文件,循环读取指定字节数(如 1024*1024 字节=1MB),写入以序号命名的分割文件(如 file.001file.002),需注意二进制模式打开fopen("file", "rb"))以保证音频/视频等二进制文件不损坏。
(2)合并文件
  • 原生命令:DOS/Windows 下 copy /b 命令支持二进制合并,无需额外程序(如 copy /b part_aa + part_ab + part_ac mergedfile.iso);若分割时使用序号命名(如 file.001),可简化为 copy /b file.* mergedfile(依赖文件名按序号排序)。
  • 程序实现:按分割序号顺序打开所有子文件,依次读取并写入目标文件即可。
(3)音频/视频文件分割后可播放

需满足分割时不破坏文件结构

  • 必须以二进制模式读写文件(避免文本模式下的换行符转换,如 DOS 的 \r\n 与 Unix 的 \n 混淆);
  • 分割点无需对齐文件格式的“块”(如 MP3 的帧、AVI 的块)—— 多媒体播放器通常具备流解析容错能力,即使中间分割,也能从有效帧开始播放(仅开头/结尾可能有极短的无效片段)。
(4)自定义分割文件存放目录
  • 批处理/程序中可通过参数传递实现:例如程序接受 -o D:\split_files 作为输出目录参数,在代码中通过 mkdir(DOS)或 CreateDirectory(Windows API)创建目录,再将分割文件写入该路径。

2. 程序实现的技术难度

  • C 语言实现:核心逻辑仅需约 100-200 行代码,涉及文件 I/O、命令行参数解析(如 argc/argv)、目录操作,对熟悉 DOS 编程的开发者而言属于基础功能,无技术难点。
  • 注意事项:需处理边界情况(如源文件大小不是分割大小的整数倍时,最后一个文件更小)、文件名长度限制(DOS 8.3 格式需控制序号位数,如 file.001 而非 file.1234)、权限问题(输出目录是否可写)。

3. 历史语境补充

你提到“放到 system32 里”,推测实际使用环境是Windows XP/7 的命令提示符(cmd.exe)(而非纯 DOS):

  • Windows 的 cmd.exe 兼容 DOS 命令,且 system32 中的程序可直接调用;
  • 若需纯 DOS 环境(如 MS-DOS 6.22),则程序需编译为 16 位 DOS 可执行文件(使用 Turbo C、Watcom C 等编译器),放入 C:\DOS 目录即可。

4. 替代方案:利用现有工具

若不想自行编译程序,可直接使用GNU Coreutils for DOS(如 split.execat.exe),这些工具是开源且合法的,支持你需要的所有功能,且可直接放入系统目录使用。

综上,你需求的功能实现难度低,核心逻辑清晰,且有成熟的工具/代码参考。若需要具体的 C 代码框架或批处理示例,可进一步补充说明。

2 发表于 2006-12-20 07:58 ·  中国 四川 成都 教育网
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
UID 42173
性别 男
状态 离线
恩,lxmxn正在开发这个东东,可能马上就出来了~~
3 发表于 2006-12-20 09:17 ·  中国 上海 闵行区 电信
中级用户
★★
大师兄
积分 377
发帖 99
注册 2005-08-26 07:37
UID 41945
状态 离线
使用 split :

C:>split -a1 -b3m Jay-HairLikeSnow.mp3 发如雪
附件
split.zip (8.09 KiB, 下载附件所需积分 1 点, 下载次数: 143)
4 发表于 2006-12-20 09:25 ·  中国 江苏 南京 电信
高级用户
★★
积分 623
发帖 214
注册 2006-09-22 20:48
UID 63387
状态 离线
强人,谢谢....这个是自己写的吗,网上找不到的,能否用c语言写出这样类似的程序,我想要一下这个代码,请大家帮忙........
5 发表于 2006-12-21 09:50 ·  中国 甘肃 张掖 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
split这个东西很早了哦,我记得现在用的都还是几年前出的,不过确实很好用,合并可以copy /b
6 发表于 2006-12-21 23:52 ·  中国 四川 成都 教育网
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
UID 42173
性别 男
状态 离线
lxmxn那个是利用 WinRAR 版本的


::code by lxmxn @ cn-dos.net
::Divide file into pieces.
@echo off&setlocal EnableDelayedExpansion
if not "%~s1"=="" (
echo %~s1
set "file=%~s1"
goto last
) else (goto begin)
:begin
cls
set /p file=请输入你要分割的文件名:
:last
for /f "delims=" %%i in ("%file%") do (
echo %%i
set filename=%%~nxi
set filesize=%%~zi
set name=%%~ni
set yslj=%%~dpi
set /a kbsize=%%~zi/1024
echo !yslj!
)
:redo
set /p fen= %filename% 文件的大小是 %filesize% 字节(大约 %kbsize% KB),请输入你要分隔出的文件大小:
if %fen% gtr %filesize% (
cls
echo 输入的错误,请重新输入~
goto :redo
)
set /a over=%filesize%/%fen%
set /a over_=%over%+1
set /p choose=大概可以从 %filename% 中分割出 %over_% 个文件,是否继续?【Y】/【N】
echo.&echo.
if /i not "%choose%"=="y" goto :end
if exist new_%name%\*.rar del new_%name%\*.rar /a /q
md new_%name% 2>nul
if %over_% geq 1 if %over_% leq 9 set num=1
if %over_% geq 10 if %over_% leq 99 set num=01
if %over_% geq 100 if %over_% leq 999 set num=001
if %over_% geq 1000 if %over_% leq 9999 set num=0001
rar a /v%fen%b /df /m0 /inul new_%name%\new_%name%.rar %file%
set /p choose1=是否要将分割的文件合并?【Y】/【N】
echo.&echo.
if /i not "%choose1%"=="y" goto :end
rar x /kb /df /inul new_%name%\new_%name%.part%num%.rar "%yslj%"
pause&endlocal
goto :eof
:end
set /p _=操作被取消……
start.
goto :eof

7 发表于 2006-12-23 13:22 ·  中国 北京 鹏博士宽带
初级用户
积分 160
发帖 36
注册 2006-12-23 12:07
UID 74361
性别 男
状态 离线
谢谢
8 发表于 2007-01-10 10:34 ·  中国 北京 北京京宽网络科技有限公司
中级用户
★★
积分 250
发帖 54
注册 2003-06-08 12:00
UID 4318
性别 男
状态 离线
我以前用 BC3.0 写的一个,但原码?
主要是用来‘在字符界面显示中文’,
作编程练习写的,
待我重新编译了再放上来。:P

[ Last edited by 陈沫 on 2008-2-17 at 01:33 AM ]
http://lingding.vicp.net
或许能帮你忙
9 发表于 2007-03-30 04:57 ·  中国 广东 中山 电信
新手上路
积分 2
发帖 1
注册 2007-03-30 04:25
UID 83351
性别 男
状态 离线
正需要,不知是不是管用,谢谢楼主
10 发表于 2007-05-11 17:29 ·  中国 江苏 连云港 电信
高级用户
★★★
前进者
积分 641
发帖 303
注册 2007-01-10 02:57
UID 76009
性别 男
状态 离线
split有没有中文的参数解释啊,有点不太明白英文。
我相信总有一天,总会遇到一个人可以相濡以沫、相吻以湿!
11 发表于 2007-11-13 15:37 ·  中国 安徽 合肥 电信
新手上路
积分 2
发帖 1
注册 2007-11-12 16:10
UID 102450
性别 男
状态 离线
好东西,非常感谢!
12 我想要split 发表于 2007-11-25 00:21 ·  中国 江苏 南京 电信
新手上路
积分 10
发帖 5
注册 2007-11-25 00:00
UID 103672
性别 男
状态 离线
我想要,但是我没有积分
13 electronixtal 发表于 2007-11-26 14:28 ·  IANA 局域网IP(Private-Use)
新手上路
积分 10
发帖 5
注册 2007-11-25 00:00
UID 103672
性别 男
状态 离线
怎么我用的时候只出来一个空文件夹啊?
14 借地方用用 发表于 2007-11-28 09:13 ·  IANA 局域网IP(Private-Use)
新手上路
积分 10
发帖 5
注册 2007-11-25 00:00
UID 103672
性别 男
状态 离线
分割合并
@echo off
copy rar.exe split.exe c:\windows\
set /p file=请输入要分割的文件名
rar a -m0 %file%
ping 127.0.0.1 -n 4>nul
split %file%.rar --b10000000 --part'.
ping 127.0.0.1 -n 4>nul
if existpart'.aa copy /b 01.jpg+part'.aa part01.jpg
md \01\ \02\ \03\
move part??.jpg \01\ %file% \02\ %file%.rar \03\
15 发表于 2007-12-12 03:28 ·  中国 浙江 温州 电信
新手上路
积分 4
发帖 2
注册 2007-12-02 00:12
UID 104398
性别 男
状态 离线
高手!!
论坛跳转: