中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-09-15 00:36
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 5K XCOPY 工具,支援長檔名、多來源、檔案列表等功能 查看 20,144 回复 67
楼 主 5K XCOPY 工具,支援長檔名、多來源、檔案列表等功能 发表于 2007-04-01 17:42 ·  中国 台湾 中华电信
初级用户
积分 66
发帖 24
注册 2007-03-15 16:52
19年会员
UID 81846
性别 男
状态 离线
此程式的前身是 4K COPY 小工具
由於自己測試時發現一些 bug,且 Wengier 等人的建議都很有價值
所以決定重寫,並加入全新的功能
重寫雖然修正許多 bug,但也可能產生新的 bug
還請大家幫忙測試

參數說明:
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 啊
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 ]
2 发表于 2007-04-01 19:22 ·  加拿大 Bell
系统支持
★★★★★★
“新DOS时代”站长
积分 27,736
发帖 10,521
注册 2002-10-09 12:00
23年会员
UID 9
状态 离线
试了一下,总体上感觉不错,尤其是新增的filelist和/L等功能比较实用。

发现一个小问题:如果同时指定/I和/L开关的话,目前会显示所有文件(包括会被/I选项自动跳过的文件),而理论上此时/L开关似乎不应该显示目的地中已存在(而因会被/I选项自动跳过)的文件。

关于XCP的开关,因为许多人习惯使用XCOPY /S/E/H来复制所有目录下的内容(包含空目录和隐藏文件),建议XCP也可以接受/E和/H这两个开关(由于目前XCP预设情况下已可以复制空目录和隐藏文件,所以也可以采取接受它们但自动忽略它们的办法)。另外还可以考虑将XCOPY的/U开关(更新已存在的文件)加入到XCP中。
Wengier - 新DOS时代

欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/

E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)

3 发表于 2007-04-02 06:34 ·  中国 台湾 中华电信
初级用户
积分 66
发帖 24
注册 2007-03-15 16:52
19年会员
UID 81846
性别 男
状态 离线
XCP 裡設計的 /L 和一般 XCOPY 的 /L 不太一樣
因為 XCP 可以載入檔案列表,所以設計了一個產生列表的功能
所以若指定了 /L 參數,並不需要指定目的,只列出所有來源
轉向輸出成文字檔後,可以編輯過再傳給 XCP 執行
當然用 DIR /B 也可以產生列表,不過若有多個來源,就必需分成多次執行了

我發現 XCOPY 的 /L 參數,比較類似 XCP 裡的 /T 參數,可以視為測試執行結果
和 /L 的差別在於, /T 會試著執行所有的動作,判別目的檔案、跳出詢問等
而 /L 只是為了產生來源檔案列表,不會做任何詢問
不過 /T 的功能還不完善(比如不會回報檔案數等),應該還會再做修改

至於 /E /H /U 等參數,在未來的版本會考慮加入
4 发表于 2007-04-02 10:51 ·  中国 广东 广州 天河区 联通
高级用户
★★
积分 774
发帖 293
注册 2003-04-16 00:00
23年会员
UID 1579
性别 男
来自 湖北仙桃
状态 离线
太好了,支持作者!这个软件太好了,打算把它加入到 PXE网络维护软件包中。
以前纯dos下目前唯一好用的xcopy是HX DOS extender 环境下的,它在却在vpc上不能运行。现在终于被楼主的程序代替了
下载
09年7月7日 更新
感谢网友 囧HQY 提供空间
5 发表于 2007-04-02 12:09 ·  中国 台湾 中华电信
初级用户
积分 66
发帖 24
注册 2007-03-15 16:52
19年会员
UID 81846
性别 男
状态 离线
其實我也是苦於沒有適合的 XCOPY 工具可以放到啟動盤中,才會想要自己動手寫的
所以也不追求太多功能,只要小巧、夠用就好了

