相关疑难解决方法(0)

根据磁盘ID删除文件

如上所述这里,使用SetFileInformationByHandleFILE_DISPOSITION_INFO 允许一个设置文件有打开的句柄在被关闭所有句柄被删除.

不过,我想删除的检索基于其文件索引(磁盘ID)的文件FILE_DISPOSITION_INFO,并 OpenFileById以安全地删除其中的区别仅在情况下的目录文件/目录.这在我的用例中是安全的,因为在NTFS系统上,文件索引在删除之前持久的,否定ReplaceFile当前代码库处理的使用.

但是,在尝试删除句柄时,我收到错误87(ERROR_INVALID_PARAMETER).如果我使用创建的句柄删除CreateFileW,我遇到没有问题.但是,我无法做到这一点,因为Windows无法区分同一案例的两个文件/文件夹,即使NTFS可以.

我也知道打开硬链接文件存在歧义OpenFileById,因为硬链接文件共享相同的磁盘ID.可以认为硬链接文件的问题与此方案无关.我只会按ID删除目录,不能硬链接.

我的OpenFileById通话中是否有参数或设置?不知怎的,在我的SetFileInformationByHandle电话里?

我试过的其他方法:

  • 调用DuplicateHandleOpenFileById处理,提供DELETEdwDesiredAccess和使用.ERROR_INVALID_PARAMETER结果相同.
  • 使用ReOpenFileOpenFileById处理,提供DELETEdwDesiredAccess和使用.ERROR_INVALID_PARAMETER结果相同.
  • 使用ReOpenFileOpenFileById处理,提供DELETEdwDesiredAccess,并提供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)

c winapi ntfs createfile

13
推荐指数
1
解决办法
652
查看次数

用于在C中重命名文件的Win32 API

如果是源目录和目标目录,MoveFile实际上会将源文件的副本复制到目标文件中,这意味着我最终会看到两个文件.

这是重命名的最佳方式吗?

c winapi file-rename

7
推荐指数
3
解决办法
2万
查看次数

标签 统计

c ×2

winapi ×2

createfile ×1

file-rename ×1

ntfs ×1