MyFileStream.Position = (count - 1) * 1048576;
                            MyFileStream.Write(data, 0, data.Length);
                            MyFileStream.Flush();我先获取一个文件流,然后我用这段代码去替换其中一部分,为什么不能替换呢?程序没有报错什么的,但是我读取被替换这一段的MD5值,还是没有改变

解决方案 »

  1.   


            /// <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还是替换前的
      

  2.   

    hlep me
    昨天弄很久都找不到原因
      

  3.   

    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整个重写,不要只重写块
      

  4.   

    S1那个没用我是拿来比对data改变没有的,忘记删除了。源文件变了就Truncate整个重写,但是如果用户续传几个G的文件,就改动一点好像不划算啊,我想做的是他改了什么,我就把那些区块替换掉