




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验五:复制文件一、实验目的熟悉UNIX和Linux文件系统提供的有关文件操作的系统调用。文件系统是使用计算机信息系统的重要接口。通过使用文件系统的系统调用命令操作文件,以达到对文件系统实现功能的理解和掌握。了解在Windows中,文件系统如何管理保存在磁盘、光盘等存储介质上的信息。并通过文件系统提供的各种API,对文件进行同步和异步读写,深入理解Windows文件系统的功能和作用以及同步I/O和异步I/O的特点。这里引入文件映射对象、命名管道和邮件槽的概念,加深对文件系统的一些先进技术的深入理解。二、程序设计与实现Linux下:1、文件复制函数voidCopyFile(char *fsource,char *ftarget)intfd = open(fsource,0); /打开文件,文件描述符fdr = creat(ftarget,statbuf.st_mode);totals+;/totals是全局变量,统计总共复制的文件数while(wordbit = read(fd,BUFFER,1024) 0) /读取源文件字节数0 write(fdr,BUFFER,wordbit); /写入目标文件 timeby.actime = statbuf.st_atime; /修改文件的时间信息timeby.modtime = statbuf.st_mtime; close(fd); /关闭文件close(fdr);2、复制源目录voidMycp(char *fsource,char *ftarget)/*初始化相关变量*/dir = opendir(source); /打开目录,返回指向DIR结构的指针while(entry = readdir(dir) != NULL) /读目录if(strcmp(entry-d_name,.) = 0 | strcmp(entry-d_name,.) = 0) /判断目录continue;if(entry-d_type = 4) /*参数修改*/stat(source,&statbuf); /统计文件属性信息mkdir(target,statbuf.st_mode); /创建目标目录timeby.actime = statbuf.st_atime;timeby.modtime = statbuf.st_mtime; /修改文件存取和修改时间utime(target,&timeby);Mycp(source,target);else /没有子目录,直接复制/*参数修改*/CopyFile(source,target);/调用文件复制函数 3、遍历源目录voidwalkdir(char *dir,char *dedir,int depth)if(dp = opendir(dir)=NULL) /*打开文件出错报错*/if(dedp = opendir(dedir)=NULL)/*目标目录不存在创建目标目录*/ mkdir(dedir,statbuf.st_mode); /创建目录timeby.actime = statbuf.st_atime; /修改时间属性,存取时间timeby.modtime = statbuf.st_mtime; /修改时间utime(dedir,&timeby); Mycp(dir,dedir); /开始复制4、main函数接受源目录和目标目录int main(intargc,char* argv)if(argc2)printf(need two parameters!n);/*输入参数不足报错*/Windows下:1、main函数检查是否传递两个目录给程序,传递目录成功则开始遍历目录,否则报错退出if (argc != 3)printf(ARGC ERROR!n); /参数出错return -1;elsewalkdir(argv1,argv2);/查找目录2、walkdir函数检查是否打开源目录,失败则报错退出,成功则检查是否已存在目标目录,不存在则创建该目录。两项检查完毕后进行复制操作。if (FindFirstFile(sodir, &lpfindfiledata) = INVALID_HANDLE_VALUE)printf(Source Folder does not exist!n); /查找源文件路径失败if (FindFirstFile(dedir, &lpfindfiledata) = INVALID_HANDLE_VALUE)/当目标目录不存在时,创建该目录CreateFileD(sodir,dedir);Mycp(sodir, dedir); /复制3、Mycp函数,复制源目录信息void Mycp(char *fsource, char *ftarget) /将源目录信息复制到目标目录下if (hfind != INVALID_HANDLE_VALUE) /句柄是否有效while (FindNextFile(hfind, &lpfindfiledata) != 0) /循环找文件if (strcmp(lpfindfiledata.cFileName, .) != 0) & (strcmp(lpfindfiledata.cFileName, .) != 0) /是否是目录 if (strcmp(lpfindfiledata.cFileName, .) != 0) & (strcmp(lpfindfiledata.cFileName, .) != 0) /是否存在该目录 /*文件名的字符串处理*/CreateFileD(source, target); /创建目录Mycp(source, target); /递归进入子目录复制 else /*文件名的字符串处理*/CopyFile(source, target); /直接复制文件 4、CopyFile函数复制文件并统计复制的文件数voidCopyFile(char *fsource, char *ftarget)totals+; /统计复制的文件数/*处理句柄信息,查找路径*/int *BUFFER = new intsize; /新开缓冲区,保存数据ReadFile(hsource, BUFFER, size, &wordbit, NULL); /源文件读数据WriteFile(htarget, BUFFER, size, &wordbit, NULL); /目标文件写数据/*关闭句柄和文件*/三、实验代码如下:1.Windows下:/ 复制文件.cpp : 定义控制台应用程序的入口点。/#include stdafx.h/windows copyfile/*APICreateFile(), ReadFile(), WriteFile(), CloseHandle().so on*/#include#include#include#include#includevoid Mycp(char *fsource, char *ftarget); /将源目录信息复制到目标目录下void CopyFile(char *fsource, char *ftarget); /BOOL GetDirectoryTime(char *DirectoryName, FILETIME *lpCreationTime, FILETIME *lpLastAccessTime, FILETIME *lpLastWriteTime); /得到时间信息BOOL SetDirectoryTime(char *DirectoryName, FILETIME lpCreationTime, FILETIME lpLastAccessTime, FILETIME lpLastWriteTime); /设置时间信息int CreateFileD(char *source, char *target); /为目标文件创建目录并保持和源文件相同的属性int main(int argc, char *argv)WIN32_FIND_DATA lpfindfiledata;/*typedef struct _WIN32_FIND_DATA DWORD dwFileAttributes; /文件属性FILETIME ftCreationTime; / 文件创建时间FILETIME ftLastAccessTime; / 文件最后一次访问时间FILETIME ftLastWriteTime; / 文件最后一次修改时间DWORD nFileSizeHigh; / 文件长度高32位DWORD nFileSizeLow; / 文件长度低32位DWORD dwReserved0; / 系统保留DWORD dwReserved1; / 系统保留TCHAR cFileName MAX_PATH ; / 长文件名TCHAR cAlternateFileName 14 ; / 8.3格式文件名 WIN32_FIND_DATA, *PWIN32_FIND_DATA;*/if (argc != 3)printf(ARGC ERROR!n); /参数出错else/*查找指定文件路径的文件FindFirstFileHANDLE FindFirstFile(LPCTSTRlpFileName, /filenameLPWIN32_FIND_DATAlpFindFileData /databuffer);调用成功返回一个句柄;调用失败 返回为INVALID_HANDLE_VALUE*/if (FindFirstFile(argv1, &lpfindfiledata) = INVALID_HANDLE_VALUE)printf(Source Folder does not exist!n); /查找源文件路径失败if (FindFirstFile(argv2, &lpfindfiledata) = INVALID_HANDLE_VALUE)/argv2目标文件CreateFileD(argv1, argv2);Mycp(argv1, argv2); /复制printf(Copy Finished!n);return 0;int CreateFileD(char *source, char *target)FILETIME lpCreationTime; /创建时间FILETIME lpLastAccessTime; /最近一次访问时间FILETIME lpLastWriteTime; /最近一次修改时间/创建目录/*BOOL CreateDirectory(LPCTSTR lpPathName, /新创建目录的路径名LPSECURITY_ATTRIBUTES lpSecurityAttributes /安全属性);*/int appendix = CreateDirectory(target, NULL);GetDirectoryTime(source, &lpCreationTime, &lpLastAccessTime, &lpLastWriteTime);SetDirectoryTime(target, lpCreationTime, lpLastAccessTime, lpLastWriteTime);return appendix;BOOL GetDirectoryTime(char *DirectoryName, FILETIME *lpCreationTime, FILETIME *lpLastAccessTime, FILETIME *lpLastWriteTime)/获取文件夹时间属性信息HANDLE hDirectory = CreateFile(DirectoryName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);/*CreateFile,可打开或创建以下对象,并返回可访问的句柄HANDLE WINAPI CreateFile(_In_ LPCTSTR lpFileName,_In_ DWORD dwDesiredAccess, 访问方式_In_ DWORD dwShareMode, 共享_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, 安全属性_In_ DWORD dwCreationDisposition, OPEN_EXISTING 文件必须已经存在_In_ DWORD dwFlagsAndAttributes, 指示系统为文件的打开或创建执行一个备份或恢复操作. 系统保证调用进程忽略文件的安全选项_In_opt_ HANDLE hTemplateFile);*/BOOL retval = GetFileTime(hDirectory, lpCreationTime, lpLastAccessTime, lpLastWriteTime);CloseHandle(hDirectory); /关闭文件夹return retval;BOOL SetDirectoryTime(char *DirectoryName, FILETIME lpCreationTime, FILETIME lpLastAccessTime, FILETIME lpLastWriteTime)/设置文件夹时间属性HANDLE hDirectory = CreateFile(DirectoryName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);BOOL retval = SetFileTime(hDirectory, &lpCreationTime, &lpLastAccessTime, &lpLastWriteTime);CloseHandle(hDirectory);return retval;void CopyFile(char *fsource, char *ftarget)WIN32_FIND_DATA lpfindfiledata;HANDLE hfind = FindFirstFile(fsource, &lpfindfiledata); /查找指定文件路径HANDLE hsource = CreateFile(fsource, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS,/* 文件若存在则打开*/FILE_ATTRIBUTE_NORMAL, NULL);HANDLE htarget = CreateFile(ftarget, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS,/*创建一个文件*/ FILE_ATTRIBUTE_NORMAL/* 不设置属性*/, NULL);LONG size = lpfindfiledata.nFileSizeLow - lpfindfiledata.nFileSizeHigh; /lengthDWORD wordbit;int *BUFFER = new intsize; /新开缓冲区,保存数据ReadFile(hsource, BUFFER, size, &wordbit, NULL); /源文件读数据/*BOOL ReadFile(HANDLE hFile, /文件的句柄LPVOID lpBuffer, /保存读入数据的一个缓冲区DWORD nNumberOfBytesToRead, /读入的字节数LPDWORD lpNumberOfBytesRead, /指向实际读取字节数的指针LPOVERLAPPED lpOverlapped /如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。/该结构定义了一次异步读取操作。否则,应将这个参数设为NULL);*/*WriteFile 函数原型与CreateFile相同*/WriteFile(htarget, BUFFER, size, &wordbit, NULL); /目标文件写数据/修改文件时间信息/*SetFileTime参数 类型及说明hFile Long,系统文件句柄lpCreationTime FILETIME,文件的创建时间lpLastAccessTime FILETIME,文件上一次访问的时间lpLastWriteTime FILETIME,文件最近一次修改的时间*/GetFileTime(hsource,&lpfindfiledata.ftCreationTime,&lpfindfiledata.ftLastAccessTime,&lpfindfiledata.ftLastWriteTime);/SetFileTime(htarget,&lpfindfiledata.ftCreationTime,&lpfindfiledata.ftLastAccessTime,&lpfindfiledata.ftLastWriteTime);CloseHandle(hfind); /关闭句柄CloseHandle(hsource);CloseHandle(htarget);void Mycp(char *fsource, char *ftarget) /将源目录信息复制到目标目录下WIN32_FIND_DATA lpfindfiledata;char source512;char target512;strcpy(source, fsource); /copy source-fsourcestrcpy(target, ftarget);strcat(source, *.*);strcat(target, );HANDLE hfind = FindFirstFile(source, &lpfindfiledata);if (hfind != INVALID_HANDLE_VALUE)while (FindNextFile(hfind, &lpfindfiledata) != 0) /查找下一个文件成功/*FindNextFile根据指定的一个文件名查找下一个文件BOOLFindNextFile(HANDLE hFindFile, /searchhandleLPWIN32_FIND_DATA lpFindFileData /databuffer);*/if (lpfindfiledata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) /判断目录if (strcmp(lpfindfiledata.cFileName, .) != 0) & (strcmp(lpfindfiledata.cFileName, .) != 0)memset(source, 0, sizeof(source);strcpy(source, fsource);strcat(source, );strcat(source, lpfindfiledata.cFileName); /追加文件strcat(target, lpfindfiledata.cFileName);CreateFileD(source, target);Mycp(source, target); /进入子目录复制strcpy(source, fsource);strcat(source, );strcpy(target, ftarget);strcat(target, );else /无目录/直接复制memset(source, 0, sizeof(source);strcpy(source, fsource);strcat(source, );strcat(source, lpfindfiledata.cFileName);strcat(target, lpfindfiledata.cFileName);CopyFile(source, target);strcpy(source, fsource);strcat(source, );strcpy(target, ftarget);strcat(target, );2.Linux下代码:#include #include #include #include #include #include #include #include #include /整体思路同windows非常相似void Mycp(char *fsource,char *ftarget); /将源目录信息复制到目标目录下void CopyFile(char *fsource,char *ftarget); /直接复制/各种函数原型的应用,参数的设置,查找很多函数资料int main(int argc,char *argv)struct stat statbuf; /stat结构struct utimbuf timeby; /文件时间结构/*文件相关三个时间字段statst_atime 最后存取时间st_mtime 最后修改时间st_ctime i节点状态的最后更改时间struct utimbuftime_t actime; 文件数据的最后存取时间time_t modtime; 文件数据的最后修改时间*/DIR * dir; /DIR结构的指针,指向目录的第一个文件if(argc != 3) /参数出错printf(ARGC ERROR!N);else/*opendir,closedirDIR * opendir(const char *name);int closedir(DIR * dir); 关闭指定目录文件,释放相关资源*/if(dir = opendir(argv1) = NULL)printf(Source Folder does not exist.n); /源文件打开出错if(dir = opendir(argv2) = NULL)/时间属性/*utime函数:修改文件的存取和修改时间int utime(const char *filename,const struct utimbuf buf);*/相当于windows中CreateFileD函数功能stat(argv1,&statbuf);/*stat(const char *file_name,struct stat *buf)统计文件名指定的文件属性信息*/mkdir(argv2,statbuf.st_mode); /创建目录/*mkdir(const char * dir_pathname,mode_t mode)rmdir(const char * dir_pathname) 删除*/timeby.actime = statbuf.st_atime; /修改时间属性,存取时间timeby.modtime = statbuf.st_mtime; /修改时间utime(argv2,&timeby);Mycp(argv1,argv2); /开始复制printf(Copy Finished!n);return 0;void Mycp(char *fsource,char *ftarget)char source512;char target512;struct stat statbuf;struct utimbuf timeby;DIR *dir;struct dirent * entry;/*struct direntino_t d_ino; inode索引节点号char d_nameNAME_MAX+1 文件名unsigned char d_type; 文件类型*/strcpy(source,fsource);strcpy(target,ftarget);dir = opendir(source); /打开目录,返回指向DIR结构的指针/refer to P215while(entry = readdir(dir) != NULL) /读目录/*readdirstruct dirent *readdir(DIR *dir)*/if(strcmp(entry-d_name,.) = 0 | strcmp(entry-d_name,.) = 0) /判断目录continue;if(entry-d_type = 4)strcat(source,/);strcat(source,entry-d_name);strcat(target,/);strcat(target,entry-d_name);/相当于windows中CreateFileD函数功能stat(source,&statbuf); /统计文件属性信息mkdir(target,statbuf.st_mode)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 形体房安全管理制度
- 彻底不用气管理制度
- 德力西福利管理制度
- 心里催眠室管理制度
- 快递操作间管理制度
- 急冻库安全管理制度
- 总监办会议管理制度
- 成品罐使用管理制度
- 我校培训费管理制度
- 掘进市场化管理制度
- 2025公基题库(附答案解析)
- 2025年宁夏银川灵武市选聘市属国有企业管理人员招聘笔试冲刺题(带答案解析)
- 三大监测培训试题及答案
- 两办意见宣贯考试题及答案
- 2025年汽车驾照考试科目一考试题库及参考答案
- 跨文化交际知识体系及其前沿动态
- 音响安装施工合同协议
- 日本签证个人信息处理同意书
- 2024年中国工程院战略咨询中心劳动人员招聘真题
- 2025年湖南省长沙市中考一模地理试卷及答案
- 2025-2030中国跨境支付行业市场发展现状及竞争格局与投资前景研究报告
评论
0/150
提交评论