【问题标题】:Why isn't this working?为什么这不起作用?
【发布时间】:2012-11-17 23:02:05
【问题描述】:

我正在尝试将字符串数组写入文件,这通常应该是一件容易的事。然而,下面的简单代码抛出了一个 IOException ,表明该文件正在被另一个进程使用。问题是,在运行此代码之前,该文件甚至都不存在。我可以向您保证,没有其他进程在使用该文件。那么我如何让愚蠢的 .NET 框架相信该文件没有被另一个进程使用并且可以继续呢?因为这真的不应该那么难。

StreamWriter writer = new StreamWriter(ListFileName);

foreach (string s in InfoLineList) 
{
    writer.WriteLine(s);
}

【问题讨论】:

  • 你能用File.WriteAllLines(path, InfoListList)吗?也许您遇到的任何文件锁定问题都可以避免。
  • 我可以。但是我真的很想知道为什么它认为文件在其他地方打开?
  • 好的,我把它改成了使用 WriteAllLines,它现在可以工作了。我仍然不明白为什么它不能以其他方式工作,如果有人可以向我解释这一点,我将不胜感激,但 WriteAllLines 确实有效。
  • 提供的代码应该不会导致问题。即使您没有正确关闭文件,该文件也会在程序退出时关闭。如果我要尝试解决它,我会在调试器中运行程序以查看异常被抛出的位置以及当前的局部变量是什么。您可能需要关闭 Window 的文件索引服务或调整 writer 以显式锁定文件。
  • 以后请想出一个比“为什么这不起作用?”更好的标题

标签: c# .net file-io streamwriter


【解决方案1】:

这可能是因为您在完成后没有关闭流,因此某些句柄在某处卡住了。也许代码是 Web 应用程序的一部分,并且 Web 服务器进程保持该锁定,或者代码正在运行多次。我建议在 using 块中使用流:

using(StreamWriter writer = new StreamWriter(ListFileName))
{
   foreach (string s in InfoLineList) 
   {
       writer.WriteLine(s);
   }
}

这将确保StreamWriter 得到妥善处理。

如果您真的想知道打开的文件是什么,请使用SysInternal's Handle tool 进行检查。我愿意打赌这是你自己的程序。

最后,正如我在 cmets 中所说,File.WriteAllLines() 方法可以一次将一个可枚举的字符串列表写入文件:

File.WriteAllLines(ListFileName, InfoListList);

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2011-10-13
    • 2016-07-06
    • 2011-11-21
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多