[WinAPI] API 9 [文件的删除、复制和移动功能]

时间:2025-02-11 12:07:02

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参数表示复制文件,之后跟源路径和目的路径。在复制文件过程中,如果文件已经存在,会提醒用户是否覆盖。

 /* ************************************
*《精通Windows API》
* 示例代码
* wr.c
* 4.3.2 创建、打开、读写文件,获取文件大小
**************************************/ /* 头文件 */
#include <windows.h>
#include <stdio.h> /* ************************************
* DWORD ReadFileContent(LPSTR szFilePath)
* 功能 获取文件大小
* 读取文件内容,并以16进制的形式打印出来
* 参数 LPSTR szFilePath
* 文件路径
**************************************/
DWORD ReadFileContent(LPSTR szFilePath)
{
//文件大小
HANDLE hFileRead;
//保存文件大小
LARGE_INTEGER liFileSize;
//成功读取的文件数据大小
DWORD dwReadedSize;
//累加计算已经读取数据的大小
LONGLONG liTotalRead = ;
//文件数据缓存
BYTE lpFileDataBuffer[]; //打开已经存在的文件,读取内容。
hFileRead = CreateFileA(szFilePath,// 要打开的文件名
GENERIC_READ, // 以读方式打开
FILE_SHARE_READ, // 可共享读
NULL, // 默认安全设置
OPEN_EXISTING, // 只打开已经存在的文件
FILE_ATTRIBUTE_NORMAL, // 常规文件属性
NULL); // 无模板 //打开文件是否成功。
if(hFileRead==INVALID_HANDLE_VALUE)
{
printf("打开文件失败:%d",GetLastError());
} if(!GetFileSizeEx(hFileRead,&liFileSize))
{
printf("获取文件大小失败:%d",GetLastError());
}
else
{
printf("文件大小为:%d/n",liFileSize.QuadPart);
} //循环读取并打印文件内容
while(TRUE)
{
DWORD i; if(!ReadFile(hFileRead, //读文件的句柄
lpFileDataBuffer, //存储读取的文件内容
, //读的大小(字节)
&dwReadedSize, //实际读取的大小
NULL)) //不使用Overlapped
{
printf("读文件错误:%d/n",GetLastError());
break;
}
printf("读取了%d字节,文件内容是:",dwReadedSize); for(i=; i<dwReadedSize; i++)
{
printf("0x%x ",lpFileDataBuffer[i]);
}
printf("/n");
liTotalRead += dwReadedSize;
if(liTotalRead == liFileSize.QuadPart)
{
printf("读文件结束/n");
break;
}
}
CloseHandle(hFileRead);
return ;
} /* ************************************
* SaveDataToFile
* 功能 将数据存储到文件末尾
* 参数 LPSTR szFilePath 文件路径
* LPVOID lpData 需存储的数据
* DWORD dwDataSize 数据大小(字节)
**************************************/
DWORD SaveDataToFile(
LPSTR szFilePath,
LPVOID lpData,
DWORD dwDataSize)
{
//文件句柄
HANDLE hFileWrite;
//成功写入的数据大小
DWORD dwWritedDateSize; //打开已经存在的文件,读取内容。
hFileWrite = CreateFileA(szFilePath, // 要打开的文件名
GENERIC_WRITE, // 以写方式打开
, // 可共享读
NULL, // 默认安全设置
OPEN_ALWAYS, // 打开已经存在的文件,没用则创建
FILE_ATTRIBUTE_NORMAL, // 常规文件属性
NULL); // 无模板 //判断是否打开成功
if(hFileWrite==INVALID_HANDLE_VALUE)
{
printf("打开文件失败:%d/n",GetLastError());
} //设置文件指针到文件尾
SetFilePointer(hFileWrite,,,FILE_END); //将数据写入文件
if(!WriteFile(hFileWrite,lpData,dwDataSize,&dwWritedDateSize,NULL))
{
printf("写文件失败:%d/n",GetLastError());
}
else
{
printf("写文件成功,写入%d字节。/n",dwWritedDateSize);
}
CloseHandle(hFileWrite);
return ;
} /* ************************************
* int main(void)
* 功能 演示使用SaveDataToFile和ReadFileContent函数
**************************************/
int main(void)
{
LPSTR szFileData = "这是一个例子";
SaveDataToFile("C://show.txt",szFileData,lstrlenA(szFileData));
ReadFileContent("C://show.txt");
return ;
}