【问题标题】:Writing to appdata folder - permission issue?写入 appdata 文件夹 - 权限问题?
【发布时间】:2011-12-14 11:29:24
【问题描述】:

我已经对类似问题的一些答案进行了侦察,但他们并没有真正帮助我。

我有一个应用程序,其中嵌入了一些资源。启动时,应用程序会检查资源是否存在于 appdata 文件夹中,如果不存在,则在加载模板文件之前将嵌入资源中的模板文件复制到 appdata 文件夹,然后将 appdata 文件夹中的资源用作工作副本。

我有一个帮助类,其中包括返回 appdata 和资源子文件夹,如下所示:

class Folders
{
    static public String GetUserFolder()
    {
        return Application.LocalUserAppDataPath;
    }

    static public String GetResourcesFolder()
    {
        // If the resources folder does not exist then create it
        String userFolder = GetUserFolder();
        String resourcesFolder = userFolder + "\\Resources";

        if (!Directory.Exists(resourcesFolder))
        {
            Directory.CreateDirectory(resourcesFolder);
        }
        return resourcesFolder;
    }

    ...

所以我的代码调用 GetResourcesFolder 方法,该方法返回路径(如果需要,在进程中创建文件夹)检查文件是否存在,以及它是否不尝试使用以下方式写入文件:

        String filename = Helpers.IO.Folders.GetResourcesFolder() + "\\data.dat";
        FileStream outFile = System.IO.File.OpenWrite(filename);

所以我已经设置好了场景,这段代码可以在我在开发办公室的所有机器上运行。然而,一些场外同事抱怨它在他们的机器上“崩溃”——在每种情况下都是 XP 机器——但除此之外,从他们那里返回的有用信息并不多——正努力从他们那里获得更多信息。我办公室里有 XP 机器,它可以正常工作。

在挖掘出一些不久前“存档”的非常旧的开发机器之后,我设法在两台 xp (sp2) 机器上也发生了崩溃。在这两种情况下,崩溃似乎都与写入权限有关,并且使用“运行方式...”运行应用程序已解决问题并正确执行。但是,一旦应用程序不再崩溃,应用程序成功运行,即使我从 appdata 文件夹中删除它创建的文件/文件夹,即使我不提升权限,它仍然会在后续执行中成功创建。

我遇到的问题是,我现在无法在任何可用的开发机器上重复崩溃,而且我不知道如何将机器恢复到我可以恢复的状态。

任何人都对可能导致问题的原因有任何想法,或者我如何能够将机器恢复到“原始”状态以能够重复崩溃并帮助我追踪它。

【问题讨论】:

  • 我注意到有时如果我将 exe 复制到有问题的机器上的不同位置然后运行它,我现在可以重复问题(问题是未经处理的 SecurityException),但是如果我从 Visual Studio 中运行调试代码,则不会出现问题 - Visual Studio 是否以提升的权限运行代码?
  • 我可以推荐使用Path.Combine(GetUserFolder(), "Resources");

标签: c# .net file permissions


【解决方案1】:

一种做法是创建一个 XP 虚拟机。您可以在安装之前保存机器的状态以进行测试。安装后只需恢复到以前的状态以再次测试。有一些供应商提供免费的虚拟机:

http://www.microsoft.com/windows/virtual-pc/

https://www.virtualbox.org/

作为相关问题本身,我不知道比在虚拟机上安装 VS 进行测试更好的方法。

【讨论】:

  • 好主意,我的 Mac 上运行着虚拟盒子,我会试试看能否让它重复问题。
  • 关于VM上的调试/测试,你应该使用Remote Debugger。如果 VM 不属于同一网络,则可能存在一些权限问题(请参阅:wictorwilen.se/Post/…
【解决方案2】:

+1 为 Erik 的 VM 解决方案报告问题。

要跟踪权限问题,请考虑使用 ProcMon (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) - 将显示您想要的所有内容(而不是 :))关于进程进行的文件/注册表访问。我建议先在您的程序正常工作的机器上尝试几次,以便为您的流程设置过滤设置并了解应该发生的情况。

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 2011-08-21
    • 2015-08-28
    • 2011-11-14
    • 1970-01-01
    • 2011-09-17
    • 2011-11-14
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多