/**********************************************************************************************************
C语言编写的文件拷贝程序(包括子目录,含文件属性的信息)基于VC6.0
科嵌电子 2012.07.17
**********************************************************************************************************/
#include <cstdio>
#include <cstdlib> //调用 system()方法的时候要用到
#include <ctime>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <direct.h> //调用__mkdir()创建目录所需的头文件
/**********************************************************************************************************
函数声明
**********************************************************************************************************/
int copyfile(char frscpath[],char fdestpath[]);
int findFile(char filePath[],char TofilePath[],long &Size,long &Num,long &Directory);
/**********************************************************************************************************
主函数
**********************************************************************************************************/
int main()
{
long Size=0,Num=0,Directory=0; //定义Size为文件大小,Num为文件个数,Directory为文件夹个数
char input[MAX_PATH]; //定义输入文件路径的字符数组
char output[MAX_PATH];
printf("*****************************************************************************\n");
printf(" 您正在运行文件拷贝程序 ");
printf("*****************************************************************************\n\n");
printf("请您输入需要拷贝的文件夹路径。如:C:\\\\windows 或 C:\\\\Documents and Settings\n");
scanf("%s",input);
printf("请您输入想要拷贝到的文件夹路径。如:C:\\\\windows 或 C:\\\\Documents and Settings\n");
scanf("%s",output);
findFile(input,output,Size,Num,Directory);//执行子函数findFile
printf("\n总共大小:%lldKB\n文件个数:%lld\n文件夹个数:%lld\n文件平均大小:%lldKB\n每个目录平均文件个数:%lld\n\n",Size,Num,Directory,Size/Num,Num/Directory);
system("pause");//"pause"这个是一个系统指令,就是在命令行上输出一行类似于“请按任意键继续...”的字,等待用户按一个键,然后返回。可以注释掉
return 0;
}
/**********************************************************************************************************
findFile函数
**********************************************************************************************************/
int findFile(char filePath[],char TofilePath[],long &Size,long &Num,long &Directory)
{
char ScrPath[MAX_PATH];
char DesPath[MAX_PATH];
char szFind[MAX_PATH]; //定义一个要找的文件路径的量
WIN32_FIND_DATA FindFileData;//WIN32_FIND_DATA结构描述了一个由FindFirstFile, FindFirstFileEx, 或FindNextFile函数查找到的文件信息
FILE_INFO1 FileInfo;
HANDLE hFind,hFiledest1,hFiledest2; //定义一个句柄 用于FindFirstFile()返回的值
/**********************************************************************************************************
函数介绍
void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节替换为ch并返回s;
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
**********************************************************************************************************/
memset(&FileInfo,0,sizeof(FILE_INFO));
strcpy(szFind,filePath); //把从后者地址开始且含有NULL结束符的字符串赋值到前者开始的地址空间
strcpy(DesPath,TofilePath); //把从后者地址开始且含有NULL结束符的字符串赋值到前者开始的地址空间
strcat(szFind,"\\*.*"); //把后者所指字符串添加到前者结尾处(覆盖前者结尾处的'\0')并添加'\0'。利用通配符找这个目录下的所以文件,包括目录
hFind=FindFirstFile(szFind,&FindFileData); //FindFirstFile函数返回HANDLE类型的值 其中FILE_ATTRIBUTE_DIRECTORY 表明文件是一个目录文件
//通过FindFirstFile()函数,根据当前的文件存放路径查找该文件来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中去
if(INVALID_HANDLE_VALUE==hFind) //如果返回的是INVALID_HANDLE_VALUE表明目录不存在
{
printf("目录不存在!");
return 0;
}
while(1)
{ //因为 FindFirstFile返回的 findData 中 dwFileAttributes项的值是一个组合的值
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //做位的与运算来判断所找到的项目是不是文件夹
{
if(FindFileData.cFileName[0]!='.') //每个目录下有个..目录可以返回上一层。如果不是返回目录
//.表示当前目录,因为每个目录下面都有两个默认目录就是..和.分别表示上一级目录和当前目录
{
Directory++; //文件夹个数加一
strcpy(DesPath,TofilePath);
strcat(DesPath,"\\");
strcat(DesPath,FindFileData.cFileName);
_mkdir(DesPath); //该语句直接在指定的位置创建目录
strcpy(FileInfo.szFileTitle,FindFileData.cFileName);
FileInfo.dwFileAttributes = FindFileData.dwFileAttributes;
FileInfo.ftCreationTime = FindFileData.ftCreationTime;
FileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime;
FileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime;
hFiledest1=CreateFile(DesPath, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING ,0, NULL);
SetFileTime(hFiledest1, //待写入的文件句柄
&FileInfo.ftCreationTime, //文件的创建时间
&FileInfo.ftLastAccessTime, //文件最近一次的访问时间
&FileInfo.ftLastWriteTime); //文件最近一次的修改时间
CloseHandle(hFiledest1);
SetFileAttributes(DesPath,FileInfo.dwFileAttributes);
strcpy(szFind,filePath);
// printf("我想知道目录名是什么:%s\n",FindFileData.cFileName);
// printf("我想知道该文件的属性是什么:%s\n",FindFileData.dwFileAttributes);
strcat(szFind,"\\");
strcat(szFind,FindFileData.cFileName);
findFile(szFind,DesPath,Size,Num,Directory); //如果当前文件是目录文件,则递归调用findFile
}
}
else
{
Num++; //文件个数加一
Size+=(long)(FindFileData.nFileSizeLow/1024); //对文件的大小进行统计 FindFileData.nFileSizeLow是字节大小
printf("%s\\%s\n%d字节\n",filePath,FindFileData.cFileName,FindFileData.nFileSizeLow);//输出目录下的文件的路径和名称和大小
strcpy(ScrPath,filePath);
strcat(ScrPath,"\\");
strcat(ScrPath,FindFileData.cFileName);
strcpy(DesPath,TofilePath);
strcat(DesPath,"\\");
strcat(DesPath,FindFileData.cFileName);
copyfile(ScrPath,DesPath);
strcpy(FileInfo.szFileTitle,FindFileData.cFileName);
FileInfo.dwFileAttributes = FindFileData.dwFileAttributes;
FileInfo.ftCreationTime = FindFileData.ftCreationTime;
FileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime;
FileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime;
hFiledest2=CreateFile(DesPath, GENERIC_READ|GENERIC_WRITE,0, NULL, OPEN_EXISTING , 0 , NULL);
SetFileTime(hFiledest2, //待写入的文件句柄
&FileInfo.ftCreationTime, //文件的创建时间
&FileInfo.ftLastAccessTime, //文件最近一次的访问时间
&FileInfo.ftLastWriteTime); //文件最近一次的修改时间
CloseHandle(hFiledest2);
SetFileAttributes(DesPath,FileInfo.dwFileAttributes);
}
if(!FindNextFile(hFind,&FindFileData)) //继续查找FindFir
评论0