| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3946 人关注过本帖
标题:[原创]xcopy32完整实现
只看楼主 加入收藏
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
 问题点数:0 回复次数:13 
[原创]xcopy32完整实现

*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: yuki
*/ 时间: 2007-8-23 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------

作者声明:
1、这是一个完整的原创开发实例,目的在于揭示一个完整应用的开发过程,开发原理完全是作者长期开发过程中所总结的,如果有错误,或者与正规开发模式有出入,请指正,作者在这里感谢各位参与批评指正的朋友。
2、这是一个完全开源软件,作者在这里不与大家讨论该软件是否有开源价值,只是想让大家更积极的参与讨论软件的开发,以及对该软件的bug修正。

软件介绍:
以前使用过dos的朋友都知道,xcopy是一款当年流行的文件拷贝工具,不仅能够进行单文件拷贝,更多的使用作目录树的拷贝,刚开始学习编程时,对于这样的软件十分好奇,总是思考着如何去实现,但经过好几年的程序学习仍然没有方法编写,直到现在就读于计算机专业后,才发现,这样一款小型的软件牵扯到很多知识背景,由于现在dos的命令行环境已被逐渐淡忘,许多诸如xcopy的功能不复存在,今年暑假我就决心去实现当年的经典,在10天克服许许多多艰难困苦走过来的时候,觉得那份甜美是没有任何东西可以取代的。

知识背景:
C/C++基础,Windows编程基础,熟悉数据结构,操作系统原理

使用到的Windows API函数:
CreateFileA, FindFirstFileA, FindNextFileA, ReadFile, WriteFile, CreateDirectoryA, DeleteFileA, InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection, CreateThread, CloseHandle, FindClose, RemoveDirectoryA, ExitThread
这些函数我不多作介绍,请自行查找msdn,自己动手才有收获么,我也是这么过来的。

使用到的主要数据结构:
树(一般树),栈(使用链表的动态栈),链表(单向、双向),HASH表,串

使用到的操作系统原理:
临界区资源的互斥访问

开发概念:
开发一个完整的、实用的项目到底应该怎么做,许多人都是无从下手,其实我也有这个感觉,一旦项目庞大了,要考虑的问题也就多了,自然而然产生的困难也就多了。要是觉得一块大的比萨饼没法吃,为什么不把它分的小一点呢?这样就引入了一个项目分块,但是分块前要明确软件的最终目的。
1、软件目的:
xcopy32要实现的是一个多线程的文件或目录树的复制操作。
2、软件的功能确定:
复制文件及目录树是主要功能,附带线程的调整,数据校验,转移操作(如同move命令)
3、确定提供软件的工具:
a. 指正在软件中使用频繁,频繁的分配与回收会造成内存碎片的产生,为了减少碎片采用段(块)页式内存管理 --> (malloc.h, malloc.cpp)
b. 多线程文件复制时必然需要将文件分块,所以要引入线程创建与分块这个概念 --> (thread.h, thread.cpp)
c. 由于该软件是基于命令行的操作,便要引入命令行分析概念 --> (param.h, param.cpp)
d. 文件与目录树的搜索,作为软件的核心 --> (xcopy32.h, xcopy32.cpp)
e. 由于目录树的搜索需要使用树这一数据结构,而树的遍历主要使用层次遍历,这样就要引入栈这个概念 --> (stack.h, stack.cpp)
f. 对于空指针的判断与操作进行宏定义封装 --> (null.h)
g. 对于数据类型的重定义与全局常量宏 --> (def.h)
h. 为了支持软件的发展与测试,引入版本管理 --> (version.h)
到这里,一个项目就规划好了,接着就是编码了。

编码:
心急喝不了热粥,模块要一个一个做,做完一个功能就测试一个功能,当你全部做完再测试,错误的连锁反应会让你打退堂鼓,每成功调试一个功能,修正一个错误,都让你在前进的路上留下了深深的脚印,每每会头,都是对自己一种继续前进的鼓励与支柱。
好了,至于如何编写程序,我在这里不多介绍,附件中有记载部分的算法原理(本人认为比较难理解的),代码加了点注释,代码阅读顺序可以参看开发日志进行阅读。

编译环境:
Visual Studio 2005 .net team edition 打开xcopy32\src\xcopy32.sln即可编译

软件参数说明:
-s 来源路径
-d 目的路径
-p 复制子文件夹及其所有文件
-o 总是覆盖(没有这个选项则遇到已存在文件将给出提示)
-m 转移(相当于move,将来源全部转移到目的)
-tn 每个文件用n个线程复制,线程约束1~5
-v 数据校核

软件使用方法:
例xcopy32 -sC:\program files\common files\*.dll -dd:\abcd\efg -p -t5 -v -o
例xcopy32 -sc:\go.bat -dd:\ -t5 -m -o

附件下载:

ta6OyXNv.rar (78.03 KB) [原创]xcopy32完整实现



希望广大网友踊跃发言,因为上述文章也是本人经验之谈,批评与指正错误,谢谢。

[此贴子已经被作者于2007-8-24 8:53:05编辑过]

搜索更多相关主题的帖子: 编程论坛 声明 中国 开发 
2007-08-23 21:43
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
收藏
得分:0 
good job!

And good documentation!


I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-08-24 00:12
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 

