要访问 app 目录中的文件,我使用以下代码行:
std::wstring wpath = Windows::Storage::ApplicationData::Current->LocalFolder->Path->Data();
与上面的代码类似,如何获取文档文件夹路径?请提出一个适用于 Metro 应用程序的解决方案。
我在 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);
}