关于文件分割传输的问题,请高手多多指教!急

时间:2021-10-27 00:31:51
我按照《VC++网络通信编程案例精选》第五章的内容写了个大型文件传输程序,发现在传word文件时出现文件打不开的情况,但是在传小型文件(文本文件)是没有问题的。大型文件分割的时后我发现了一个百思不得其解的问题,当把分割的内容存放到CString 变量后,再将此变量中的内容写入文件,然后再打开就读不了了,我把问题简化如下:
void CFile_R_WView::OnFileRead() 
{
CFile pFile ;
CFile pFile1 ; 
CFile pFile2 ; 
pFile.Open("1.doc",CFile::modeRead);
pFile1.Open("2.doc",CFile::modeCreate | CFile::modeWrite);
pFile2.Open("3.doc",CFile::modeCreate | CFile::modeWrite);
DWORD file_length;
file_length = pFile.GetLength ();
    CString str;
byte my_byte[1024*16];
byte my_byte1[1024*16];
byte my1;
byte my2;
    int i;  
int count;
while(1)
{
    count = pFile.Read (my_byte,1024*16);     
        str = my_byte;
for(i = 0; i< str.GetLength();i++)
{    
   my_byte1[i] = str.GetAt (i);

//         my1= my_byte1[i];
//   my2 = my_byte[i];
//   my_byte1[i] = my_byte[i];
//   if(my_byte1[i] != my_byte[i])
//   {
//     MessageBox("what is wrong");
//   }
}
      if(count<1024*16)
{  
my_byte[count]=0;
            my_byte1[count] = 0;

    pFile1.Write (my_byte1,count);
pFile2.Write(my_byte,count);
    break;
}
   pFile1.Write (my_byte1,count);
   pFile2.Write(my_byte,count);
}
pFile.Close ();
pFile1.Close();
        pFile2.Close();
}
其中1.doc是已经有的文件,放在程序文件夹下,那么问题是为什么3.doc能正常打开且内容跟1.doc一模一样而2.doc却打不开呢?它们文件的大小也是一样的啊?我是用VC++6.0编的。是字符集设置的问题吗,?还是其它??望高手指点,并给出解决办法,小弟不胜感激!

17 个解决方案

#1


文件二进制操作..

#2


能具体给出代码吗?

#3


这个你Debug下调试一下,看看函数执行的返回值,是成功或者是失败了,@err,hr看看GetLastError的值,失败的原因是什么

#4


要用二进制方式读取,另外不要使用CString保存

#5


部长好, 看代码2个文件操作都是一样的,只是顺序不同,可以调试下看哪里跑偏了。也可以用工具比较下2个生成的DOC文件看哪里不一样再分析下。

#6


word文件最好用二进制传输,同时检查一下是否传送前就损坏了word文件

#7


用二进制传输是指在文件打开方式上添加CFile::typeBinary吗?但这样还是不行…我感觉是CString类的问题,为什么byte类型可以直接赋给CString类,而反过来却不行呢,如果用char类型是可以的,但CArchive串行化不支持char类型的数组,也就是》操作符没有重载char类型数组的函数,无奈之下选了CString类作为保存变量,没想到出现这样的错…如果此路不通,应该用什么类型变量作为保存变量呢?在上面提到的书里面是用CString类型作为存储变量的,而且CString在vc6环境下默认的字符集设置是多字节的…总之问题还是没有解决,困扰好多天了,望高人指教,有演示代码更好了!

#8


此问题没人解答吗?!论坛里面没人会?!

#9


word文件有格式码;也就是说它不是纯文本的;不要使用CString;

#10


不要使用CString,因为CString遇到\0就会截断的,你要用BYTE*,unsigned char*,用二进制方式读取文件

#11


恩,但是CArchive操作符不支持<<或>>不支持byte*或char*,只支持单字节,与CSocketFile联用,单字节传输也太慢了吧?

#12


A CSocketFile can  also be used as a (limited) file without a CArchive object. By default, the CSocketFile constructor’s bArchiveCompatible parameter is TRUE. This specifies that the file object is for use with an archive. To use the file object without an archive, pass FALSE in the bArchiveCompatible parameter.

#13


这个到没注意看,我试一下

#14


该回复于2011-03-07 13:20:14被版主删除

#15


初学socket,不要用MFC封装的socket类,先从socket api学.后来再看mfc的,才能理解mfc对socket封装原理.

#16


learning

#17


看MSDN还是要仔细点;问题肯定能解决的

#1


文件二进制操作..

#2


能具体给出代码吗?

#3


这个你Debug下调试一下,看看函数执行的返回值,是成功或者是失败了,@err,hr看看GetLastError的值,失败的原因是什么

#4


要用二进制方式读取,另外不要使用CString保存

#5


部长好, 看代码2个文件操作都是一样的,只是顺序不同,可以调试下看哪里跑偏了。也可以用工具比较下2个生成的DOC文件看哪里不一样再分析下。

#6


word文件最好用二进制传输,同时检查一下是否传送前就损坏了word文件

#7


用二进制传输是指在文件打开方式上添加CFile::typeBinary吗?但这样还是不行…我感觉是CString类的问题,为什么byte类型可以直接赋给CString类,而反过来却不行呢,如果用char类型是可以的,但CArchive串行化不支持char类型的数组,也就是》操作符没有重载char类型数组的函数,无奈之下选了CString类作为保存变量,没想到出现这样的错…如果此路不通,应该用什么类型变量作为保存变量呢?在上面提到的书里面是用CString类型作为存储变量的,而且CString在vc6环境下默认的字符集设置是多字节的…总之问题还是没有解决,困扰好多天了,望高人指教,有演示代码更好了!

#8


此问题没人解答吗?!论坛里面没人会?!

#9


word文件有格式码;也就是说它不是纯文本的;不要使用CString;

#10


不要使用CString,因为CString遇到\0就会截断的,你要用BYTE*,unsigned char*,用二进制方式读取文件

#11


恩,但是CArchive操作符不支持<<或>>不支持byte*或char*,只支持单字节,与CSocketFile联用,单字节传输也太慢了吧?

#12


A CSocketFile can  also be used as a (limited) file without a CArchive object. By default, the CSocketFile constructor’s bArchiveCompatible parameter is TRUE. This specifies that the file object is for use with an archive. To use the file object without an archive, pass FALSE in the bArchiveCompatible parameter.

#13


这个到没注意看,我试一下

#14


该回复于2011-03-07 13:20:14被版主删除

#15


初学socket,不要用MFC封装的socket类,先从socket api学.后来再看mfc的,才能理解mfc对socket封装原理.

#16


learning

#17


看MSDN还是要仔细点;问题肯定能解决的