1

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

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

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

4

1 回答 1

0

我在 Stack Overflow 上找到这个答案

因为 DocumentsLibrary 是一个虚拟位置,表示不同位置和文件的集合,所以它不会有路径:

库是 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);
}
于 2013-10-23T23:03:10.980 回答