3

TXT ファイルと XML ファイルのどちらを読んでも、ディスクに保存されたファイルに追加された「余分な」情報が常に表示されます。まず、次のことを行います。

FileStream fs = new FileStream(fileMoverFile.SourcePath, FileMode.Open, FileAccess.Read);

次に、以下の関数に渡すfsタイプの変数に代入します。Stream

private void SaveToDisk(Stream fileStream, string saveToPath)
{
  if (!Directory.Exists(Path.GetDirectoryName(saveToPath)))
  {
    Directory.CreateDirectory(Path.GetDirectoryName(saveToPath));
  }
  FileStream outputStream = new FileInfo(saveToPath).OpenWrite();
  const int bufferSize = 1024;
  byte[] buffer = new byte[bufferSize];
  int bytesRead = fileStream.Read(buffer, 0, bufferSize);
  while (bytesRead > 0)
  {
    outputStream.Write(buffer, 0, bufferSize);
    bytesRead = fileStream.Read(buffer, 0, bufferSize);
  }
  outputStream.Close();
}

ディスクに保存されたファイルを開くと、基本的に同じファイルの一部のコンテンツが、ファイルに属さない他の情報と繰り返されている追加情報が表示されます。非常に奇妙な。

何が原因でしょうか?

4

2 に答える 2

5

bytesReadバイトではなく、バイトを書き込む必要がありbufferSizeます。

int bytesRead = fileStream.Read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
    outputStream.Write(buffer, 0, bytesRead); // Change this here

現在、入力ストリームの最後に到達すると、読み込んだデータよりも多くのデータを書き込んでいる可能性があり、ファイルの最後に「余分なゴミ」が発生します。

そうは言っても、ストリームをコピーするだけが目的の場合は、Stream.CopyToを使用できます (.NET 4+ を使用している場合)。これにより、読み取り/書き込みループが完全に回避され、コードが大幅に簡素化されます。

private void SaveToDisk(Stream fileStream, string saveToPath)
{
  if (!Directory.Exists(Path.GetDirectoryName(saveToPath)))
  {
    Directory.CreateDirectory(Path.GetDirectoryName(saveToPath));
  }
  using(FileStream outputStream = new FileInfo(saveToPath).OpenWrite())
  {
      fileStream.CopyTo(outputStream);
  }
}
于 2012-09-17T23:23:55.310 に答える
1

バッファを適切に使用していません。への呼び出しがそれfileStream.Read()より少ない値を返す場合bufferSizeでも、プログラムは以前に読み取ったデータを含む残りのバッファを引き続き読み取ります。

これを行う方法は次のとおりです。

using(FileStream output = new FileStream( saveToPath, FileMode.Create, FileAccess.Write )) {

    Byte[] buffer = new Byte[ 32 * 1024 ]; // a 32KB-sized buffer is the most efficient
    Int32 bytesRead;

    while( (bytesRead = fileStream.Read( buffer, 0, buffer.Length ) ) > 0 ) {

        output.Write( buffer, 0, bytesRead );
    }
    output.Flush();
}

出力に書き直されたデータを制限するために使用usingした方法に注意してください。bytesRead

于 2012-09-17T23:22:48.970 に答える