关于文件流替换

pandaban 2013-09-02 09:12:49

MyFileStream.Position = (count - 1) * 1048576;
MyFileStream.Write(data, 0, data.Length);
MyFileStream.Flush();

我先获取一个文件流,然后我用这段代码去替换其中一部分,为什么不能替换呢?程序没有报错什么的,但是我读取被替换这一段的MD5值,还是没有改变
...全文
105 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pandaban 2013-09-02
  • 打赏
  • 举报
回复
求解啊!!!!!!!!!!!!!!!!!
pandaban 2013-09-02
  • 打赏
  • 举报
回复
引用 5 楼 dongxinxi 的回复:
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的文件,就改动一点好像不划算啊,我想做的是他改了什么,我就把那些区块替换掉
  • 打赏
  • 举报
回复
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整个重写,不要只重写块
pandaban 2013-09-02
  • 打赏
  • 举报
回复
引用 2 楼 tcmakebest 的回复:
代码不全,问题不在这儿。
hlep me 昨天弄很久都找不到原因。。。
pandaban 2013-09-02
  • 打赏
  • 举报
回复
引用 2 楼 tcmakebest 的回复:
代码不全,问题不在这儿。

        /// <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还是替换前的
tcmakebest 2013-09-02
  • 打赏
  • 举报
回复
代码不全,问题不在这儿。
pandaban 2013-09-02
  • 打赏
  • 举报
回复
求解惑。。。。。。。。。。。。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