|
silveregg
初级用户
 
积分 66
发帖 24
注册 2007-3-15
状态 离线
|
『楼 主』:
5K XCOPY 工具,支援長檔名、多來源、檔案列表等功能
此程式的前身是 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 ]
|
|
2007-4-1 17:42 |
|
|
Wengier
系统支持
             “新DOS时代”站长
积分 27735
发帖 10521
注册 2002-10-9
状态 离线
|
『第
2 楼』:
试了一下,总体上感觉不错,尤其是新增的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和雨露,谢谢!)
 |
|
2007-4-1 19:22 |
|
|
silveregg
初级用户
 
积分 66
发帖 24
注册 2007-3-15
状态 离线
|
『第
3 楼』:
XCP 裡設計的 /L 和一般 XCOPY 的 /L 不太一樣
因為 XCP 可以載入檔案列表,所以設計了一個產生列表的功能
所以若指定了 /L 參數,並不需要指定目的,只列出所有來源
轉向輸出成文字檔後,可以編輯過再傳給 XCP 執行
當然用 DIR /B 也可以產生列表,不過若有多個來源,就必需分成多次執行了
我發現 XCOPY 的 /L 參數,比較類似 XCP 裡的 /T 參數,可以視為測試執行結果
和 /L 的差別在於, /T 會試著執行所有的動作,判別目的檔案、跳出詢問等
而 /L 只是為了產生來源檔案列表,不會做任何詢問
不過 /T 的功能還不完善(比如不會回報檔案數等),應該還會再做修改
至於 /E /H /U 等參數,在未來的版本會考慮加入
|
|
2007-4-2 06:34 |
|
|
xugaohui
高级用户
   
积分 774
发帖 293
注册 2003-4-16 来自 湖北仙桃
状态 离线
|
『第
4 楼』:
太好了,支持作者!这个软件太好了,打算把它加入到 PXE网络维护软件包中。
以前纯dos下目前唯一好用的xcopy是HX DOS extender 环境下的,它在却在vpc上不能运行。现在终于被楼主的程序代替了
|

下载
09年7月7日 更新
感谢网友 囧HQY 提供空间 |
|
2007-4-2 10:51 |
|
|
silveregg
初级用户
 
积分 66
发帖 24
注册 2007-3-15
状态 离线
|
『第
5 楼』:
其實我也是苦於沒有適合的 XCOPY 工具可以放到啟動盤中,才會想要自己動手寫的
所以也不追求太多功能,只要小巧、夠用就好了
--
已更新版本,目前在正常使用下應該沒有問題
只擔心一些例外況狀的處理不夠完善而已
|
|
2007-4-2 12:09 |
|
|
Wengier
系统支持
             “新DOS时代”站长
积分 27735
发帖 10521
注册 2002-10-9
状态 离线
|
『第
6 楼』:
楼上说得不错,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和雨露,谢谢!)
 |
|
2007-4-2 13:58 |
|
|
silveregg
初级用户
 
积分 66
发帖 24
注册 2007-3-15
状态 离线
|
『第
7 楼』:
/U 和 /T 的問題會再研究一下
其實 Wengier 說的沒錯, /T 應該叫做 test mode 比較好
那個說明訊息是抄XP的XCOPY來的,可惜意思不夠精確
ERRORLEVEL 其實目前的版本已有設定,大致如下
0 複製成功
1 使用者中斷(指按下 CANCEL 的情況,我並沒有用自己的代碼處理 Ctrl+C)
2 初始化錯誤
3 複製過程中有錯誤發生
-1 顯示說明檔
不過我剛剛看了一下程式碼才發現,原來自己是笨蛋
返回值設好後又被蓋掉了,所以之前發的版本暫時還沒有 ERRORLEVEL
|
|
2007-4-2 19:14 |
|
|
Wengier
系统支持
             “新DOS时代”站长
积分 27735
发帖 10521
注册 2002-10-9
状态 离线
|
『第
8 楼』:
刚发现如果使用/V开关好像会造成死锁,例如输入xcp a.txt b.txt /v后就没反应了。
|

Wengier - 新DOS时代
欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/
E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)
 |
|
2007-4-2 20:14 |
|
|
silveregg
初级用户
 
积分 66
发帖 24
注册 2007-3-15
状态 离线
|
『第
9 楼』:
請問有人知道 DOS 的 Verify 功能隱當嗎? (AH=2Eh, INT 21h)
XCP 中 /V 開關是開啟 DOS 的 Verify 功能,/C 開關是在複製完成之後再讀入、比對一次
因為我查的資料中沒有詳細提及 DOS 的 Verify 會不會 byte by byte 的比對資料,所以才加上 /C 開關
但是不是多此一舉呢?
|
|
2007-4-3 05:03 |
|
|
Wengier
系统支持
             “新DOS时代”站长
积分 27735
发帖 10521
注册 2002-10-9
状态 离线
|
|
2007-4-3 15:37 |
|
|
chenall
银牌会员
    
积分 1276
发帖 469
注册 2002-12-23 来自 福建泉州
状态 离线
|
|
2007-4-5 12:31 |
|
|
GOTOmsdos
铂金会员
       C++启程者
积分 5154
发帖 1827
注册 2003-7-18
状态 离线
|
『第
12 楼』:
恩,很惊奇! 4,5K能作出来?
只有用汇编才能做的吧?
一定下来试试!
|
|
2007-4-5 22:47 |
|
|
silveregg
初级用户
 
积分 66
发帖 24
注册 2007-3-15
状态 离线
|
『第
13 楼』:
呵呵,不完全是用彙編喔
我用的語言叫 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[BX] = 0;
levelcount++;
}
LOOPNZ(levelcount)
{
BX = path;
BX += STRLEN(BX);
DSBYTE[BX] = '\\';
mkdir(path);
IF(CARRYFLAG) RETURN FALSE;
}
RETURN TRUE;
} --
另外, /Q 的功能已加入
但如此一來說明畫面剛好超過一頁(一頁多一行)
所以想說乾脆一次加多一點功能,要超過一頁也一次超過多一點 
[ Last edited by silveregg on 2007-4-5 at 11:33 PM ]
|
|
2007-4-6 12:30 |
|
|
Wengier
系统支持
             “新DOS时代”站长
积分 27735
发帖 10521
注册 2002-10-9
状态 离线
|
『第
14 楼』:
嗯,多加一些功能也好呢。
建议继续加入以下开关:
/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和雨露,谢谢!)
 |
|
2007-4-6 14:23 |
|
|
GOTOmsdos
铂金会员
       C++启程者
积分 5154
发帖 1827
注册 2003-7-18
状态 离线
|
『第
15 楼』:
Sphinx
听说过,...意思好象是司芬克斯吧?
上段代码中, 发现 :
WHILE(!fileexist(path)) && (STRLEN(path) > 2)
跟C不一样, 括号范围不一样
|
|
2007-4-6 23:04 |
|