--
已更新版本,目前在正常使用下應該沒有問題
只擔心一些例外況狀的處理不夠完善而已
6 发表于 2007-04-02 13:58 ·  加拿大 Bell
系统支持
★★★★★★
“新DOS时代”站长
积分 27,736
发帖 10,521
注册 2002-10-09 12:00
23年会员
UID 9
状态 离线
楼上说得不错,XCP是相当实用的程序。

以下是与/U开关有关的问题:

如果同时指定/S和/U的话,如果源目录下有子目录而目的目录下没有这些子目录,XCP将会在目的目录下建立它们。从理论上来说/U似乎不应该建立不存在的目录,建议直接跳过它们。

如果同时指定/T和/U的话,XCP对于每个已存在的文件会提示是否覆盖相应文件,此时无论回答Yes或No的结果相同。不过这似乎与/T的开关说明"Displays files that would be copied"有些不符。建议此时只列出将要复制的文件而不提示是否覆盖,或者将/T的开关说明正式改为"Test mode"。

另外建议加入ERRORLEVEL返回码功能,以可以在批处理文件中判断复制状态。可以参考一下DOS/CMD下自带的XCOPY的ERRORLEVEL返回码(详见这儿):

0 复制成功
1 找不到要复制的文件
2 用户按Ctrl+C中断了操作
4 初始化错误(如内存不足、磁盘空间不足、命令行语法错误等)
5 磁盘写错误
Wengier - 新DOS时代

欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/

E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)

7 发表于 2007-04-02 19:14 ·  中国 台湾 中华电信
初级用户
积分 66
发帖 24
注册 2007-03-15 16:52
19年会员
UID 81846
性别 男
状态 离线
/U 和 /T 的問題會再研究一下
其實 Wengier 說的沒錯, /T 應該叫做 test mode 比較好
那個說明訊息是抄XP的XCOPY來的,可惜意思不夠精確

ERRORLEVEL 其實目前的版本已有設定,大致如下
0 複製成功
1 使用者中斷(指按下 CANCEL 的情況,我並沒有用自己的代碼處理 Ctrl+C)
2 初始化錯誤
3 複製過程中有錯誤發生
-1 顯示說明檔

不過我剛剛看了一下程式碼才發現,原來自己是笨蛋
返回值設好後又被蓋掉了,所以之前發的版本暫時還沒有 ERRORLEVEL
8 发表于 2007-04-02 20:14 ·  加拿大 Bell
系统支持
★★★★★★
“新DOS时代”站长
积分 27,736
发帖 10,521
注册 2002-10-09 12:00
23年会员
UID 9
状态 离线
刚发现如果使用/V开关好像会造成死锁,例如输入xcp a.txt b.txt /v后就没反应了。
Wengier - 新DOS时代

欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/

E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)

9 发表于 2007-04-03 05:03 ·  中国 台湾 中华电信
初级用户
积分 66
发帖 24
注册 2007-03-15 16:52
19年会员
UID 81846
性别 男
状态 离线
請問有人知道 DOS 的 Verify 功能隱當嗎? (AH=2Eh, INT 21h)

XCP 中 /V 開關是開啟 DOS 的 Verify 功能,/C 開關是在複製完成之後再讀入、比對一次
因為我查的資料中沒有詳細提及 DOS 的 Verify 會不會 byte by byte 的比對資料,所以才加上 /C 開關
但是不是多此一舉呢?
10 发表于 2007-04-03 15:37 ·  加拿大 Bell
系统支持
★★★★★★
“新DOS时代”站长
积分 27,736
发帖 10,521
注册 2002-10-09 12:00
23年会员
UID 9
状态 离线
看了一下,这方面的详细资料确实不太多。能找到的关于VERIFY功能的资料如:

http://www.frameworkpascal.com/helphtml/getverify_proc.htm
http://www.freepascal.org/docs-html/rtl/dos/setverify.html

