如何通过SHGetPropertyStoreFromParsingName识别OneDrive/SharePoint目录
此前我通过PowerShell调用Shell32.dll的GetDetailsOf函数,利用索引303获取OneDrive或SharePoint目录中文件的可用状态。但升级至Windows 24H2后,该状态对应的索引变为304,原索引303不再可靠。由于未来Windows更新可能再次改变属性索引,我需要更稳定的方法来判断目录是否属于OneDrive/SharePoint。
我尝试使用MFC/C++的SHGetPropertyStoreFromParsingName接口,发现OneDrive/SharePoint目录的PKEY_FilePlaceholderStatus属性返回值为14,本地目录返回6。但未找到官方文档确认该行为的稳定性,现提出以下问题:
- 是否有官方文档证实
PKEY_FilePlaceholderStatus的返回值规则? - 该方法是否能在未来Windows更新中保持一致?
- 有没有不依赖PowerShell易变属性索引的替代识别方法?
附相关代码
PowerShell代码
$folderPath = 'D:\aaa\test\OneDrive\TEST_FILES' $fileName = 'test.txt' $shell = New-Object -ComObject Shell.Application $folder = $shell.Namespace($folderPath) if ($folder -eq $null) { Write-Output "Folder not found: $folderPath" exit } $item = $folder.ParseName($fileName) if ($item -eq $null) { Write-Output "File not found: $folderPath\$fileName" exit } for ($i = 0; $i -lt 400; $i++) { $name = $folder.GetDetailsOf($null, $i) $value = $folder.GetDetailsOf($item, $i) Write-Output "$i : $name → $value" }
MFC/C++代码
CString filePath; m_edit.GetWindowText(filePath); HRESULT hr = CoInitialize(nullptr); if (FAILED(hr)) { std::wcerr << L"CoInitialize failed: " << std::hex << hr << std::endl; return; } IPropertyStore* pPropertyStore = nullptr; hr = SHGetPropertyStoreFromParsingName(filePath, nullptr, GPS_DEFAULT, IID_PPV_ARGS(&pPropertyStore)); if (SUCCEEDED(hr)) { PROPVARIANT propvar; PropVariantInit(&propvar); hr = pPropertyStore->GetValue(PKEY_FileOfflineAvailabilityStatus, &propvar); if (SUCCEEDED(hr) && propvar.vt == VT_UI4) { CString str; str.Format(L"OfflineAvailabilityStatus: %d", propvar.uintVal); AfxMessageBox(str); } else { std::wcerr << L"Failed to retrieve PKEY_FileOfflineAvailabilityStatus." << std::endl; } PropVariantClear(&propvar); hr = pPropertyStore->GetValue(PKEY_FilePlaceholderStatus, &propvar); if (SUCCEEDED(hr) && propvar.vt == VT_UI4) { CString str; str.Format(L"FilePlaceholderStatus: %d", propvar.uintVal); AfxMessageBox(str); } else { std::wcerr << L"Failed to retrieve PKEY_FilePlaceholderStatus." << std::endl; } PropVariantClear(&propvar); pPropertyStore->Release(); } else { std::wcerr << L"SHGetPropertyStoreFromParsingName failed: " << std::hex << hr << std::endl; } CoUninitialize();
内容的提问来源于stack exchange,提问作者Woo-Hyun Song
相关产品推荐
相关产品推荐

