获取媒体便携式设备的目录更改通知
Obtaining directory change notifications for media portable devices
我们可以使用 FindFirstChangeNotification()
和 FindNextChangeNotification()
函数找到目录中的更改,例如:
FindFirstChangeNotification(
lpDir, // directory to watch
FALSE, // do not watch subtree
FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes
但在 Windows 中没有 Android 手机、相机等媒体便携式设备的实际路径。那么我们如何跟踪变化
(创建、复制、删除、重命名)在这些设备上用 C++ 完成了吗?
这些媒体设备仅存在于 shell 级别,它们不允许直接访问其文件系统(即使可以,也可能是 ext3 或 [=31= 不支持的其他文件系统) ]).不能使用kernel32中的FindFirstChangeNotification
等函数,必须使用shell32中的函数以及支持IShellItem、IShellFolder和PIDLs.
的shlwapi
要创建一个 PIDL,如果您知道路径 (shell:::{something}\{something}
),您可以调用 SHParseDisplayName
或 SHGetDesktopFolder
+ IShellFolder::EnumObjects
来遍历整个 shell命名空间。
有时可以通过在资源管理器 breadcrumb-bar 中右键单击 项 并选择 "Copy address" 来找到 shell: 路径。
当您拥有设备文件夹的绝对 PIDL 时,您可以调用 SHChangeNotifyRegister
。
我们可以使用 FindFirstChangeNotification()
和 FindNextChangeNotification()
函数找到目录中的更改,例如:
FindFirstChangeNotification(
lpDir, // directory to watch
FALSE, // do not watch subtree
FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes
但在 Windows 中没有 Android 手机、相机等媒体便携式设备的实际路径。那么我们如何跟踪变化 (创建、复制、删除、重命名)在这些设备上用 C++ 完成了吗?
这些媒体设备仅存在于 shell 级别,它们不允许直接访问其文件系统(即使可以,也可能是 ext3 或 [=31= 不支持的其他文件系统) ]).不能使用kernel32中的FindFirstChangeNotification
等函数,必须使用shell32中的函数以及支持IShellItem、IShellFolder和PIDLs.
要创建一个 PIDL,如果您知道路径 (shell:::{something}\{something}
),您可以调用 SHParseDisplayName
或 SHGetDesktopFolder
+ IShellFolder::EnumObjects
来遍历整个 shell命名空间。
有时可以通过在资源管理器 breadcrumb-bar 中右键单击 项 并选择 "Copy address" 来找到 shell: 路径。
当您拥有设备文件夹的绝对 PIDL 时,您可以调用 SHChangeNotifyRegister
。