You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SHGetPropertyStoreFromParsingName识别OneDrive/SharePoint目录

稳定识别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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:10:54