[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 }

 

 

 

posted @ 2014-03-08 18:21  beautifulzzzz  阅读(5643)  评论(0编辑  收藏  举报