Windows 8:如何以编程方式读取用户文档文件夹路径(使用 c)

Windows 8: How to read the user documents folder path programmatically (using c )?

本文关键字:路径 文件夹 用户文档 使用 读取 方式 编程 Windows      更新时间:2023-10-16

要访问应用程序目录中的文件,我使用以下代码行:

std::wstring wpath = Windows::Storage::ApplicationData::Current->LocalFolder->Path->Data();

与上面的代码类似,如何获取文档文件夹路径?请提出一个适用于 Metro 应用程序的解决方案。

我在堆栈溢出上找到了这个答案

因为文档库是一个虚拟位置,表示 收集不同的位置和文件,它将没有路径:

库是 Windows 7 中引入的概念,允许用户查看 来自单个位置的相关用户内容。因为库是一个 虚拟位置,添加到库中或从中删除的文件夹 也继续存在于其原始位置。

此外,StorageFolder.Path 的 MSDN 文档指出:

不要依赖此属性来访问文件夹,因为某些文件夹 可能没有文件系统路径。例如,如果文件夹是一个文件 组,或由 URI 支持,或使用文件选取器选取, 文件夹不保证具有文件系统路径。

但我建议你看看这段代码,搜索(第 796 行):

case Win_Documents:
{
    return GetLibrarySaveToPath(CSIDL_MYDOCUMENTS,
                                FOLDERID_DocumentsLibrary,
                                aFile);
}

您的问题似乎已通过这段代码解决:

/*
 * Check to see if we're on Win7 and up, and if so, returns the default
 * save-to location for the Windows Library passed in through aFolderId.
 * Otherwise falls back on pre-win7 GetWindowsFolder.
 */
static nsresult
GetLibrarySaveToPath(int aFallbackFolderId, REFKNOWNFOLDERID aFolderId,
                     nsIFile** aFile)
{
    // Skip off checking for library support if the os is Vista or lower.
    DWORD dwVersion = GetVersion();
    if ((DWORD)(LOBYTE(LOWORD(dwVersion))) < 6 ||
        ((DWORD)(LOBYTE(LOWORD(dwVersion))) == 6 &&
         (DWORD)(HIBYTE(LOWORD(dwVersion))) == 0))
      return GetWindowsFolder(aFallbackFolderId, aFile);
    nsRefPtr<IShellLibrary> shellLib;
    nsRefPtr<IShellItem> savePath;
    HRESULT hr =
        SHLoadLibraryFromKnownFolder(aFolderId, STGM_READ,
                                     IID_IShellLibrary, getter_AddRefs(shellLib));
    if (shellLib &&
        SUCCEEDED(shellLib->GetDefaultSaveFolder(DSFT_DETECT, IID_IShellItem,
                                                 getter_AddRefs(savePath)))) {
        PRUnichar* str = nullptr;
        if (SUCCEEDED(savePath->GetDisplayName(SIGDN_FILESYSPATH, &str))) {
            nsAutoString path;
            path.Assign(str);
            path.AppendLiteral("\");
            nsresult rv =
                NS_NewLocalFile(path, false, aFile);
            CoTaskMemFree(str);
            return rv;
        }
    }
    return GetWindowsFolder(aFallbackFolderId, aFile);
}