【问题标题】:Create file during mstest - System.UnauthorizedAccessException在 mstest 期间创建文件 - System.UnauthorizedAccessException
【发布时间】:2018-04-07 00:04:54
【问题描述】:

我有一个带有单元测试项目的 UWP C# 应用。在这些单元测试中,我希望能够写入文本文件以制作类似snapshots in Jest 的内容。

Directory.GetCurrentDirectory() 返回C:\path\to\project\bin\x64\Debug\AppX,所以我在项目目录中创建了一个文件夹并导航到它,然后尝试在那里创建一个文件。

[TestMethod]
public void Test()
{
    var folder = Path.Combine(Directory.GetCurrentDirectory(), "../../../../Snapshots");
    string data = "example data";
    string filename = Path.Combine(folder, "Test.snap");
    File.WriteAllText(filename, json);
}

但是,此测试会生成 System.UnauthorizedAccessException。我进入 Windows 中的文件夹并授予每个人读/写权限,但这没有任何区别。

我不想以管理员身份运行 Visual Studio。这可能吗?

【问题讨论】:

    标签: c# .net visual-studio uwp mstest


    【解决方案1】:

    请在此处查看 Rob 的博客: https://blogs.msdn.microsoft.com/wsdevsol/2012/12/04/skip-the-path-stick-to-the-storagefile/

    这是 Rob 的回答:

    Windows 应用商店应用以沙盒方式运行,并且对 文件系统。在大多数情况下,他们只能直接访问他们的 安装文件夹及其应用程序数据文件夹。他们没有 访问其他地方的文件系统的权限(请参阅文件访问和 权限以获取更多详细信息)。

    只能通过代理进程访问其他位置。 这个代理进程以用户的全部权限运行,它可以 代表应用程序对应用程序拥有的位置使用这些权限 通过功能请求,用户通过文件请求的位置 选择器等。 StorageItem 封装了这个代理过程,所以 应用程序不需要直接处理它。”

    在 UWP 应用中,我们不再推荐使用路径。存在权限问题,因此在访问某些路径时需要代理。我对单元测试不熟悉。但如果您仍在使用 UWP 功能,则应考虑改用 StorageFile 相关 API。

    【讨论】:

      【解决方案2】:

      我使用Path.GetTempPath() 在需要物理磁盘访问的单元测试中创建临时目录和文件。单元测试可以从未知的上下文/位置运行,所以我发现使用 temp 目录作为创建一次性文件的保证方式。

      [TestMethod]
      public void Test()
      {
          var folder = Path.Combine(Path.GetTempPath(), "Snapshots");
          string data = "example data";
          string filename = Path.Combine(folder, "Test.snap");
          File.WriteAllText(filename, json);
      }
      

      【讨论】:

        【解决方案3】:

        如何检查您是否授予了正确文件夹的权限?

                var folder = Path.Combine(Directory.GetCurrentDirectory(), "../../../../Snapshots");
                string data = "example data";
        
                // this variable will contain the actual folder; add a watch
                // or bookmark it to check it
                var actualPath = Path.GetFullPath(folder);
        
                string filename = Path.Combine(folder, "Test.snap");
                File.WriteAllText(filename, data);
        

        以防万一,也添加下面的行(File.WriteAllText 之前);也许你的文件已经存在,我不知道,是只读的:

                File.SetAttributes(filename, FileAttributes.Temporary);
        

        【讨论】:

          猜你喜欢
          • 2013-10-16
          • 2013-04-05
          • 2017-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多