- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 ReadDirectoryChangesW 监视文件夹会导致其父级被锁定且无法删除。
这里有一篇关于这个的帖子:
FindFirstChangeNotification locks parent folder
但其中提到的唯一解决方案是我们应该始终在顶层倾听。
有没有人找到比在顶层观看更好的方法来做到这一点?
有时,这可以一直到观看驱动器,并且不会在机器上花费很多处理时间。
谢谢!
最佳答案
文件夹只有在它为空的情况下才能被删除,否则我们会得到错误 STATUS_DIRECTORY_NOT_EMPTY
- 表明试图删除的目录不为空。
从另一方面来说 - 如果您有文件的打开句柄 - 在您不关闭它句柄之前无法删除它(这里的某些更改从 win10 rs1 开始)
因此,如果您使用 ReadDirectoryChangesW
监视某个子文件夹,您已经打开了它的句柄,并且父文件夹不能(在 WIN10_RS1 之前)被删除,直到您不关闭它处理。
一般过程看起来像 - 当有人尝试删除文件夹时 - 它必须枚举其中的所有文件(子文件夹)并首先删除它。当删除操作应用于调用了 ReadDirectoryChangesW
的文件夹时 - io 请求将以状态 STATUS_DELETE_PENDING
完成 - 已请求文件的非关闭操作具有删除挂起的对象。(它转换为 win32 错误代码 ERROR_ACCESS_DENIED
- 访问被拒绝。)。当您从 ReadDirectoryChangesW
收到此错误时,您必须关闭此调用中使用的目录句柄。然后是 raise - 谁是第一个 - 你关闭目录句柄或另一个代码尝试删除父文件夹......
从 win10 rs1 开始可能会删除父级,即使有人通过调用 NtSetInformationFile
持有它的子文件(文件夹)的打开句柄|与 FileDispositionInformationEx
或 SetFileInformationByHandle
与 FileDispositionInfoEx
.
新标志 FILE_DISPOSITION_POSIX_SEMANTICS
的神奇之处(指定系统应执行 POSIX 风格的删除)
Normally a file marked for deletion is not actually deleted until all open handles for the file have been closed and the link count for the file is zero. When marking a file for deletion using
FILE_DISPOSITION_POSIX_SEMANTICS
, the link gets removed from the visible namespace as soon as the POSIX delete handle has been closed, but the file’s data streams remain accessible by other existing handles until the last handle has been closed.
所以当我们使用这个时 - 文件本身当然不会被删除,直到 ReadDirectoryChangesW
的调用者不关闭自身句柄,但文件将从父文件夹中删除。结果父文件夹可能变空,之后我们可以删除它。
注意 DeleteFileW
和 RemoveDirectoryW
在这里不起作用,因为它们使用了旧的信息类 FileDispositionInformation与 FILE_DISPOSITION_INFORMATION
ULONG DeletePosix(PCWSTR lpFileName)
{
HANDLE hFile = CreateFileW(lpFileName, DELETE, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OPEN_REPARSE_POINT, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
return GetLastError();
}
static FILE_DISPOSITION_INFO_EX fdi = { FILE_DISPOSITION_DELETE| FILE_DISPOSITION_POSIX_SEMANTICS };
ULONG dwError = SetFileInformationByHandle(hFile, FileDispositionInfoEx, &fdi, sizeof(fdi))
? NOERROR : GetLastError();
// win10 rs1: file removed from parent folder here
CloseHandle(hFile);
return dwError;
}
当然 child 必须在其他调用中用 FILE_SHARE_DELETE
打开,否则我们以后根本无法用 DELETE
访问打开它
关于c++ - 如何删除 ReadDirectoryChangesW 监视的子项的父项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51902554/
我正在尝试将 margin-left:20px 分配给表单内的所有 div,其类包含编辑,具有以下内容: form.edit > div { margin-left:20px; } 我的想法
我有这个 xpath: .//*[@id='some_id']/td//div 现在我想选择特定类型的 div 的任何子项,例如每个子项是标签或跨度。像这样的东西 .//*[@id='some_id'
我有一个包含包含用户信息的键列表的键,现在当我的表单加载时,我想将这些键作为数组获取。我该怎么做?我找到了获取计数的方法,但仍然不知道如何获取这些 key 。 最佳答案 您可以使用 Microsoft
关闭。这个问题需要更多 focused 。它目前不接受答案。 想要改进这个问题?更新问题,使其只关注 editing this post 的一个问题。 关闭 6 年前。 Improve this q
我正在通过一些在线教程来学习 AEM。根据教程,创建组件时,需要在 Allowed Parents 或 Allowed Children 中输入一些值。但是,我在窗口中看不到这样的选项。当我尝试创建组
我需要将 MDI 子窗体的创建集中到 Delphi (VCL) 中的一个独特过程中。这个想法是每次创建 MDI 子窗体时执行一些操作,无论其类型如何,即将其标题名称添加到列表中以访问该 MDI 子窗体
我试图在 TreeView 中获取所选节点的所有子节点,但遇到了一些问题。 以这个 TreeView 为例: 我想将所有子节点变为黄色突出显示的“文件夹”节点,这将是旁边有一条蓝线的子节点。 这是我尝
我在最小化我所有的 MDIChildren 时遇到了麻烦,遇到了 MDIChild to minimize not activated properly 我最小化所有 child 的代码是: proc
我使用下面的代码通过单击系统关闭按钮来关闭 MDI 子窗体,它工作正常: procedure Tfrm_main.FormClose(Sender: TObject; var Action: TC
仅当我指定对象的完整路径时,我才能通过指定特定子键来查找 Firebase 对象。这是为什么? 这有效 ref.child(`users/${user.uid}/watchlist/${key}`)
每当我单击工具栏菜单时,它每次都会显示新表单。我想阻止它一次又一次地显示相同的表单。在给出的代码中,form2 一次又一次地显示。我想停止它,以便它显示一次。 喜欢: private void new
我想知道是否有一种方法可以通过遍历父节点的 vector 来获取子节点中的数据。我有一个我计划经常更改的 XML 文件,因此我想避免对属性名称进行硬编码。因此,我想在我的子节点中提取数据而不使用 pt
假设我有以下 YAML 文件: - key1: value # and so on... key99: value key100: subkey1: value # an
我不是代码天才,而是行动脚本爱好者。 你能帮我吗? 我有一个函数,根据选择的对象,该函数将事件监听器调用已经在舞台上的一组“子项目”(我想在单击时重新使用具有更改参数的子项目,而不是创建多个实例和代码
我需要一些帮助来查询分层数据。这是一个简单的表,其中 parent_id 引用 id 并且对于根条目可能为 null。 create table edition ( id
我尝试获得一个简单的 GEF 编辑器。我有一个 GraphicalEditorWithPalette 来创建我的示例模型。我有一个覆盖 createFigure 和 getModelChildren
我正在尝试搜索其中包含子项(文本区域)的表格单元格。我努力了td.children.value,td.childNodes.value,td.firstChild.value,td.lastChild
我有一个 mdi 父 form 并且我在运行时通过以下代码将我的其他 form 作为 mdi 子窗体打开: private void MenuItem_Click(object sender, Eve
我在 Activity 中加载了一个 GridView,其中存在 fragment 。 GridView 本身并不位于 Fragment 中。我通过 BaseAdapter 创建了一个客户适配器,一切
我在导航 Controller 中有两个 child (根 child 和第二个 child )。我通常先去找根 child ,然后再去找第二个 child 。这允许我使用导航 Controller
我是一名优秀的程序员,十分优秀!