【问题标题】:Handling a steamwriter after a failed network recovery网络恢复失败后处理 Steamwriter
【发布时间】:2012-04-04 07:20:33
【问题描述】:

我正在使用 StreamWriter 将块从一个文件复制到另一个文件。这两个文件都在同一个远程位置,但该过程在我的本地计算机上运行。如果网络出现问题,我正在尝试恢复并继续该过程。我通过单步执行我的代码并在特定时刻禁用我的网络连接来模拟这一点。

问题是当我恢复网络时,我无法使用 StreamWriter 做任何事情。调用 Flush()Close()Dispose() 会引发 IOException “指定的网络名称不再可用”。我的代码如下所示:

int charsToRead = 100;
while(!inputFileStream.EndOfStream)
{
    char[] block = new char[charsToRead];
    int charsRead = inputFileStream.ReadBlock(block, 0, charsToRead);
    outputFileStream.Write(new string(block, 0, charsRead));
    outputFileStream.Flush();
}

从网络故障中恢复后继续使用 StreamWriter 的最佳方法是什么?谢谢。

更新:我正在处理文本文件。

【问题讨论】:

  • 你试过把它放在 Using-block 中吗?
  • 这并没有解决您的问题,但我认为您应该知道StreamReader/-Writer 确实读取字节,它读取字符。你确实分配了一个char[],但是你调用了你的变量bytesRead,这是错误的。如果文件是 text 文件,您应该只使用StreamReader/-Writer。如果您想复制任何类型的数据,请使用FileStream(您使用File.Open() 创建)。
  • 听起来你没有任何选择。清理任何物体,修复任何伤害,然后放弃或重试。
  • @Timwi 确实如此——也许那时还没有!由于本案例是原始副本,因此 Stream API 是更好的选择,您是对的。
  • @nthpixel 使用 using 块将在退出该块时清理 StreamWriter 对象。因此,当发生异常时,对象会被正确处置。这可能是解决您的问题的开始。

标签: c# file-io streamwriter


【解决方案1】:

在写入过程中网络连接中断后目标文件的外观如何?了解这一点很重要,因为您的恢复策略必然取决于此。

我怀疑可能发生的情况是目标文件被清空为 0 字节。如果发生这种情况,很遗憾,您无法恢复复制过程,因为已经复制的数据已经消失。您现在所能做的就是重新实例化流并从头开始重新启动副本。对于大文件,这可能意味着如果一直存在短暂的网络故障,它可能永远不会完成。

但是,如果目标文件即使在网络故障的情况下也被成功写入,那么您可以使用File.Append()重新打开文件并继续复制过程。然后您应该使用inputFile.Position = outputFile.Position 以便读取和写入再次同步。

如果与 input 文件的网络连接失败(您正在读取的那个),只需使用File.Open() 重新打开它并再次设置inputFile.Position = outputFile.Position

以上所有假设您应该使用Stream 将数据读取为字节,在我看来,这比您发布的方法更合适,您在其中阅读字符 使用StreamReader(假设输入是一个文本文件)。

【讨论】:

  • 我正在使用 StreamReader/Writer 来处理文本文件。我不喜欢使用 StreamReader,因为代码是框架的一部分,我不想走下那个兔子洞。网络中断后,dest 文件与之前写入的文本保持一致。我目前跟踪成功复制的字符数。然后我重新打开输入文件并使用inputFileStream.BaseStream.Seek(charsCopied, SeekOrigin.Begin) 查找最后一个字符。这工作正常。但是我无法重新打开输出文件。我也试过 outputFileStream = null 没有成功。
  • ①您必须明确关闭 outputFileStream(最好使用using 语句)。 ② 除非检查目标文件,否则绝对无法知道成功复制了多少个字符。对Write 的任何特定调用都会引发异常可能 成功或不成功。 ③ 我不赞成那种“兔子洞”的说法。您使用错误的工具来完成任务是在挖自己的兔子洞。 ④.Seek(x, SeekOrigin.Begin).Position = x完全相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多