系统.UnauthorizedAccessException:访问路径'C:..LocalTempqr

本文关键字:LocalTemp qr UnauthorizedAccessException 访问 路径 系统 | 更新日期: 2023-09-27 18:01:48

我有一个c#访问异常问题。下面是我的集成测试:

[TestFixture]
public class DirectoryTraverserTest
{
    private string testDirectory;
    [SetUp]
    public void Setup()
    {
        testDirectory = CreateTempDirectory();
        var files = new[] { "file1","file2","file3","file4"};
        CreateFiles(testDirectory, files);

        System.Console.WriteLine(testDirectory);
    }
    [TearDown]
    public void TearDown()
    {
        Directory.Delete(testDirectory, true);
    }
    [Test]
    public void testThatFilesComeBackInOrderFileOrder()
    {
        CreateFile(testDirectory, "order.mnl", "file4'nfile3'nfile2'nfile1'n");
        var result = new List<FileInfo>(new DirectoryTraverser(testDirectory));
        Assert.That(result[0].FullName, Is.EqualTo(Path.Combine(testDirectory, "file4")));
        Assert.That(result[1].FullName, Is.EqualTo(Path.Combine(testDirectory, "file3")));
        Assert.That(result[2].FullName, Is.EqualTo(Path.Combine(testDirectory, "file2")));
        Assert.That(result[3].FullName, Is.EqualTo(Path.Combine(testDirectory, "file1")));
    }
    [Test]
    public void testThatFilesComeBackInFileSystemOrder()
    {
        var result = new List<FileInfo>(new DirectoryTraverser(testDirectory));
        Assert.That(result[0].FullName, Is.EqualTo(Path.Combine(testDirectory, "file1")));
        Assert.That(result[1].FullName, Is.EqualTo(Path.Combine(testDirectory, "file2")));
        Assert.That(result[2].FullName, Is.EqualTo(Path.Combine(testDirectory, "file3")));
        Assert.That(result[3].FullName, Is.EqualTo(Path.Combine(testDirectory, "file4")));
    }
    public static string CreateTempDirectory()
    {
        var path = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
        Directory.CreateDirectory(path);
        return path;
    }
    public static void CreateFiles(string path, string[] files)
    {
        foreach (var file in files)
            CreateFile(path, file, file);
    }
    public static void CreateFile(string path, string name, string content)
    {
        using(var f = new StreamWriter(Path.Combine(path, name)))
        {
            f.Write(content);
        }
    }
}

下面是被测试的类(在重构步骤之前)测试不通过):

public class DirectoryTraverser : IEnumerable<FileInfo>
{
    private const string ORDER_FILENAME = "order.mnl";
    private readonly IList<FileInfo> order;
    public DirectoryTraverser(string dirPath)
    {
        var orderfilePath = Path.Combine(dirPath, ORDER_FILENAME);
        if (new FileInfo(orderfilePath).Exists)
        {
            order = new List<FileInfo>();
            using (var sr = File.OpenText(dirPath))
            {
                string file;
                while ((file = sr.ReadLine()) != null)
                    order.Add(new FileInfo(Path.Combine(dirPath, file)));
            }
        }
        else
        {
            order = new List<FileInfo>(new DirectoryInfo(dirPath).GetFiles());
        }
    }
    public IEnumerator<FileInfo> GetEnumerator()
    {
        return order.GetEnumerator();
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

NUnit的输出:

Test net.purpletube.minla.test.FileSystem.DirectoryTraverserTest.testThatFilesComeBackInOrderFileOrder'
failed: System.UnauthorizedAccessException : Access to the path 'C:...'Temp'tto2nvka.1es' is denied.
       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
       at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) 
       at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
       at System.IO.StreamReader..ctor(String path)
       at System.IO.File.OpenText(String path)
       FileSystem'DirectoryTraverser.cs(21,0): at net.purpletube.minla.FileSystem.DirectoryTraverser..ctor(String
dirPath)
       FileSystem'DirectoryTraverserTest.cs(36,0): at net.purpletube.minla.test.FileSystem.DirectoryTraverserTest.testThatFilesComeBackInOrderFileOrder()
1 passed, 1 failed, 0 skipped, took 0.33 seconds (NUnit 2.5.5).

似乎读取四个临时文件(file1到fil4)是错误的很好。是订单文件导致了这个问题。

我完全迷路了。有人知道会发生什么吗?

系统.UnauthorizedAccessException:访问路径'C:..LocalTempqr

我看你是想打开一个目录而不是一个文件:

File.OpenText(dirPath)

如果dirPath实际上是一个目录而不是一个文件的路径,那么这将失败