FSCTL_DELETE_USN_JOURNAL IOCTL (winioctl.h)
删除卷上的更新序列号(USN)更改日志,或等待更改日志删除通知。
C++ |
---|
BOOL WINAPI DeviceIoControl( (HANDLE) hDevice, // handle to volume FSCTL_DELETE_USN_JOURNAL, // dwIoControlCode(LPVOID) lpInBuffer, // input buffer (DWORD) nInBufferSize, // size of input buffer NULL, // lpOutBuffer0, // nOutBufferSize(LPDWORD) lpBytesReturned, // number of bytes returned (LPOVERLAPPED) lpOverlapped ); // OVERLAPPED structure |
言论
有关此操作中重叠 I/O 的影响,请参阅 DeviceIoControl 主题的“备注”部分。
可以使用 FSCTL_DELETE_USN_JOURNAL 删除更改日记。 除非在 DeleteFlagsDELETE_USN_JOURNAL_DATA成员中设置 USN_DELETE_FLAG_NOTIFY 标志,否则 NTFS 文件系统将启动删除操作并立即返回到调用进程。
如果同时设置了 USN_DELETE_FLAG_NOTIFY 和 USN_DELETE_FLAG_DELETE 标志,则调用 FSCTL_DELETE_USN_JOURNAL 将开始删除过程。 然后,调用会阻止调用线程并等待删除(在同步或非重叠调用上),或使用 I/O 完成端口或其他机制设置事件通知,并返回(在异步或重叠调用中)。
还可以使用 FSCTL_DELETE_USN_JOURNAL 来接收更改日记删除已完成的通知,只需设置 USN_DELETE_FLAG_NOTIFY。 如果这样做,则 FSCTL_DELETE_USN_JOURNAL 操作在返回之前等待删除完成(在同步或非重叠调用上),或者通过使用 I/O 完成端口或其他机制(在异步或重叠调用上)设置事件通知。
应用程序接收通知的删除可能由当前进程或其他一些进程启动。 例如,当应用程序启动时,它可以使用 FSCTL_DELETE_USN_JOURNAL 来确定某个其他进程启动的删除是否正在进行,如果是,则退出。
完全删除更改日志需要扫描更改日志所在的卷,这可能需要很长时间才能在包含多个文件的卷上。 即使在系统重启后,该操作也会继续完成。 尝试在删除过程中创建、修改、删除或查询更改日志失败,并返回错误代码 ERROR_JOURNAL_DELETE_IN_PROGRESS。
FSCTL_DELETE_USN_JOURNAL 操作具有显著的性能成本,因此应谨慎使用。 当当前 USN 值接近可能的最大 USN 值时,管理员应删除日记。
有关详细信息,请参阅 创建、修改和删除更改日记。
若要检索卷的句柄,请调用 CreateFile,lpFileName 参数设置为以下格式的字符串:
\\.\X:
在前面的字符串中,X 是标识卷所在的驱动器的字母。 卷必须是 NTFS。
在 Windows 8 和 Windows Server 2012 中,以下技术支持此代码。
科技 | 支持 |
---|---|
服务器消息块 (SMB) 3.0 协议 | 不 |
SMB 3.0 透明故障转移 (TFO) | 不 |
具有横向扩展文件共享的 SMB 3.0 (SO) | 不 |
群集共享卷文件系统 (CsvFS) | 是的 |
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows XP [仅限桌面应用] |
支持的最低服务器 | Windows Server 2003 [仅限桌面应用] |
标头 | winioctl.h (包括 Windows.h) |