私は転送ファイルアプリケーションに問題があります。すごくうまく見えていますが、送信されたファイルの一部が破損していることがわかりました。
動画ファイル(.MP4)を送信したときと同じように正常に送信されましたが、再生時にスナップショット画像のように一部のフレームが壊れてしまいました。元のMP4ファイルを再生したため、そのスナップショットの画像で
ここに私のコードがあります。私は今、fs.Seek
を使って混乱しています。誰かが、新しいファイルをソースファイルと同じにしないと私に言った。私はソケットTCPを使用してい送信されたファイルには、いくつかの破損したデータのTCPソケットがあります。
...(.NET 4.0)
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;
}
}
}
なぜあなたは 'fs'を求めていますか?それは、次の読み取りのために既に適切な位置にあるはずです。 –
それはSEEK外では動作しませんでした。私はその行を削除しようとしました –