关于文件流替换 MyFileStream.Position = (count - 1) * 1048576; MyFileStream.Write(data, 0, data.Length); MyFileStream.Flush();我先获取一个文件流,然后我用这段代码去替换其中一部分,为什么不能替换呢?程序没有报错什么的,但是我读取被替换这一段的MD5值,还是没有改变 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 /// <summary> /// 接受 /// </summary> /// <param name="client"></param> /// <param name="ServerPath"></param> public void ReceiverFile(Socket client, string ServerPath) { byte[] errorPacket = new byte[] { }; FileStream MyFileStream = null; int count = 0; string sMD5 = ""; if (File.Exists(ServerPath)) { MyFileStream = new FileStream(ServerPath, FileMode.Open, FileAccess.ReadWrite); string exists_file = MyFileStream.Length.ToString();//已传大小 int packetCount = (int)(Convert.ToInt64(exists_file) / 1048576);//已传包的数量 long cutFileSize = 1048576 * packetCount; while (true) { byte[] index = TransferFile.ReceiveVarData(client); byte[] bMD5 = TransferFile.ReceiveVarData(client); byte[] data = TransferFile.ReceiveVarData(client); string s = System.Text.Encoding.Unicode.GetString(data); if (index.Length != 0) { count = Convert.ToInt32(System.Text.Encoding.Unicode.GetString(index)); } sMD5 = System.Text.Encoding.Unicode.GetString(bMD5); if (count * 1048576 <= cutFileSize)//验证已传文件MD5值 { MyFileStream.Read(data, 0, data.Length); string s1 = System.Text.Encoding.Unicode.GetString(data); string cMD5 = GetMD5Hash(data); if (cMD5 == sMD5) { TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("true")); } else { MyFileStream.Seek((count - 1) * 1048576, SeekOrigin.Begin); MyFileStream.Write(data, 0, data.Length); TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("error")); } } else { string cMD5 = GetMD5Hash(data); if (data.Length == 0) { break; } if (cMD5 == sMD5) { MyFileStream.Write(data, 0, data.Length); TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("true")); } else { TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("error")); } } } } else { MyFileStream = new FileStream(ServerPath, FileMode.Create, FileAccess.Write); while (true) { byte[] index = TransferFile.ReceiveVarData(client); byte[] bMD5 = TransferFile.ReceiveVarData(client); byte[] data = TransferFile.ReceiveVarData(client); sMD5 = System.Text.Encoding.Unicode.GetString(bMD5); string cMD5 = GetMD5Hash(data); if (data.Length == 0) { break; } if (cMD5 == sMD5) { //将接收到的数据包写入到文件流对象 MyFileStream.Write(data, 0, data.Length); TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("true")); } else { TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("error")); } } } MyFileStream.Close(); client.Close(); } }这个是接收方法的完整代码,问题是续传文件时改变了源文件,比对数据包的MD5值,不相等就替换,但是怎么都替换不了,下次比对MD5还是替换前的 hlep me昨天弄很久都找不到原因 sMD5 = System.Text.Encoding.Unicode.GetString(bMD5); if (count * 1048576 <= cutFileSize)//验证已传文件MD5值 { MyFileStream.Read(data, 0, data.Length); string s1 = System.Text.Encoding.Unicode.GetString(data); string cMD5 = GetMD5Hash(data); if (cMD5 == sMD5) 貌似你只能应该用s1 == sMD5 ?源文件变了就Truncate整个重写,不要只重写块 S1那个没用我是拿来比对data改变没有的,忘记删除了。源文件变了就Truncate整个重写,但是如果用户续传几个G的文件,就改动一点好像不划算啊,我想做的是他改了什么,我就把那些区块替换掉 DevExpress 控件问题 新人求助 运行C#时出现的错误 超级终端发送pdu码的问题 c#老手近 请问:listview中如何添加combobox控件? 关于datatable数据重复行的 问题 问c#调用dll的问题(请Knight94(愚翁)、kssys和各位高手看看 ) 开过网吧或做过网管的朋友们,帮兄弟一把。TKS 水晶表报公式条件编写 怎样获得数据库中的各列 关于TextEdit和DateEdit的问题 懂sendmessage或者windows消息机制的进来看看,真心没法了
/// <summary>
/// 接受
/// </summary>
/// <param name="client"></param>
/// <param name="ServerPath"></param>
public void ReceiverFile(Socket client, string ServerPath)
{
byte[] errorPacket = new byte[] { };
FileStream MyFileStream = null;
int count = 0;
string sMD5 = "";
if (File.Exists(ServerPath))
{
MyFileStream = new FileStream(ServerPath, FileMode.Open, FileAccess.ReadWrite);
string exists_file = MyFileStream.Length.ToString();//已传大小
int packetCount = (int)(Convert.ToInt64(exists_file) / 1048576);//已传包的数量
long cutFileSize = 1048576 * packetCount;
while (true)
{
byte[] index = TransferFile.ReceiveVarData(client);
byte[] bMD5 = TransferFile.ReceiveVarData(client);
byte[] data = TransferFile.ReceiveVarData(client);
string s = System.Text.Encoding.Unicode.GetString(data);
if (index.Length != 0)
{
count = Convert.ToInt32(System.Text.Encoding.Unicode.GetString(index));
}
sMD5 = System.Text.Encoding.Unicode.GetString(bMD5);
if (count * 1048576 <= cutFileSize)//验证已传文件MD5值
{
MyFileStream.Read(data, 0, data.Length);
string s1 = System.Text.Encoding.Unicode.GetString(data);
string cMD5 = GetMD5Hash(data);
if (cMD5 == sMD5)
{
TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("true"));
}
else
{
MyFileStream.Seek((count - 1) * 1048576, SeekOrigin.Begin);
MyFileStream.Write(data, 0, data.Length);
TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("error"));
}
}
else
{
string cMD5 = GetMD5Hash(data);
if (data.Length == 0)
{
break;
}
if (cMD5 == sMD5)
{
MyFileStream.Write(data, 0, data.Length);
TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("true"));
}
else
{
TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("error"));
}
}
}
}
else
{
MyFileStream = new FileStream(ServerPath, FileMode.Create, FileAccess.Write);
while (true)
{
byte[] index = TransferFile.ReceiveVarData(client);
byte[] bMD5 = TransferFile.ReceiveVarData(client);
byte[] data = TransferFile.ReceiveVarData(client);
sMD5 = System.Text.Encoding.Unicode.GetString(bMD5);
string cMD5 = GetMD5Hash(data);
if (data.Length == 0)
{
break;
}
if (cMD5 == sMD5)
{
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("true"));
}
else
{
TransferFile.SendVarData(client, System.Text.Encoding.Unicode.GetBytes("error"));
}
}
}
MyFileStream.Close();
client.Close();
}
}这个是接收方法的完整代码,问题是续传文件时改变了源文件,比对数据包的MD5值,不相等就替换,但是怎么都替换不了,下次比对MD5还是替换前的
昨天弄很久都找不到原因
if (count * 1048576 <= cutFileSize)//验证已传文件MD5值
{
MyFileStream.Read(data, 0, data.Length);
string s1 = System.Text.Encoding.Unicode.GetString(data);
string cMD5 = GetMD5Hash(data);
if (cMD5 == sMD5) 貌似你只能应该用s1 == sMD5 ?源文件变了就Truncate整个重写,不要只重写块