cfapi: Dehydrate Placeholder 似乎被卡住了
cfapi: CfDehydratePlaceholder seems to be stucked
我的目标是,文件可以根据用户请求通过资源管理器的“释放 space”或“始终保留在设备上”上下文菜单条目进行水合或脱水。如果我创建一个从一开始就脱水的新占位符文件,一切正常,我可以通过回调机制对其进行脱水。但是解决方法对我不起作用。在资源管理器中,文件将被标记为 UnPinned,文件将被标记为正在同步,但我的应用程序没有收到来自 CF_CALLBACK_TYPE_NOTIFY_DEHYDRATE
或 CF_CALLBACK_TYPE_NOTIFY_DEHYDRATE_COMPLETION
的任何回调。然后我想用 CfDehydratePlaceholder
手动完成,但行为完全相同。没有任何反应,文件保持同步状态。即使我使用 CfSetInSyncState
将状态设置为 CF_IN_SYNC_STATE_IN_SYNC
它仍然处于同步状态。
现在我想在 Cloud Mirror Example 的帮助下实现一个最小的示例,但我意识到它具有相同的行为。当我尝试再次对文件进行脱水时,那里也会发生完全相同的情况。从我的角度来看,我觉得 cfapi 期望来自云服务的 ack,它永远不会得到。
但在 OneDrive 中,一切都按预期进行。我缺少什么?我必须设置一些特定的设置吗?
我对整个 API 有误解,这是我现在对 API 的理解,以帮助其他正在为此苦苦挣扎的人。
您必须注册您的同步根并将您的应用连接到它。如果连接它,您将收到一个 CF_CONNECTION_KEY
,这是与虚拟文件系统通信所必需的。然后您可以将扩展属性添加到同步根目录中的所有文件。最重要的是您可以自己选择的自定义属性,以便您的应用在需要时识别文件对象,然后是 PinState 和 SyncState。大多数情况下,SyncState 不必由应用程序更改,除了在应用程序处理文件后将其标记为已同步。 (您可以在更新自定义属性时执行此操作)因为如果文件发生更改,SyncState 将自动更改。 PinState 声明文件应具有的最终状态。例如,UNPINNED 意味着文件应该被脱水,而 PINNED 则相反。这并不意味着文件一定已经具有这种状态。我的误解是,我认为如果我取消固定文件,它会自动脱水。或者,如果我固定了一个占位符,我将通过我在问题中提到的回调函数收到一个请求。但这种情况并非如此。您的应用程序需要通过 FileWatcher(我可以推荐我自己创建的 FileWatcher 项目:https://github.com/neXenio/panoptes)找出特定文件的文件属性已更改。然后你的应用程序必须处理每一步。就像已经提到的脱水情况一样,应用程序需要调用 CfDehydratePlaceholder。在水合的情况下,你需要通过 CfGetTransferKey
打开一个传输会话,然后通过方法 CfExecute
水合(将数据发送到空文件),你需要连接密钥和传输密钥。这就是基础。想说的还有很多,不过我想有了这个开头,大家就可以自己琢磨了。
我的目标是,文件可以根据用户请求通过资源管理器的“释放 space”或“始终保留在设备上”上下文菜单条目进行水合或脱水。如果我创建一个从一开始就脱水的新占位符文件,一切正常,我可以通过回调机制对其进行脱水。但是解决方法对我不起作用。在资源管理器中,文件将被标记为 UnPinned,文件将被标记为正在同步,但我的应用程序没有收到来自 CF_CALLBACK_TYPE_NOTIFY_DEHYDRATE
或 CF_CALLBACK_TYPE_NOTIFY_DEHYDRATE_COMPLETION
的任何回调。然后我想用 CfDehydratePlaceholder
手动完成,但行为完全相同。没有任何反应,文件保持同步状态。即使我使用 CfSetInSyncState
将状态设置为 CF_IN_SYNC_STATE_IN_SYNC
它仍然处于同步状态。
现在我想在 Cloud Mirror Example 的帮助下实现一个最小的示例,但我意识到它具有相同的行为。当我尝试再次对文件进行脱水时,那里也会发生完全相同的情况。从我的角度来看,我觉得 cfapi 期望来自云服务的 ack,它永远不会得到。
但在 OneDrive 中,一切都按预期进行。我缺少什么?我必须设置一些特定的设置吗?
我对整个 API 有误解,这是我现在对 API 的理解,以帮助其他正在为此苦苦挣扎的人。
您必须注册您的同步根并将您的应用连接到它。如果连接它,您将收到一个 CF_CONNECTION_KEY
,这是与虚拟文件系统通信所必需的。然后您可以将扩展属性添加到同步根目录中的所有文件。最重要的是您可以自己选择的自定义属性,以便您的应用在需要时识别文件对象,然后是 PinState 和 SyncState。大多数情况下,SyncState 不必由应用程序更改,除了在应用程序处理文件后将其标记为已同步。 (您可以在更新自定义属性时执行此操作)因为如果文件发生更改,SyncState 将自动更改。 PinState 声明文件应具有的最终状态。例如,UNPINNED 意味着文件应该被脱水,而 PINNED 则相反。这并不意味着文件一定已经具有这种状态。我的误解是,我认为如果我取消固定文件,它会自动脱水。或者,如果我固定了一个占位符,我将通过我在问题中提到的回调函数收到一个请求。但这种情况并非如此。您的应用程序需要通过 FileWatcher(我可以推荐我自己创建的 FileWatcher 项目:https://github.com/neXenio/panoptes)找出特定文件的文件属性已更改。然后你的应用程序必须处理每一步。就像已经提到的脱水情况一样,应用程序需要调用 CfDehydratePlaceholder。在水合的情况下,你需要通过 CfGetTransferKey
打开一个传输会话,然后通过方法 CfExecute
水合(将数据发送到空文件),你需要连接密钥和传输密钥。这就是基础。想说的还有很多,不过我想有了这个开头,大家就可以自己琢磨了。