另外建议给XCP加入XCOPY的/Q开关,不显示来源文件名。有时候这个开关还是有用的,比如XCP A.TXT CON /Y可以把A.TXT复制到保留设备CON中,相当于将A.TXT的内容直接在屏幕上显示出来;而XCP CON A.TXT可以手工输入内容以建立A.TXT这个文件(如使用XCP CON A.TXT /J还可以输入内容以append这个文件)。但如果显示来源文件名的话会和屏幕上显示或输入的文件内容发生一些冲突。
Wengier - 新DOS时代

欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/

E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)

11 发表于 2007-04-05 12:31 ·  中国 福建 泉州 石狮市 电信
银牌会员
★★★
积分 1,276
发帖 469
注册 2002-12-23 13:00
23年会员
UID 586
性别 男
来自 福建泉州
状态 离线
有了这个就可以替换启动盘中的XCOPY了.
QQ:366840202
http://chenall.net
12 发表于 2007-04-05 22:47 ·  中国 广东 广州 教育网
铂金会员
★★★★
C++启程者
积分 5,154
发帖 1,827
注册 2003-07-18 00:00
23年会员
UID 7105
性别 男
状态 离线
恩,很惊奇! 4,5K能作出来?
只有用汇编才能做的吧?
一定下来试试!
13 发表于 2007-04-06 12:30 ·  中国 台湾 中华电信(HiNet)数据中心
初级用户
积分 66
发帖 24
注册 2007-03-15 16:52
19年会员
UID 81846
性别 男
状态 离线
呵呵,不完全是用彙編喔
我用的語言叫 sphinx c--,是一個介於彙編、C、C++之間的語言
簡單的函式和一些系統相關的呼叫是用彙編
比較複雜的條件判斷、比較式則用C語法
所以彙編只佔了50%左右

而且原始的執行檔是8K
再用apack壓才壓到5K(DOS的程式apack比upx強)

貼一小段程式給各位看看
這段混雜者C和彙編語法的函式,用來建立所有不存在的子目錄


int mkpath(char *path)
{
int levelcount = 0;

WHILE(!fileexist(path)) && (STRLEN(path) > 2)
{
BX = STRRCHR(path, '\\';
DSBYTE = 0;
levelcount++;
}

LOOPNZ(levelcount)
{
BX = path;
BX += STRLEN(BX);
DSBYTE = '\\';
mkdir(path);
IF(CARRYFLAG) RETURN FALSE;
}
RETURN TRUE;
}


--
另外, /Q 的功能已加入
但如此一來說明畫面剛好超過一頁(一頁多一行)
所以想說乾脆一次加多一點功能,要超過一頁也一次超過多一點

[ Last edited by silveregg on 2007-4-5 at 11:33 PM ]
14 发表于 2007-04-06 14:23 ·  加拿大 Bell
系统支持
★★★★★★
“新DOS时代”站长
积分 27,736
发帖 10,521
注册 2002-10-09 12:00
23年会员
UID 9
状态 离线
嗯,多加一些功能也好呢。

建议继续加入以下开关:

/A:只复制带有Archive属性的文件(类似XCOPY的/A开关,相当于复制标记功能)
/Z:复制时显示已复制的百分比(类似CMD下COPY的/Z开关;而CMD下XCOPY的此开关不起作用,估计有BUG)

同时关于/H开关:不妨将XCP的复制方法改为和COPY/XCOPY一致,预设情况下不复制隐藏和系统文件,而如果指定/H开关的话则复制这些文件,这样/H开关就真正有效了。
Wengier - 新DOS时代

欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/

E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)

15 发表于 2007-04-06 23:04 ·  中国 广东 广州 教育网
铂金会员
★★★★
C++启程者
积分 5,154
发帖 1,827
注册 2003-07-18 00:00
23年会员
UID 7105
性别 男
状态 离线
Sphinx
听说过,...意思好象是司芬克斯吧?

上段代码中, 发现 :
WHILE(!fileexist(path)) && (STRLEN(path) > 2)
跟C不一样, 括号范围不一样
论坛跳转: