2009-12-14 86 views
2

我有一个C#控制台应用程序通过网络访问文件并写入它。我注意到有些文件已经损坏,只写入了空文件。我没有得到任何例外。 我正在使用将字节数组写入文件流的简单代码。以二进制模式打开文件时,我看到的全部是零,如“0:00 00 00 00 10:00 00 00 00”。.NET文件流写入方法写入所有空行

有谁知道为什么会发生这样的事情?网络故障可能会发生,但网络故障应该会引发一些IO异常吗?

让我知道是否有人对此有任何想法。

代码示例:

FileInfo fi = new FileInfo(filePath); 
using (FileStream fs = fi.Open (FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    fs.Write(byteData, 0, byteData.Length); 
} 
+0

您是否找到解决问题的方法?我认为我得到了同样的行为。我注意到一篇关于从文件流中读取数据的文章,可能并不像人们想象的那么直截了当。 http://www.yoda.arachsys.com/csharp/readbinary.html – 2010-05-27 08:36:59

回答

3

确保您关闭文件。

+0

该代码位于使用块内,因此文件关闭不应该成为问题。除了几个文件出现这个问题外,很多文件已经成功保存。 – Srijanani 2009-12-14 20:21:04

9

确保在适当情况下调用FileStream.Flush()。

0

这是一个新的。我的猜测是,下游代码中的异常正在丢失,而FileStream对象被销毁。我想通过改变代码来显式地尽一切开始:


FileInfo fi = new FileInfo(filePath); 
using (FileStream fs = fi.Open (FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    fs.Write(byteData, 0, byteData.Length); 
    fs.Flush(); 
    fs.Close(); 
} 

我做的下一件事就是确保你写的数据如预期,然后说什么都没被修改的文件。

2

由于tzerb以上提到他的代码,我认为这将是最好添加另一层,一个try/catch来检查,看看是否异常确实是被抓 - 我很惊讶,没有异常发生,但值得一拍摄

 
try{ 
    FileInfo fi = new FileInfo(filePath); 
    using (FileStream fs = fi.Open (FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
    fs.Write(byteData, 0, byteData.Length); 
    fs.Flush(); 
    fs.Close(); 
    } 
}catch(System.Security.SecurityException secEx){ 
    Console.WriteLine("SecurityException caught: {0}", secEx.ToString()); 
}catch(System.IO.IOException ioEx){ 
    Console.WriteLine("IOException caught: {0}", ioEx.ToString()); 
} 

确认,然后,如果你确实得到消息“IOException异常捕获:...”

编辑:添加了一个安全异常,看它是否有事情做与权限?

希望这会有所帮助, 最好的问候, 汤姆。

+0

该文件写入代码实际上位于try catch块内。让我添加IO异常处理程序,看看是否有任何事情被捕获。 – Srijanani 2009-12-14 22:42:25

+0

@Srijanani:好的,现在你提到它在try/catch中 - 我认为你应该编辑你的文章以包含try/catch。我想过其他的东西可能会绊倒...看到我上面编辑的代码...这是一个自己在脚下射击... :) – t0mm13b 2009-12-14 23:52:38

+0

@Srijanani:如果你仍然没有看到任何异常控制台,然后我难住 - 可能是在写入文件时断开的网络连接?你正在使用的文件名是什么?你是否在逐字串中使用UNC,即@“\\ MyServer \ foobar.dat”? – t0mm13b 2009-12-14 23:57:03