CCHTMLOptimizerDlg *pWnd = (CCHTMLOptimizerDlg*)pVoid;
HINTERNET han,hanFile;
han = ::InternetOpen(_T("CoolSoft HTML Optimizer Update"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(han==NULL)
return 0;
hanFile = ::InternetOpenUrl(han,
_T("http://www.csspace.com/mainbody.html"),
NULL,
0,
INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_PRAGMA_NOCACHE,
0);
if(hanFile==NULL)
return 0;
FILE* fp = fopen("c:\\test.html","w");
if(fp==NULL){
return 0;
}
INTERNET_BUFFERS *internetBuffers;
const long BUFFER_SIZE = 4096;
char buffer[BUFFER_SIZE];
unsigned long lBytesReaded=0; while(true){
buffer[0] = '\0';
internetBuffers = new INTERNET_BUFFERS;
internetBuffers->dwStructSize = sizeof(INTERNET_BUFFERS);
internetBuffers->lpcszHeader = NULL;
internetBuffers->lpvBuffer = buffer;
internetBuffers->dwBufferLength = BUFFER_SIZE;
internetBuffers->Next = NULL;
internetBuffers->dwOffsetLow = lBytesReaded;
while(true){
::InternetReadFileEx(hanFile,internetBuffers,0,0);
CString str;
Sleep(500);
str.Format("操作指示: 字节数:%8d",lBytesReaded + BUFFER_SIZE - internetBuffers->dwBufferLength);
pWnd->pStuBar->SetText(str,4,0);
if(internetBuffers->dwBufferLength==0){
int len = strlen(buffer);
fwrite(buffer,1,len,fp);
lBytesReaded += len;
delete internetBuffers;
break;
}
}
}
fclose(fp);
pWnd->pStuBar->SetText("操作指示: 成功下载!",4,0);
::InternetCloseHandle(han);为什么我都已经删除 internetBuffers 对象了,InternetReadFileEx读数据还是不成功(第二次,也就是 internetBuffers->dwOffsetLow = 4096了,而 internetBuffers->dwBufferLength返回总是0)
HINTERNET han,hanFile;
han = ::InternetOpen(_T("CoolSoft HTML Optimizer Update"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(han==NULL)
return 0;
hanFile = ::InternetOpenUrl(han,
_T("http://www.csspace.com/mainbody.html"),
NULL,
0,
INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_PRAGMA_NOCACHE,
0);
if(hanFile==NULL)
return 0;
FILE* fp = fopen("c:\\test.html","w");
if(fp==NULL){
return 0;
}
INTERNET_BUFFERS *internetBuffers;
const long BUFFER_SIZE = 4096;
char buffer[BUFFER_SIZE];
unsigned long lBytesReaded=0; while(true){
buffer[0] = '\0';
internetBuffers = new INTERNET_BUFFERS;
internetBuffers->dwStructSize = sizeof(INTERNET_BUFFERS);
internetBuffers->lpcszHeader = NULL;
internetBuffers->lpvBuffer = buffer;
internetBuffers->dwBufferLength = BUFFER_SIZE;
internetBuffers->Next = NULL;
internetBuffers->dwOffsetLow = lBytesReaded;
while(true){
::InternetReadFileEx(hanFile,internetBuffers,0,0);
CString str;
Sleep(500);
str.Format("操作指示: 字节数:%8d",lBytesReaded + BUFFER_SIZE - internetBuffers->dwBufferLength);
pWnd->pStuBar->SetText(str,4,0);
if(internetBuffers->dwBufferLength==0){
int len = strlen(buffer);
fwrite(buffer,1,len,fp);
lBytesReaded += len;
delete internetBuffers;
break;
}
}
}
fclose(fp);
pWnd->pStuBar->SetText("操作指示: 成功下载!",4,0);
::InternetCloseHandle(han);为什么我都已经删除 internetBuffers 对象了,InternetReadFileEx读数据还是不成功(第二次,也就是 internetBuffers->dwOffsetLow = 4096了,而 internetBuffers->dwBufferLength返回总是0)
CCHTMLOptimizerDlg *pWnd = (CCHTMLOptimizerDlg*)pVoid;
HINTERNET han,hanFile;
han = ::InternetOpen(_T("CoolSoft HTML Optimizer Update"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(han==NULL)
return 0;
hanFile = ::InternetOpenUrl(han,
_T("http://www.csspace.com/mainbody.html"),
NULL,
0,
INTERNET_FLAG_PRAGMA_NOCACHE,
0);
if(hanFile==NULL)
return 0;
FILE* fp = fopen("c:\\test.txt","w");
if(fp==NULL){
return 0;
}
pWnd->pStuBar->SetText("操作指示: 正在下载资料...",4,0);
INTERNET_BUFFERS *internetBuffers;
const int BUFFER_SIZE = 2045;
TCHAR buffer[BUFFER_SIZE];
unsigned long lBytesReaded=0; buffer[0] = NULL;
internetBuffers = new INTERNET_BUFFERS;
internetBuffers->dwStructSize = sizeof(INTERNET_BUFFERS);
internetBuffers->lpcszHeader = NULL;
internetBuffers->lpvBuffer = buffer;
internetBuffers->dwBufferLength = BUFFER_SIZE;
internetBuffers->Next = NULL;
internetBuffers->dwOffsetLow = 0;
while(true){
::InternetReadFileEx(hanFile,internetBuffers,0,0);
fwrite(buffer,1,internetBuffers->dwBufferLength,fp);
memset(buffer,0,BUFFER_SIZE);
lBytesReaded += internetBuffers->dwBufferLength;
internetBuffers->dwOffsetLow = lBytesReaded;
if(internetBuffers->dwBufferLength==0)
break;
}
delete internetBuffers;
fclose(fp);
pWnd->pStuBar->SetText("操作指示: 成功下载!",4,0);
::InternetCloseHandle(han);这里的 BUFFER_SIZE 不能随便设,设为不同的值都有可能出现不同的结果(结果是读到的数据量不对,一个文件有40K可能只读取12K 或 6K 或 10K,此时只能尝试其它值,如 4095 或 1023 设为双数时通常会有上面的错误(只读到12K或...)还有,如果正常,读取的数据文本文件的换行是 0d 0d 0a 是怎么回事(此时我没试过读取NT服务器上的网页,可能是我读取的服务器的类型的原因),读取二进制文件有问题,得到的数据不正确
为什么CSDN的人气这么好,却没有人看我的贴子????真是气到家了,连发三张帖子都没人看
看一下。我使用过,一点问题都没有。而且你读取的时候使用while(true)
循环也有问题,我记得有一个flag可以表示文件是否读完。至于BUFFER_SIZE
的定义,肯定是你的程序写的有问题,我用过,可以设置为任意大小的数据。
还有,我发觉用FTP方式读取文件时在InternetSetFilePointer时返回为-1,可是GetLastError()值却是0,这是为什么?
我觉得应该是参数有误,我那 hanFile 如果前面的InternetOpen 参数不为INTERNET_OPEN_TYPE_PRECONIFG 则会打开不成功,返回也是 0
0 = ERROR_SURCESS
hanFile为NULL
以下是最终代码(主要是打开文件模式错误,所以得到的数据总是不对的 wb 与 w 的错误
CCHTMLOptimizerDlg *pWnd = (CCHTMLOptimizerDlg*)pVoid;
HINTERNET han,hanFile;
han = ::InternetOpen(_T("CoolSoft HTML Optimizer Update"),
INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(han==NULL)
return 0;
char szHead[] = "Accept: */*\r\n\r\n";
hanFile = ::InternetOpenUrl(han,
_T("http://www.csspace.com/downloads/products/chtmlzip.zip"),
szHead,
strlen(szHead),
INTERNET_FLAG_PRAGMA_NOCACHE,
0);
if(hanFile==NULL)
return 0;
FILE* fp = fopen("c:\\test.exe","wb");
if(fp==NULL){
return 0;
}
pWnd->pStuBar->SetText("操作指示: 正在下载资料...",4,0);
INTERNET_BUFFERS *internetBuffers;
const int BUFFER_SIZE = 25;
TCHAR buffer[BUFFER_SIZE];
unsigned long lBytesReaded=0; buffer[0] = NULL;
internetBuffers = new INTERNET_BUFFERS;
internetBuffers->dwStructSize = sizeof(INTERNET_BUFFERS);
internetBuffers->lpcszHeader = NULL;
internetBuffers->lpvBuffer = buffer;
internetBuffers->dwBufferLength = BUFFER_SIZE;
internetBuffers->Next = NULL;
internetBuffers->dwOffsetLow = 0;
while(true){
while(!::InternetReadFileEx(hanFile,internetBuffers,0,0)){
static int errorCount=0;
errorCount++;
if(errorCount==20){
pWnd->MessageBox("网络错误,不能下载更新文件!","失败");
fclose(fp);
return 0;
}
pWnd->pStuBar->SetText("操作指示: 网络连接出错,正在重试...",4,0);
Sleep(1000);
};
fwrite(buffer,sizeof(char),internetBuffers->dwBufferLength,fp);
memset(buffer,0,BUFFER_SIZE);
lBytesReaded += internetBuffers->dwBufferLength;
internetBuffers->dwOffsetLow = lBytesReaded;
if(internetBuffers->dwBufferLength==0)
break;
}
delete internetBuffers;
fclose(fp);
pWnd->pStuBar->SetText("操作指示: 成功下载!",4,0);
::InternetCloseHandle(han);