支持一个,虽然不是很了解。先留起,以后希望能用的到。

Hjin觉得好就别人加个精华啊,偶评价不了好坏!闪了!


Fight  to win  or  die...
2007-08-24 00:15
guying
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-8-16
收藏
得分:0 
支持一个,虽然不是很了解。
2007-08-28 00:46
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
回复:(yuki)[原创]xcopy32完整实现

感谢大家的支持,软件不断更新中,发布1.1.23 Build 0096版

更新内容:

////////////////////////////////////////////////////////////////////////////
// 2007-08-30
// 修改的文件列表:version.h, threads.cpp, threads.h
// 1. 修正一个并发时所产生的随机错误
// * 问题描述
// * 在创建线程的过程中,对于一部分已经创建的线程,调度器可能已经让其运行,也有可能已经运行完毕。
// * 在运行完毕后,全局变量threads_available+1,若此时线程并没有创建完成,则有可能对于threads_available,
// * 的影响导致线程反复创建,这样计算的分块起始位置(dwBeginOffset)有可能越界,导致无法正确复制文件。
// 2. 使用内存映像技术来取代传统的文件复制(ReadFile/WriteFile),提高文件复制速度,并支持大文件拷贝
// 3. 使用内存映像技术来进行文件数据校核,提高校核速度
// 4. 撤销了三处静态数组,从原本运行期占用6MB左右内存降至3MB
// 5. 可使用Release模式编译程序
/////////////////////////////////////////////////////////////////////////////

新引入的Windows API函数调用:
CreateFileMappingA, MapViewOfFile, UnmapViewOfFile

完整下载:

lZVrvIMA.rar (14.95 KB) [原创]xcopy32完整实现


[此贴子已经被作者于2007-8-30 15:35:39编辑过]



BOGLVhRv.rar (41.86 KB) [原创]xcopy32完整实现


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2007-08-30 15:34
青格儿
Rank: 4
等 级:贵宾
威 望:11
帖 子:698
专家分:20
注 册:2007-7-31
收藏
得分:0 
顶! 虽然我不懂你的程序,但是你做真得很棒!
2007-09-01 14:27
wsy
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-9-2
收藏
得分:0 
我下回来后运行不了 说是
xcopy32.exe”: 已加载“F:\五十一\工程\xcopy32\src\release_no_opt\xcopy32.exe”,未使用调试信息生成二进制文件。
“xcopy32.exe”: 已加载“C:\WINDOWS\system32\ntdll.dll”,未加载任何符号。
“xcopy32.exe”: 已加载“C:\WINDOWS\system32\kernel32.dll”,未加载任何符号。
“xcopy32.exe”: 已加载“C:\WINDOWS\system32\shimeng.dll”,未加载任何符号。
“xcopy32.exe”: 已卸载“C:\WINDOWS\system32\shimeng.dll”
程序“[3072] xcopy32.exe: 本机”已退出,返回值为 0 (0x0)。

不甚了解..
谢谢指点一下

2007-09-05 19:52
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
以下是引用wsy在2007-9-5 19:52:38的发言:
我下回来后运行不了 说是
xcopy32.exe”: 已加载“F:\五十一\工程\xcopy32\src\release_no_opt\xcopy32.exe”,未使用调试信息生成二进制文件。
“xcopy32.exe”: 已加载“C:\WINDOWS\system32\ntdll.dll”,未加载任何符号。
“xcopy32.exe”: 已加载“C:\WINDOWS\system32\kernel32.dll”,未加载任何符号。
“xcopy32.exe”: 已加载“C:\WINDOWS\system32\shimeng.dll”,未加载任何符号。
“xcopy32.exe”: 已卸载“C:\WINDOWS\system32\shimeng.dll”
程序“[3072] xcopy32.exe: 本机”已退出,返回值为 0 (0x0)。

不甚了解..
谢谢指点一下

xcopy32是给予参数运行的,单编译执行xcopy32会提示语法不正确,请输入xcopy32 -?或xcopy32 -h查看参数。
你可以把编译后的xcopy32.exe复制到容易找到的路径,比如c:\
然后打开cmd,在c:\>提示符下执行xcopy32复制文件树,我举个例子:
xcopy32 -sc:\program files\common files\*.dll -dc:\temp -p -o -t2 -v
-s指源路径
-d指目标路径
(-s和-d都是必须的参数)
-p是复制其目录下的所有子目录和文件
-o总是覆之(指目标路径中若存在需复制的文件,则覆盖之,忽略则提示是否要覆盖)
-t2表示复制文件时使用2个线程(忽略则只是用单线程,最多5个线程,具体查看-h)
-v进行数据校验(源文件与目标文件进行数据校验,忽略则不进行该操作)
其他参数请参看帮助-H或-?


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2007-09-05 20:36
reedleaf
Rank: 2
等 级:新手上路
威 望:3
帖 子:62
专家分:0
注 册:2007-8-5
收藏
得分:0 

必须要支持一下的帖子!!!


2007-10-10 21:31
reedleaf
Rank: 2
等 级:新手上路
威 望:3
帖 子:62
专家分:0
注 册:2007-8-5
收藏
得分:0 
不过为什么不用VC开发呢?

2007-10-10 21:34
快速回复:[原创]xcopy32完整实现
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017249 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved