此程式的前身是
4K COPY 小工具
由於自己測試時發現一些 bug,且 Wengier 等人的建議都很有價值
所以決定重寫,並加入全新的功能
重寫雖然修正許多 bug,但也可能產生新的 bug
還請大家幫忙測試 <img src="images/smilies/face-smile-big.png" align="absmiddle" border="0">
參數說明:
XCP 來源
來源可有多個,可用萬用符,最後一個參數指定目的
檔案列表格式為一個檔案一行,列表可有多個,內容可用萬用符
若只有一個參數,則視其為來源,目的為目前目錄,同 DOS 的 COPY
/S 子目錄拷貝
/M 移動檔案(和 /S 並用可移動目錄)
/J 若目的已存在則結合檔案
/D 指定目的為目錄
/F 指定目的為檔案
/V 檢驗拷貝結果
/C 拷貝後比對結果
/L 產生來源列表
/B 拷貝時顯示簡短訊息(只顯示來源檔案)
/Y 不詢問,總是回答 Yes
/I 不詢問,總是回答 No (無傷害的)
/R 不詢問,直接覆蓋唯讀檔案
/N 即使在有長檔名支援的環境下也不使用長檔名
補充說明:
1. 若無 /f 或 /d,且無法判斷目的為文件或目錄時,會出現詢問
若目的結尾為 \ 符號,暗指目的為目錄
2. 長檔名支援需在 Win9x/2K/XP 下或純 DOS 掛載 DOSLFN 或 LFNDOS
3. 指定目的為目錄時,可自動建立不存在的目錄和子目錄
如目的可為 1\2\3\4\ ,相應的目錄會自動建立
4. 來源可為目的目錄的父目錄,不會進入無窮迴圈
5. 拷貝時子目錄的上限為 24 層,超過的層數無法處理
http://zhenlove.com.cn/cndos/fileup/files/xcp13.zip
==========================================
1.4 版更新
新增參數:
/U 只處理目的已存在的檔案
/T 測試模式
其它修正項目:
1. 使用 /T /L 時也會回報檔案個數
2. 讀取檔案列表時,自動忽略以空格開頭的行
如此一來用 /L 產生列表後,可直接由 @ 讀入
3. 依 Wengier 的建議,忽略 /E /H
http://zhenlove.com.cn/cndos/fileup/files/xcp14.zip
==========================================
1.41 版更新
修正項目:
1. 修正 /V 開關死鎖問題
2. 修正 /U 開關建立空目錄問題
3. 新增 ERRORLEVEL 返回碼,仿造 XCOPY 的值(誰知道為什麼沒有 3 啊 <img src="images/smilies/face-surprise.png" align="absmiddle" border="0">)
0 複製成功
1 無文件可複製
2 Ctrl+C 或選取 Cancel 中斷操作
4 命令行語法錯誤
5 複製時讀寫發生錯誤
-1 無參數或顯示說明
http://zhenlove.com.cn/cndos/fileup/files/xcp141.zip
==========================================
1.5 版更新
新增參數:
/E 複製時包含空目錄(預設開啟)
/T 建立樹狀構結而不複製檔案,可和 /E 並用
/Z 檔案已存在時從中斷處繼續複製
/A 只處理含有 ARCHIVE 屬性的檔案
/H 複製時包括隱藏檔和系統檔(預設開啟)
/O 複製成功後清除原始檔案的 ARCHIVE 屬性
/P 複製時顯示進度
/X 測試模式,也就是 1.4 版之前的 /T
/G 複製時不檢查磁碟剩餘空間
修正項目:
1. 複製中可用 Ctrl + C 中斷
2. 判別四個常用的 DOS 裝置名稱: CON、PRN、AUX、NUL
如此一來可用 xcp con a.txt /q /n 建立新檔
3. 所有開關可用 +/- 來開啟關閉,如 /E- /H- 或 /-E /-H
4. 傳統 XCOPY 中的 /M 開關,在 XCP 中應以 /A /O 代替
http://zhenlove.com.cn/cndos/fileup/files/xcp15.zip
==========================================
1.6 版更新
新增參數:
/K 複製屬性(預設開啟)
/W 將@符號視為檔名的一部份,而非檔案列表
修正項目:
1. 修正處理 DOS 裝置名稱時發生的錯誤,感謝 Wengier 大提出
2. 處理子目錄的上限增加至 35 層
3. /R 開關改為「處理唯讀檔案」,預設開啟,若用 /-R 關閉,則 XCP 會跳過唯讀檔案
4. 對於唯讀檔案的覆寫,改成只會出現一次提問
5. 修正檔案列表最後一行無換行符號時發生錯誤
6. 讓結合檔案時目的檔案的屬性保持不變
7. 修正讀取檔案發生錯誤時,無錯誤訊息的 BUG
8. 新增顯示建立子目錄的個數
9. 加強錯誤訊息,更容易判斷命令列的問題所在
10. 修正某些錯誤的 ERRORLEVEL 返回值
http://zhenlove.com.cn/cndos/fileup/files/xcp16.zip
==========================================
1.61 版更新
修正項目:
1. 加強 "." 或 ".." (當前目錄、父目錄)的判別,並且可用 "..." 、 "...." 等指定 N 層之前的目錄
2. 修正1.6版中 /P 顯示百分比的問題,並且加強換行時的處理
此版開始應該不會再有換行時出錯的問題
3. 加入以下保留設備的判別 LPT1、LPT2、LPT3、COM1、COM2、COM3、COM4
4. 修正 Wengier 大提出的顯示問題
http://zhenlove.com.cn/cndos/fileup/files/xcp161.zip
==========================================
1.62 版更新
修正項目:
1. 不詢問是否覆蓋 DOS 裝置
2. 修正建立子目錄的個數計算錯誤
3. 壓縮檔內加入中文說明檔
http://zhenlove.com.cn/cndos/fileup/files/xcp162a.zip
==========================================
1.63 版更新
更新項目:
1. 命令列參數可連接並省略中間空白,如 /s/e-/h-
2. 更新參數說明
http://zhenlove.com.cn/cndos/fileup/files/xcp163.zip
Last edited by silveregg on 2007-4-26 at 02:28 AM ]
LLM 解释
技术背景与实现分析
XCP 是针对 DOS 环境下传统 XCOPY 功能不足(如长文件名支持、多来源处理、文件列表导入等)开发的轻量级复制工具,其核心设计目标是小巧体积与实用功能的平衡。以下是关键技术点的解释:
1. 长文件名支持的前提
XCP 的长文件名支持依赖外部环境:
- 在 Win9x/2K/XP 的 DOS 窗口中,系统本身提供长文件名(LFN)支持;
- 纯 DOS 环境下需加载
DOSLFN 或 LFNDOS 等第三方驱动(通过扩展 DOS 中断 21h 的 71h 子功能实现 LFN 调用)。
若未满足上述条件,使用 /N 开关可强制禁用长文件名,仅以 8.3 格式处理文件。
2. 自动建目录的实现逻辑
XCP 通过 mkpath 函数(作者在后续回复中贴出的混合 C--/汇编代码)实现递归创建目录:
- 从目标路径的最深层开始,向上查找已存在的父目录;
- 记录缺失的目录层级,再从上层到下层依次调用
mkdir(DOS 中断 21h 的 39h 子功能)创建。
该逻辑确保目标路径的所有父目录被自动建立,但存在**24层(1.3版)/35层(1.61版)**的目录深度限制,这是由于作者在代码中对路径长度或递归层数的硬编码约束。
3. 关键开关的技术细节
-
/L 与 /T 的区别:
-
/L 仅遍历来源文件并输出列表(无复制操作),支持多来源合并生成列表(替代多次 DIR /B);
-
/T(1.4版为测试模式,1.5版改为“只建目录不复制文件”)会模拟复制流程(包括目录创建判断),但不执行文件读写。
-
/V 与 /C 的校验机制:
-
/V 依赖 DOS 中断 21h 的 2Eh 子功能(SETVERIFY),开启后 DOS 会在写磁盘时验证扇区数据,但该功能的具体实现(如是否逐字节校验)因 DOS 版本而异,可靠性不足;
-
/C 是作者补充的手动校验:复制后重新读取目标文件,与源文件逐字节比对,避免依赖 DOS 内置验证的不确定性。
-
/Z(断点续传)的限制:
仅对已存在的目标文件有效,通过读取目标文件大小定位到源文件的对应偏移量开始续传,但不支持网络环境或跨介质的断点续传(无文件哈希或断点记录)。
4. 体积优化手段
- 开发语言:使用 Sphinx C--(介于 C 与汇编之间的语言),核心逻辑用汇编实现(约占 50%),平衡开发效率与体积控制;
- 压缩工具:用
apack(DOS 下比 UPX 更高效的压缩工具)将原始 8KB 执行档压缩至 5KB 左右。
5. 历史局限性与常见问题
-
目录深度限制:早期版本(1.3)的 24 层限制源于 DOS 对路径长度的默认处理(传统 DOS 路径长度上限为 64 字节,长文件名环境下扩展为 260 字节),1.61 版提升至 35 层是作者调整路径缓冲区大小后的结果,但仍未达到理论上限;
-
/V 开关死锁:1.3 版中 /V 开启后无响应,是由于作者未正确处理 DOS SETVERIFY 功能的状态切换(1.41 版已修复);
-
ERRORLEVEL 覆盖问题:早期版本中作者正确设置了返回码,但后续代码逻辑错误地覆盖了该值,导致无法在批处理中判断执行结果(1.41 版修复)。
6. 与传统 XCOPY 的对比优势
- 支持多来源与文件列表导入(
@ 前缀),无需编写复杂批处理;
- 原生支持长文件名(依赖外部驱动);
- 体积小巧(压缩后 5KB 左右),适合放入启动软盘;
- 提供更灵活的校验选项(
/C)与断点续传(/Z)。
版本迭代的核心改进
从 1.3 到 1.63 版,XCP 的迭代主要解决功能补全与兼容性问题:
- 1.4 版新增
/U(仅更新已存在文件)、/T(测试模式);
- 1.41 版修复
/V 死锁、/U 误建空目录,并完善 ERRORLEVEL;
- 1.5 版扩展开关(
/A//H//O//P 等),支持开关的 +/- 语法(如 /E- 禁用空目录复制);
- 1.6 及以后版本:增加
/K(复制文件属性)、/W(处理含 @ 的文件名),提升目录深度限制,修复 DOS 设备名(CON/PRN 等)的处理错误。
XCP 是 DOS 时代针对传统复制工具缺陷的实用替代方案,其设计思路充分利用了 DOS 中断与轻量级语言的特性,同时通过手动校验、多来源处理等功能弥补了原生工具的不足。