Windows API函数CreateFile函数允许您特定所需的访问权限.读,写和删除有三个选项.如果从CreateFile获取请求删除访问的句柄,那么如何使用返回的句柄删除文件?DeleteFile函数采用文件名,而不是句柄.
大图:从我的应用程序保存文件时,我首先写出一个临时文件,然后删除"真实"文件并将临时文件重命名为真实姓名.我已经开始看到搜索索引器或反病毒/间谍软件打开文件进行读取但不允许删除的问题.这会导致我的保存在移动文件时失败.我已经更改了我的开放代码以请求删除访问权限,以确保我可以在保存时删除该文件.
这一切都运行正常,但我还有一个差距,第三方应用程序可以抓取我的文件.由于我对临时文件和真实文件都有一个打开句柄,我一直在寻找一种使用这些句柄执行删除和重命名功能的方法.我能找到的唯一选择是关闭句柄,然后调用DeleteFile和MoveFile函数.实际上我目前正在使用ReplaceFile API函数来执行这些步骤,但它也传入了文件名,除非我先关闭我的句柄,否则它将无法工作.
我仍然需要支持XP,无法开始使用新的事务文件功能.有没有办法保持文件锁定,仍然删除/重命名?
我正在尝试使用移动文件SetFileInformationByHandle
.Niall Douglas在他的CppCon2015谈话"赛车文件系统"中提出了这种技术,作为原子地移动/重命名文件的一种方式.但是,我很难提供正确的论据; 它总是失败并GetLastError
返回ERROR_INVALID_PARAMETER
.
我使用Unicode字符集通过以下设置尝试了这个:
但行为是一样的.我确保可以访问测试文件夹和测试文件.
#include <sdkddkver.h>
#include <windows.h>
#include <cstring>
#include <iostream>
#include <memory>
int main()
{
auto const& filepath = L"C:\\remove_tests\\file.txt";
auto const& destpath = L"C:\\remove_tests\\other.txt";
// unclear if that's the "root directory"
auto const& rootdir = L"C:\\remove_tests";
// handles will be leaked but that should be irrelevant here
auto const f_handle = CreateFile(filepath,
GENERIC_READ | GENERIC_WRITE | DELETE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if …
Run Code Online (Sandbox Code Playgroud)