У меня была похожая ситуация с файлами результатов XML, созданными программой запуска консоли xUnit. Я добавляю его в качестве ответа здесь на тот случай, если это поможет другим найти причину / решение, когда StreamReader имеет форму XmlTextReader, который построен поверх Stream и TextReader, а также может наложить блокировки на базовый файл, который сделать последующие операции перемещения и удаления неуспешными, если основной поток и считыватель не закрываются и удаляются сразу после завершения чтения.
public void ReadResultsXmlFile(string testResultsXmlFile)
{
MyXmlTextReader = new XmlTextReader(testResultsXmlFile);
testResultXmlDocument = new XmlDocument();
testResultXmlDocument.Load(MyXmlTextReader);
XmlNode xnAssembliesHeader = testResultXmlDocument.SelectSingleNode("/assemblies");
XmlNodeList xnAssemblyList = testResultXmlDocument.SelectNodes("/assemblies/assembly");
foreach (XmlNode assembly in xnAssemblyList)
{
XmlNodeList xnTestList = testResultXmlDocument.SelectNodes(
"/assemblies/assembly/collection/test");
foreach (XmlNode test in xnTestList)
{
TestName = test.Attributes.GetNamedItem("name").Value;
TestDuration = test.Attributes.GetNamedItem("time").Value;
PassOrFail = test.Attributes.GetNamedItem("result").Value;
}
}
}
Конечно, задним числом очевидно, что мне не удалось закрыть XmlTextReader, который включает базовый StreamReader, и что это оставляло блокировки для файлов результатов XML.
Фиксированный код выглядит так:
public void ReadResultsXmlFile(string testResultsXmlFile)
{
using (MyXmlTextReader = new XmlTextReader(testResultsXmlFile))
{
testResultXmlDocument = new XmlDocument();
testResultXmlDocument.Load(MyXmlTextReader); // suppose that myXmlString contains "<Names>...</Names>"
XmlNode xnAssembliesHeader = testResultXmlDocument.SelectSingleNode("/assemblies");
XmlNodeList xnAssemblyList = testResultXmlDocument.SelectNodes("/assemblies/assembly");
foreach (XmlNode assembly in xnAssemblyList)
{
XmlNodeList xnTestList = testResultXmlDocument.SelectNodes(
"/assemblies/assembly/collection/test");
foreach (XmlNode test in xnTestList)
{
TestName = test.Attributes.GetNamedItem("name").Value;
TestDuration = test.Attributes.GetNamedItem("time").Value;
PassOrFail = test.Attributes.GetNamedItem("result").Value;
}
}
}
}
... и проблема с заблокированными файлами для последующих операций перемещения и удаления исчезла. Ключевыми линиями, конечно же, являются
using (MyXmlTextReader = new XmlTextReader(testResultsXmlFile))
{
// Do stuff inside "using... block
} // At close of "using" block, objects in using get Released...
Что бы это ни стоило, приложение представляет собой средство запуска тестов, которое запускает автоматизированные веб-тесты на основе Selenium с использованием консоли запуска тестов xUnit и сообщает программе запуска консоли xUnit создание файлов результатов XML с помощью параметра командной строки. SpecFlow также задействован поверх слоя бегуна тестов xUnit, но файлы результатов xUnit - это то, что читается. После выполнения теста я хотел переместить файлы результатов XML в архивные папки на основе даты, и эта операция File.Move () не выполнялась из-за блокировок в файлах результатов xUnit, как результат кода без блока using.