2012-03-04 12 views
0

私は転送ファイルアプリケーションに問題があります。すごくうまく見えていますが、送信されたファイルの一部が破損していることがわかりました。
動画ファイル(.MP4)を送信したときと同じように正常に送信されましたが、再生時にスナップショット画像のように一部のフレームが壊れてしまいました。元のMP4ファイルを再生したため、そのスナップショットの画像で
ここに私のコードがあります。私は今、fs.Seekを使って混乱しています。誰かが、新しいファイルをソースファイルと同じにしないと私に言った。私はソケットTCPを使用してい送信されたファイルには、いくつかの破損したデータのTCPソケットがあります。

...(.NET 4.0)

enter image description here

Sendメソッド(CLIENT):

FileStream fs; 
long sum; 
long fileSize; 
byte[] data = null; 
NetworkStream network; 
const int packetSize = 1024*8; 

private void SendFile(string srcPath, string destPath) 
    { 
     string dest = Path.Combine(destPath, Path.GetFileName(srcPath)); 
     using (fs = new FileStream(srcPath, FileMode.Open, FileAccess.Read)) 
     { 
      try 
      { 
       sum = 0; 
       int count = 0; 
       data = new byte[packetSize]; 
       //send the destination path and the file size to SERVER. 
       SendCommand("receive<" + dest + "<" + fs.Length.ToString()); 
       while (sum < fileSize) 
       { 
        if (fileSize - sum < packetSize) 
        { 
         count = fs.Read(data, 0, Convert.ToInt32(fileSize - sum)); 
         network.Write(data, 0, Convert.ToInt32(fileSize - sum)); 
        } 
        else 
        { 
         count = fs.Read(data, 0, data.Length); 
         network.Write(data, 0, data.Length); 
        } 
        fs.Seek(sum, SeekOrigin.Begin); 
        sum += count; 
        backgroundWorker1.ReportProgress((int)((sum * 100)/fileSize)); 
       } 
       network.Flush(); 
      } 
      finally 
      { 
       fs.Dispose(); 
       data = null; 
      } 
     } 
    } 

は、メソッド(SERVER)を受信:

FileStream fs; 
long sum; 
long fileSize; 
byte[] data = null; 
NetworkStream network; 
const int packetSize = 1024*8; 

public void Receive(string destPath, long fileSize) 
    { 
     using (fs = new FileStream(destPath, FileMode.Create, FileAccess.Write)) 
     { 
      try 
      { 
       int count = 0; 
       long sum = 0; 
       data = new byte[packetSize]; 
       while (sum < fileSize) 
       { 
        if (fileSize - sum < packetSize) 
        { 
         count = network.Read(data, 0, Convert.ToInt32(fileSize - sum)); 
         fs.Write(data, 0, Convert.ToInt32(fileSize - sum)); 
        } 
        else 
        { 
         count = network.Read(data, 0, data.Length); 
         fs.Write(data, 0, data.Length); 
        } 
        fs.Seek(sum, SeekOrigin.Begin); 
        sum += count; 
       } 
      } 
      finally 
      { 
       fs.Dispose(); 
       data = null; 
      } 
     } 
    } 
+0

なぜあなたは 'fs'を求めていますか?それは、次の読み取りのために既に適切な位置にあるはずです。 –

+0

それはSEEK外では動作しませんでした。私はその行を削除しようとしました –

答えて

1

を読んだことを確認することができますReceive

count = network.Read(data, 0, data.Length); 
fs.Write(data, 0, data.Length); 

でコードのサンプルです今は、このコードを提案します。中に入れてください(合計< fileSize)。

送る:

count = fs.Read(data, 0, packetSize); 
    network.Write(data, 0, count); 
    sum += count; 
    backgroundWorker1.ReportProgress((int)((sum * 100)/fileSize)); 

と受信:

count = network.Read(data, 0, packetSize); 
    fs.Write(data, 0, count); 
    sum += count; 

これは、あなたが読んでいるだけでデータを転送することを保証します。の場合にはが必要でないことに注意してください。Readは読み込んだバイト数を返すので、ファイルの先頭または末尾には関係ありません。 。

+0

感謝の男..それはGREATTTTTT –

3

ファイルまたはネットワークストリームから読み取るバイト数は決して考慮されません。あなたのサーバの変数countを参照してください&クライアントコード。

countバイトを入力ストリームから読み込んだ後、他のストリームに書き込む必要があります。ここで

EDIT

は、あなたがそれを解決しませんでしたどのようにあなたはケースでdata.Lengthバイト

+0

ummmと私はなぜそれを行う必要がありますか? –

+2

'stream.Read(buffer、0,1000)'はストリームから1000バイトを取得するわけではありません。これは0と1000の間の任意の値にすることができます。これは、 'Read'が読み込んだバイト数を返す理由です。 –

+0

umm ..あなたは私のコードを編集し、答えを投稿しますか?私は正確に何を編集すべきか分からないので、 –

関連する問題