我遇到了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到file4)是 精细。这是导致问题的订单文件。
我完全迷失了。有没有人知道可能会发生什么?
答案 0 :(得分:2)
在我看来,您正在尝试打开目录而不是文件:
File.OpenText(dirPath)
如果dirPath
实际上是目录而不是文件的路径,那么这将失败。