2

C# コンソール アプリケーションがネットワーク経由でファイルにアクセスし、書き込みを行っています。一部のファイルが破損していて、null のみが書き込まれていることに気付きました。例外はありませんでした。ファイルのストリームにバイト配列を書き込む単純なコードを使用しています。バイナリ モードでファイルを開くと、「0: 00 00 00 00 10: 00 00 00 00」のようなゼロしか表示されません。

なぜそのようなことが起こるのか誰か知っていますか?ネットワーク障害が発生した可能性がありますが、ネットワーク障害によっていくつかの IO 例外がスローされたはずですよね?

誰かがこれについて何か考えを持っているかどうか教えてください。

コードサンプル:

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

4 に答える 4

9

必要に応じて、必ずFileStream.Flush()を呼び出してください。

于 2009-12-14T19:22:34.620 に答える
3

ファイルを閉じていることを確認してください。

于 2009-12-14T19:15:57.770 に答える
2

上記のtzerbが彼のコードについて述べたように、私は別のレイヤーを追加するのが最善だと思いました。例外が実際にキャッチされているかどうかを確認するためのtry / catchです。例外が発生しなかったのに、一撃の価値があることに驚いています。

試す{
  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 catched:{0}"、secEx.ToString());
} catch(System.IO.IOException ioEx){
  Console.WriteLine( "IOExceptionがキャッチされました:{0}"、ioEx.ToString());
}

次に、「IOExceptionがキャッチされました:...」というメッセージが実際に表示されたかどうかを確認します。

編集:セキュリティ例外を追加して、権限と関係があるかどうかを確認しましたか?

これがお役に立てば幸いです、よろしく、トム。

于 2009-12-14T21:14:25.380 に答える
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();
} 

次に行うことは、書き込んでいるデータが期待どおりであることを確認し、それ以外にファイルが変更されていないことを確認することです。

于 2009-12-14T20:58:11.240 に答える