在mstest期间创建文件 - System.UnauthorizedAccessException

时间:2017-10-25 19:04:21

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

我有一个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中的文件夹并给了Everyone读/写权限,但这并没有任何区别。

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

3 个答案:

答案 0 :(得分:1)

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

以下是Rob的答案:

  

Windows应用商店应用运行沙盒,访问权限非常有限   文件系统。在大多数情况下,他们只能直接访问他们的   安装文件夹及其应用程序数据文件夹他们没有   在别处访问文件系统的权限(请参阅文件访问和   权限更多细节)。

     

只有通过代理流程才能访问其他位置。   此代理进程使用用户的完全权限运行,它可以   代表app在应用程序所在的位置使用这些权限   通过功能请求,用户通过文件请求的位置   拣货员等.StorageItem封装了这个经纪程序   该应用程序不需要直接处理它。"

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

答案 1 :(得分:0)

我使用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);
}

答案 2 :(得分:0)

检查你是否授予了正确的文件夹权限呢?

        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);