如上所述这里,使用SetFileInformationByHandle
与FILE_DISPOSITION_INFO
允许一个设置文件有打开的句柄在被关闭所有句柄被删除.
不过,我想删除的检索基于其文件索引(磁盘ID)的文件FILE_DISPOSITION_INFO
,并
OpenFileById
以安全地删除其中的区别仅在情况下的目录文件/目录.这在我的用例中是安全的,因为在NTFS系统上,文件索引在删除之前是持久的,否定ReplaceFile
当前代码库处理的使用.
但是,在尝试删除句柄时,我收到错误87(ERROR_INVALID_PARAMETER
).如果我使用创建的句柄删除CreateFileW
,我遇到没有问题.但是,我无法做到这一点,因为Windows无法区分同一案例的两个文件/文件夹,即使NTFS可以.
我也知道打开硬链接文件存在歧义OpenFileById
,因为硬链接文件共享相同的磁盘ID.可以认为硬链接文件的问题与此方案无关.我只会按ID删除目录,不能硬链接.
我的OpenFileById
通话中是否有参数或设置?不知怎的,在我的SetFileInformationByHandle
电话里?
我试过的其他方法:
DuplicateHandle
与OpenFileById
处理,提供DELETE
了dwDesiredAccess
和使用.ERROR_INVALID_PARAMETER
结果相同.ReOpenFile
与OpenFileById
处理,提供DELETE
了dwDesiredAccess
和使用.ERROR_INVALID_PARAMETER
结果相同.ReOpenFile
与OpenFileById
处理,提供DELETE
了dwDesiredAccess
,并提供FILE_FLAG_DELETE_ON_CLOSE
标志.没有给出错误,但在关闭所有句柄后文件仍然存在.这是一个简单但完整的示例,它可以重现问题:
#include <stdio.h>
#include <sys/stat.h>
#include <Windows.h>
DWORD getFileID(LPCWSTR path, LARGE_INTEGER *id)
{
HANDLE h …
Run Code Online (Sandbox Code Playgroud) 考虑一个元组列表:
[(14,1), (10,5), (8,7), (1,14)]
我需要消除(1,14)
& 之一(14,1)
。所以预期的结果应该是[(14,1),(10,5),(8,7)]
或[(10,5),(8,7),(1,14)]
注意:顺序无关紧要。
我知道set()
可以用来消除完全重复。组合也不会有太大帮助,因为所有这些加起来都是相同的总数。