【问题标题】:Local file storage during development of a Windows Store App开发 Windows 应用商店应用期间的本地文件存储
【发布时间】:2018-03-23 02:47:25
【问题描述】:

所以我开始使用 Windows 商店应用程序。这也是我第一次使用 Visual Studio。 Windows 8.1 也是如此:P

我正试图弄清楚在这个项目的开发阶段本地文件存储是如何工作的。我了解 appdata 目录和应用程序安装目录在应用程序发布并安装在客户端 PC 上后如何与应用程序交互的概念。 This SO answer很好地概述了它应该如何工作。但是,我不知道在开发过程中,如果未安装应用程序并且在任何 appdata 目录中都没有专用文件夹,我应该如何使用这些概念。

非常感谢任何帮助!

【问题讨论】:

    标签: visual-studio-2013 windows-store-apps


    【解决方案1】:

    文件在哪里?

    正如@Chuck Walbourn 提到的,您的应用程序应该创建任何初始版本的AppData 文件和子目录(如果它们不存在)。

    通常位于C:\Users\UserName\AppData\local\packages\EncryptedNameLinkedToYourApplication

    为确保它确实位于那里,请将此行添加到您的代码中并确保您的应用程序执行它:

    Dim folder = ApplicationData.Current.LocalFolder
    

    使用调试

    然后您可以执行断点(单击新添加的代码行左侧的灰色边距)。

    触发断点后,将鼠标悬停在folder 上,将出现一个弹出窗口。在该弹出窗口中,您可以访问 path 属性,该属性将为您提供计算机上本地文件的完整路径。

    你就知道前面提到的“EncryptedNameLinkedToYourApplication”是什么

    懒得使用断点?

    然后,在您的应用程序中,添加 1 个button 和 1 个textbox。单击按钮,然后您要添加此代码:

    Dim folder = ApplicationData.Current.LocalFolder
    TextBoxTest.Text = folder.Path
    

    您的文本框现在填充了本地文件的路径,包括加密的应用程序名称

    【讨论】:

    • 永远不要对路径进行硬编码。始终在运行时从系统获取当前的 appdata 路径,并在它们丢失时重建任何需要的目录/文件——可能来自已安装包中的只读“启动”副本。
    • 他需要知道应用程序是否有 appdata 文件(即使未安装),并提供了找到它们的解决方案。不是使用它们的解决方案。因此,路径的使用与此答案无关。
    【解决方案2】:

    正如其他人所指出的,该应用程序将安装在本地,并且该应用程序的数据将在开发期间驻留在某个常见的位置,例如 C:\Users\YourUserName\AppData\local\packages。检查Package.appxmanifest 文件的Packaging 选项卡以确定Package 系列名称,它可能会很神秘。 packages文件夹中会有对应的文件夹。

    不过,还有一件事。从 .appx 文件安装的应用(例如,通过应用商店或旁加载到设备上)与调试时 Visual Studio 将为您执行的安装类型之间存在差异。后者是所谓的“未打包安装”,属于您的应用程序包的应用程序文件的布局将略有不同,具有不同的含义。最重要的是,您将能够修改应用程序包中文件的内容,如果从 .appx 安装同一应用程序,这将失败。此外,如果计算机上存在未打包的安装,您将无法安装应用程序的打包版本。 (当然,AppData 文件夹中的文件在这两种情况下的行为方式都相同。)

    【讨论】:

    • 这里还有一个细微差别:在 Windows 应用商店应用程序中,没有更改“当前工作目录”的概念。所有相对路径都相对于已安装的打包目录,如实际应用程序中所指出的只读。借助适用于 Windows 10 的通用 Windows 应用程序,更改 CWD 的概念又回来了,因为事实证明,这对于大量使用 CWD 的许多旧代码库来说太具有挑战性了。始终使用绝对路径更安全,但对于许多代码库来说太痛苦了。请注意,对于 UWA/UWP,文件系统的实际权限限制没有改变。
    【解决方案3】:

    当您构建和调试 Windows 应用商店应用时,Visual Studio 的部署会安装应用并运行它,就像它是通过应用商店部署或旁加载一样。

    与用户帐户控制器一样,您的应用程序应创建任何初始版本的 AppData 文件和所需的子目录(如果它们不存在)。

    File access and permissions (Windows Runtime apps)

    编辑:对于 Windows 应用商店应用,您可以从 Windows::Storage::ApplicationDataCurrent->LocalFolderCurrent->RoamingFolderCurrent->TemporaryFolder 属性中获取可以使用的目录的路径。

    对于 Windows 桌面应用程序,您使用了 Windows 2000/XP SHGetFolderPath Win32 API 或 Windows Vista 时代 IKnownFolder COM API(具有更易于使用的包装器 SHGetKnownFolderPath)。 Dual-use Coding Techniques for Games 帖子展示了编写这两个版本的一些示例。

    #include <wrl\client.h>
    
    using Microsoft::WRL::ComPtr;
    
    void GetApplicationDataDirectory(wchar_t* dir, size_t maxsize)
    {
        if (!maxsize) return;
        *dir = 0;
    #if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
        // You can use the Win32 SHGetKnownFolderPath as well which is just
        // a wrapper that does the same thing.
    
        // On Windows XP, you use the older SHGetFolderPath function with
        // different constants that have the same meaning.
    
        ComPtr<IKnownFolderManager> mgr;
        HRESULT hr = CoCreateInstance(CLSID_KnownFolderManager,
            nullptr, CLSCTX_INPROC_SERVER, IID_IKnownFolderManager, (LPVOID*) &mgr);
        if (SUCCEEDED(hr))
        {
            ComPtr<IKnownFolder> folder;
            hr = mgr->GetFolder(FOLDERID_LocalAppData, &folder);
            if (SUCCEEDED(hr))
            {
                LPWSTR szPath = 0;
                hr = folder->GetPath(0, &szPath);
                if (SUCCEEDED(hr))
                {
                    // A big different with Windows desktop apps is here.
                    // With Windows Store apps, your appdata directory is 
                    // isolated per-user and per-app. In Windows desktop,
                    // it is only isolated per-user so you have to create
                    // your own unique subdir and other Windows desktop apps
                    // can mess with your data
                    wcscpy_s(dir, maxsize, szPath);
                    wcscat_s(dir, maxsize, L”\\MyUniqueApplicationName”);
                    CreateDirectory(dir, nullptr);
                    CoTaskMemFree(szPath);
                }
            }
        }
    #else // Windows Store WinRT app
        auto folder = Windows::Storage::ApplicationData::Current
            ->LocalFolder;
        wcscpy_s(dir, maxsize, folder->Path->Data());
    #endif
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      相关资源
      最近更新 更多