原文链接 -> 传送门
函数功能:
DeleteFile 函数用于删除一个已存在的文件。
若想将此操作实现为事务型操作,使用 DeleteFileTransacted 函数。
API 函数原型:
注释:_In_ 说明该参数是输入的,_opt_ 说明该参数是可选的
BOOL WINAPI DeleteFile( _In_ LPCTSTR lpFileName );
参数解析:
|
参数 |
含义 |
|
lpFileName |
1. 指向将执行删除操作的文件的文件名 |
返回值:
1. 如果函数调用成功,返回值是非 0;
2. 如果函数调用失败,返回值是 0。
想获取具体错误信息,调用 GetLastError 函数。
备注:
1. 如果一个程序试图删除一个不存在的文件,则 DeleteFile 函数执行失败,返回错误信息 ERROR_FILE_NOT_FOUND 。如果文件是只读文件,则函数执行失败,返回错误信息 ERROR_ACCESS_DENIED 。
以下是关于文件删除、文件移动、文件关闭的一些技巧:
- 若想删除一个只读文件,你必须先移除其只读属性
- 若想删除或重命名文件,你必须要么拥有文件的删除权限,要么在其父目录上,拥有删除子文件的权限
- 若想在一个文件夹中,递归地删除文件,调用 SHFileOperation 函数
- 若想移除一个空目录,调用 RemoveDirectory 函数
- 若想关闭一个打开的文件,调用 CloseHandle 函数
2. 当你创建一个目录时,如果你拥有此目录除了删除权限、删除子文件权限之外的所有权限,且新创建文件的访问控制列表(Access Control lists)继承自此目录,则此时你创建一个文件却没有权限删除它。另一方面,当你在创建一个文件时,对于所返回的文件句柄,你可以获取所有所需要的权限。
如果你在创建文件时,请求删除权限,你可以通过返回的文件句柄实现此文件的删除或者重命名,但却无法通过其他句柄实现此功能。更多信息,参见 File Security and Access Rights。
3. 当程序试图删除一个文件时,如果此文件已经被打开用于普通的 I/O 操作或者作为内存映射文件被使用,则 DeleteFile 函数调用失败(当有其他指向此文件的句柄被打开时,必须指定 FILE_SHARE_DELETE 标记位才能执行删除操作)。
4. DeleteFile 函数标记文件,使之在关闭时被删除。因此,在指向此文件的所有句柄都被关闭之前,文件删除操作不会发生。但是文件被标记之后,对此文件执行 CreateFile 函数将会失败,错误代码为 ERROR_ACCESS_DENIED。
5. 符号连接相关:
如果文件路径指向一个符号链接,则符号链接会被删除,而符号链接指向的文件则不会被删除。如果要删除符号链接指向的文件,你必须调用 CreateFile 函数且指定 FILE_FLAG_DELETE_ON_CLOSE 标记位。
6. 在 Windows 8 和 Windows Server 2012 中,此函数为以下技术所支持:
|
技术 |
是否支持 |
|
Server Message Block (SMB) 3.0 protocol |
是 |
|
SMB 3.0 Transparent Failover (TFO) |
是 |
|
SMB 3.0 with Scale-out File Shares (SO) |
是 |
|
Cluster Shared Volume File System (CsvFS) |
是 |
|
Resilient File System (ReFS) |
是 |
需求:
|
Minimum supported client |
Windows XP [仅桌面应用程序] |
|
Minimum supported server |
Windows 2003 服务器版 [仅桌面应用程序] |
|
Header |
FileAPI.h (包含于 Windows.h) |
|
Library |
Kernel32.lib |
|
DLL |
Kernel32.dll |
|
Unicode and ANSI names |
DeleteFileW (Unicode) 和 DeleteFileA (ANSI) |




