[WinAPI] API 9 [文件的删除、复制和移动功能]
Windows系统为文件的删除、复制、重命名或移动文件提供了相应的API函数。删除文件使用DeleteFile函数;复制文件使用CopyFile函数;重命名文件和移动文件实际是一个操作,使用MoveFile函数。这几个函数的使用都非常简单,下面分别介绍。
(1) DeleteFile。
DeleteFile的功能是删除文件。以文件路径作为输入,指向需要删除的文件。文件路径可以是类似于“c:\files\delete.txt”的绝对路径,也可以是类似于“.\delete.txt”的相对路径,二相对于可执行文件所在的路径。
◇参数
lpFileName:输入参数,所要删除的文件的相对路径或绝对路径。
◇返回值
返回BOOL值,表示文件删除是否成功。
◇使用说明
如果程序返回失败,可以使用GetLastError函数获取错误信息。
(2) CopyFile。
CopyFile的功能是复制文件。通过参数输入复制文件和源路径和目的路径,路径可以是绝对路径也可以是相对路径,还可以通过参数指明如果目的路径已经存在文件,是否覆盖。可以使用CopyFileEx函数进行更为高级的操作,比如在复制进行过程中取消复制等。CopyFileEx可以指定
一个回调函数来处理文件复制中所可能发生的各种情况。
◇参数
lpExistingFileName:输入参数,已经存在的所需复制文件的源路径。
lpNewFileName:输入参数,新文件路径,复制文件的目的路径。
bFailIfExists:输入参数,指明如果在目的路径存在文件时是否覆
将不覆盖已经存在的文件,如果存在,则返回失败。这时使用GetLastError获取错误代码,将返回80(Ox50)。
◇返回值
返回BOOL值,表示文件复制是否成功。
◇使用说明
如果程序返回失败,可以使用GetLastError函数获取错误信息。
(3) MoveFile。
MoveFile的功能是移动、重命名文件和目录。通过参数输入源路径和目的路径,路径可以是绝对路径也可以是相对路径,如果目的路径的文件或目录已经存在,则返回失败。可以使用MoveFileEx函数来指定更多的选项,如果已经存在是否替换等。还可以使用MoveFileWithProgress指定一个回调函数来处理文件移动中所可能发生的各种情况。
◇参数
lpExistingFileName:输入参数,为已经存在的所需移动文件的源路径。
lpNewFileName:输入参数,新文件路径,移动文件的目的路径。
◇返回值
返回BOOL值,表示文件移动是否成功。
◇使用说明
如果程序返回失败,可以使用GetLastError函数获取错误信息。
(4) CopyFileEx、MoveFileEx以及MoveFileWithProgreSS.
这3个API函数功能更丰富,不再做详细介绍.
本实例使用DeleteFile、CopyFile、MoveFile来完成文件的删除、复制和移动功能。编译生成可执行文件,通过参数来指定程序完成的功能。-d参数表示删除文件,后面跟所需删除的文件路径;-m参数表示移动、重命名文件,之后的参数分别是源路径和目的路径;-c参数表示复制文件,之后跟源路径和目的路径。在复制文件过程中,如果文件已经存在,会提醒用户是否覆盖。
1 /* ************************************ 2 *《精通Windows API》 3 * 示例代码 4 * wr.c 5 * 4.3.2 创建、打开、读写文件,获取文件大小 6 **************************************/ 7 8 /* 头文件 */ 9 #include <windows.h> 10 #include <stdio.h> 11 12 /* ************************************ 13 * DWORD ReadFileContent(LPSTR szFilePath) 14 * 功能 获取文件大小 15 * 读取文件内容,并以16进制的形式打印出来 16 * 参数 LPSTR szFilePath 17 * 文件路径 18 **************************************/ 19 DWORD ReadFileContent(LPSTR szFilePath) 20 { 21 //文件大小 22 HANDLE hFileRead; 23 //保存文件大小 24 LARGE_INTEGER liFileSize; 25 //成功读取的文件数据大小 26 DWORD dwReadedSize; 27 //累加计算已经读取数据的大小 28 LONGLONG liTotalRead = 0; 29 //文件数据缓存 30 BYTE lpFileDataBuffer[32]; 31 32 //打开已经存在的文件,读取内容。 33 hFileRead = CreateFileA(szFilePath,// 要打开的文件名 34 GENERIC_READ, // 以读方式打开 35 FILE_SHARE_READ, // 可共享读 36 NULL, // 默认安全设置 37 OPEN_EXISTING, // 只打开已经存在的文件 38 FILE_ATTRIBUTE_NORMAL, // 常规文件属性 39 NULL); // 无模板 40 41 //打开文件是否成功。 42 if(hFileRead==INVALID_HANDLE_VALUE) 43 { 44 printf("打开文件失败:%d",GetLastError()); 45 } 46 47 if(!GetFileSizeEx(hFileRead,&liFileSize)) 48 { 49 printf("获取文件大小失败:%d",GetLastError()); 50 } 51 else 52 { 53 printf("文件大小为:%d/n",liFileSize.QuadPart); 54 } 55 56 //循环读取并打印文件内容 57 while(TRUE) 58 { 59 DWORD i; 60 61 if(!ReadFile(hFileRead, //读文件的句柄 62 lpFileDataBuffer, //存储读取的文件内容 63 32, //读的大小(字节) 64 &dwReadedSize, //实际读取的大小 65 NULL)) //不使用Overlapped 66 { 67 printf("读文件错误:%d/n",GetLastError()); 68 break; 69 } 70 printf("读取了%d字节,文件内容是:",dwReadedSize); 71 72 for(i=0; i<dwReadedSize; i++) 73 { 74 printf("0x%x ",lpFileDataBuffer[i]); 75 } 76 printf("/n"); 77 liTotalRead += dwReadedSize; 78 if(liTotalRead == liFileSize.QuadPart) 79 { 80 printf("读文件结束/n"); 81 break; 82 } 83 } 84 CloseHandle(hFileRead); 85 return 0; 86 } 87 88 /* ************************************ 89 * SaveDataToFile 90 * 功能 将数据存储到文件末尾 91 * 参数 LPSTR szFilePath 文件路径 92 * LPVOID lpData 需存储的数据 93 * DWORD dwDataSize 数据大小(字节) 94 **************************************/ 95 DWORD SaveDataToFile( 96 LPSTR szFilePath, 97 LPVOID lpData, 98 DWORD dwDataSize) 99 { 100 //文件句柄 101 HANDLE hFileWrite; 102 //成功写入的数据大小 103 DWORD dwWritedDateSize; 104 105 //打开已经存在的文件,读取内容。 106 hFileWrite = CreateFileA(szFilePath, // 要打开的文件名 107 GENERIC_WRITE, // 以写方式打开 108 0, // 可共享读 109 NULL, // 默认安全设置 110 OPEN_ALWAYS, // 打开已经存在的文件,没用则创建 111 FILE_ATTRIBUTE_NORMAL, // 常规文件属性 112 NULL); // 无模板 113 114 //判断是否打开成功 115 if(hFileWrite==INVALID_HANDLE_VALUE) 116 { 117 printf("打开文件失败:%d/n",GetLastError()); 118 } 119 120 //设置文件指针到文件尾 121 SetFilePointer(hFileWrite,0,0,FILE_END); 122 123 //将数据写入文件 124 if(!WriteFile(hFileWrite,lpData,dwDataSize,&dwWritedDateSize,NULL)) 125 { 126 printf("写文件失败:%d/n",GetLastError()); 127 } 128 else 129 { 130 printf("写文件成功,写入%d字节。/n",dwWritedDateSize); 131 } 132 CloseHandle(hFileWrite); 133 return 0; 134 } 135 136 /* ************************************ 137 * int main(void) 138 * 功能 演示使用SaveDataToFile和ReadFileContent函数 139 **************************************/ 140 int main(void) 141 { 142 LPSTR szFileData = "这是一个例子"; 143 SaveDataToFile("C://show.txt",szFileData,lstrlenA(szFileData)); 144 ReadFileContent("C://show.txt"); 145 return 0; 146 }