即使使用using语句,文件也被另一个进程锁定

时间:2015-10-07 21:28:04

标签: c# stream streamwriter

我正在尝试写一个名为output.txt的文件。我的代码第一次运行时很好,但是它第二次抛出异常:

  

该进程无法访问output1.txt,因为它正被另一个进程

使用

但是我在using语句中使用它,它应该被处理掉,文件应该被解锁。

构造函数说if the file exists, it can either be appended to or overwritten。似乎没有这样做是因为它抛出的IOException。

为什么会这样?

using (System.IO.StreamWriter file = new System.IO.StreamWriter(@directoryURL + "\\output"+outputNumber+".txt", true))
{
    foreach (string line in splitOutput)
    {
        file.WriteLine(line);
    }
}

1 个答案:

答案 0 :(得分:1)

文件仍然可以锁定的原因有很多,例如:病毒扫描仪。

使用SysInternals Process Explorer,"查找句柄" ( Ctrl + F ),输入您的文件名,查看您的文件正在使用哪个应用程序。

您已将urltest.vshost.exe标识为罪魁祸首(在评论中提及),因此它必须是您的代码......

在通过PasteBin提供的代码中,我看到以下循环

foreach (string file in fileEntries)
{
    StreamReader fileStream = new StreamReader(file);
    ...
    FileHander(fileStream, extension, websiteURL, fileName);
}

这会打开许多​​文件流,但FileHandler()仅对某些扩展程序运行:

private void FileHander(StreamReader fileStream, string extension, string websiteURL, string fileName)
{
    switch (extension)
    {
        ...
        CheckPowershell(fileStream, websiteURL, fileName);
        ...
    }
} 

只有CheckPowershell()关闭文件:

private void CheckPowershell(StreamReader fileStream, string websiteURL, string fileName)
{
    ...
    fileStream.Close();
}

因此,所有没有特定扩展名的文件(例如.txt)都会保持打开状态。

快速解决方案似乎将Close()CheckPowershell()移至FileHander()。更专业的方式需要更多的重构。