C# 在网络恢复失败后处理steamwriter

C# 在网络恢复失败后处理steamwriter,c#,file-io,streamwriter,C#,File Io,Streamwriter,我正在使用StreamWriter将数据块从一个文件复制到另一个文件中。两个文件位于同一远程位置,但进程在本地计算机上运行。我正在尝试恢复,并在网络出现故障时继续此过程。我通过单步执行代码并在特定时刻禁用网络连接来模拟这种情况 问题是,当我恢复网络时,我无法使用StreamWriter执行任何操作。调用Flush()、Close()或Dispose()会抛出IOException“指定的网络名不再可用”。我的代码如下所示: int charsToRead = 100; while(!inputF

我正在使用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的最佳方式是什么?谢谢


Update:我正在处理文本文件。

网络连接在写入它的过程中,目标文件看起来是什么样子?这一点很重要,因为您的恢复策略必然取决于此

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

但是,如果即使在网络出现故障时也成功写入了目标文件,则可以使用
file.Append()
重新打开文件并继续复制过程。然后应使用
inputFile.Position=outputFile.Position
,以便读写再次同步

如果到输入文件(您正在读取的文件)的网络连接失败,只需使用
file.open()
重新打开它,然后再次设置
inputFile.Position=outputFile.Position


以上所有假设您应该使用
以字节的形式读取数据,在我看来,这比您发布的方法更合适,您使用
流阅读器
读取字符(该方法假设输入是文本文件).

您是否尝试将其放入使用块中?这并不能解决您的问题,但我认为您应该知道,
StreamReader/-Writer
不读取字节,而是读取字符。您确实分配了一个
char[]
,但是您调用了变量
bytesRead
,这是错误的。如果文件是文本文件,则只能使用
StreamReader/-Writer
。如果要复制任何类型的数据,请使用
FileStream
(使用
File.Open()
)创建)。听起来您没有任何选择。清理任何物体,修复任何伤害,要么放弃,要么重试。@Timwi确实如此-甚至可能不会!由于本例是原始副本,因此流API是更好的选择,您是对的。使用using块将在退出该块时清理StreamWriter对象。因此,当发生异常时,对象将被正确处理。这可能是解决您的问题的开始。我正在使用StreamReader/Writer处理文本文件。我不喜欢使用StreamReader,因为代码是框架的一部分,我不想陷入兔子洞。网络关闭后,dest文件与之前写入的文本保持一致。我目前跟踪成功复制的字符数。然后,我重新打开输入文件,用
inputFileStream.BaseStream.seek(charsCopied,SeekOrigin.Begin)
搜索到最后一个字符。这个很好用。但重新打开输出文件时遇到问题。我还尝试了outputFileStream=null,但没有成功。① 您必须显式地关闭outputFileStream(最好使用
using
语句)。② 除非检查目标文件,否则绝对无法知道成功复制了多少个字符。任何引发异常的对
Write
的特定调用都可能成功或失败。③ 我不相信“兔子洞”的说法。你使用了错误的工具来完成任务,这是在自掘坟墓。④
.Seek(x,SeekOrigin.Begin)
.Position=x
完全相同。