我正在使用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的最佳方法是什么?感谢。
更新:我正在处理文本文件。
答案 0 :(得分:0)
在写入网络连接中断后,目标文件是什么样的?这一点很重要,因为您的恢复策略必然取决于此。
我怀疑可能发生的是目标文件被消隐为0字节。如果发生这种情况,遗憾的是您无法恢复复制过程,因为已经复制的数据已经消失。您现在可以做的就是重新实例化流并从头开始重新启动副本。对于大型文件,这可能意味着如果一直存在瞬态网络故障,它可能永远不会完成。
但是,如果即使面对网络故障也能成功写入目标文件,则可以使用File.Append()
重新打开文件并继续复制过程。然后,您应该使用inputFile.Position = outputFile.Position
,以便读取和写入再次同步。
如果输入文件的网络连接失败(您正在阅读的文件),请使用File.Open()
重新打开,然后再次设置inputFile.Position = outputFile.Position
。< / p>
以上所有假设您应该使用Stream
将数据读取为 bytes ,这在我看来比您发布的更合适的方法,在那里您阅读< em> characters 使用StreamReader
(假设输入是 text 文件)。