1

アプリ ディレクトリ内のファイルにアクセスするために、次のコード行を使用しています。

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

上記のコードと同様に、ドキュメント フォルダーのパスを取得するにはどうすればよいですか? Metro アプリで動作するソリューションを提案してください。

4

1 に答える 1

0

私はスタックオーバーフローでこの答えを見つけまし

DocumentsLibrary は、さまざまな場所とファイルのコレクションを表す仮想の場所であるため、パスはありません。

Windows 7 で導入された概念であるライブラリを使用すると、ユーザーは関連するユーザー コンテンツを 1 つの場所から表示できます。ライブラリは仮想的な場所であるため、ライブラリに追加またはライブラリから削除されたフォルダーは、元の場所にも引き続き存在します。

さらに、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 に答える