大神帮帮我,如何读取服务器上的文件

时间:2022-07-25 14:10:13
从本地打开文件在网页表示已经可以实现了,现在想改成打开服务器上的一个文件显示在网页上,这个如何实现?

服务器上文件的路径已经知道,172.168.1.1\temp\temp.xcp

13 个解决方案

#1


在你的基础上,获取打开文件的在磁盘的临时文件,从临时文件中读取;

#2


引用 1 楼 brk1985 的回复:
在你的基础上,获取打开文件的在磁盘的临时文件,从临时文件中读取;


现在要求不让读取本地临时文件了,让直接从服务器上读取,这个能实现吗?

#3


引用 2 楼 kilo1220 的回复:
Quote: 引用 1 楼 brk1985 的回复:

在你的基础上,获取打开文件的在磁盘的临时文件,从临时文件中读取;


现在要求不让读取本地临时文件了,让直接从服务器上读取,这个能实现吗?


应该可以实现的。。。给http服务器发送命令,对回过来的数据进行解析即可。。。以下代码供参考,pageBuf 保存服务器回过来的数据。。。



//使用Get请求,得到响应
bool GetHttpResponse( const string & url, char * &response, int &bytesRead ){
string host="172.168.1.1";
string resource="temp/temp.xcp";

//建立socket
struct hostent * hp= gethostbyname( host.c_str() );
if( hp==NULL ){
cout<< "Can not find host address"<<endl;
return false;
}

SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);
if( sock == -1 || sock == -2 ){
cout << "Can not create sock."<<endl;
return false;
}

//建立服务器地址
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_port = htons( 80 );
//char addr[5];
//memcpy( addr, hp->h_addr, 4 );
//sa.sin_addr.s_addr = inet_addr(hp->h_addr);
memcpy( &sa.sin_addr, hp->h_addr, 4 );

//建立连接
if( 0!= connect( sock, (SOCKADDR*)&sa, sizeof(sa) ) ){
cout << "Can not connect: "<< url <<endl;
closesocket(sock);
return false;
};

//准备发送数据
string request = "GET " + resource + " HTTP/1.1\r\nHost:" + host + "\r\nConnection:Close\r\n\r\n";

//发送数据
if( SOCKET_ERROR ==send( sock, request.c_str(), request.size(), 0 ) ){
cout << "send error" <<endl;
closesocket( sock );
return false;
}

//接收数据
int m_nContentLength = DEFAULT_PAGE_BUF_SIZE;
char *pageBuf = (char *)malloc(m_nContentLength);
memset(pageBuf, 0, m_nContentLength);

bytesRead = 0;
int ret = 1;
cout <<"Read: ";
while(ret > 0){
ret = recv(sock, pageBuf + bytesRead, m_nContentLength - bytesRead, 0);

if(ret > 0)
{
bytesRead += ret;
}

if( m_nContentLength - bytesRead<100){
cout << "\nRealloc memorry"<<endl;
m_nContentLength *=2;
pageBuf = (char*)realloc( pageBuf, m_nContentLength);       //重新分配内存
}
cout << ret <<" ";
}
cout <<endl;

pageBuf[bytesRead] = '\0';
response = pageBuf;
closesocket( sock );
return true;
//cout<< response <<endl;
}

#4


服务器上装IIS

#5


求帮助呀求帮助~

#6


引用 4 楼 hdt 的回复:
服务器上装IIS


只装上IIS就可以跟读本地文件一样读取了吗?

#7


可以用socket,一个服务器端程序,一个客户端程序,或者用CInternetSession::OpenURL() 服务器是Web服务器

#8


引用 3 楼 brk1985 的回复:
Quote: 引用 2 楼 kilo1220 的回复:

Quote: 引用 1 楼 brk1985 的回复:

在你的基础上,获取打开文件的在磁盘的临时文件,从临时文件中读取;


现在要求不让读取本地临时文件了,让直接从服务器上读取,这个能实现吗?


应该可以实现的。。。给http服务器发送命令,对回过来的数据进行解析即可。。。以下代码供参考,pageBuf 保存服务器回过来的数据。。。



//使用Get请求,得到响应
bool GetHttpResponse( const string & url, char * &response, int &bytesRead ){
string host="172.168.1.1";
string resource="temp/temp.xcp";

//建立socket
struct hostent * hp= gethostbyname( host.c_str() );
if( hp==NULL ){
cout<< "Can not find host address"<<endl;
return false;
}

SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);
if( sock == -1 || sock == -2 ){
cout << "Can not create sock."<<endl;
return false;
}

//建立服务器地址
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_port = htons( 80 );
//char addr[5];
//memcpy( addr, hp->h_addr, 4 );
//sa.sin_addr.s_addr = inet_addr(hp->h_addr);
memcpy( &sa.sin_addr, hp->h_addr, 4 );

//建立连接
if( 0!= connect( sock, (SOCKADDR*)&sa, sizeof(sa) ) ){
cout << "Can not connect: "<< url <<endl;
closesocket(sock);
return false;
};

//准备发送数据
string request = "GET " + resource + " HTTP/1.1\r\nHost:" + host + "\r\nConnection:Close\r\n\r\n";

//发送数据
if( SOCKET_ERROR ==send( sock, request.c_str(), request.size(), 0 ) ){
cout << "send error" <<endl;
closesocket( sock );
return false;
}

//接收数据
int m_nContentLength = DEFAULT_PAGE_BUF_SIZE;
char *pageBuf = (char *)malloc(m_nContentLength);
memset(pageBuf, 0, m_nContentLength);

bytesRead = 0;
int ret = 1;
cout <<"Read: ";
while(ret > 0){
ret = recv(sock, pageBuf + bytesRead, m_nContentLength - bytesRead, 0);

if(ret > 0)
{
bytesRead += ret;
}

if( m_nContentLength - bytesRead<100){
cout << "\nRealloc memorry"<<endl;
m_nContentLength *=2;
pageBuf = (char*)realloc( pageBuf, m_nContentLength);       //重新分配内存
}
cout << ret <<" ";
}
cout <<endl;

pageBuf[bytesRead] = '\0';
response = pageBuf;
closesocket( sock );
return true;
//cout<< response <<endl;
}


有没有不使用SOCKET的方法?

#9


引用 7 楼 VisualEleven 的回复:
可以用socket,一个服务器端程序,一个客户端程序,或者用CInternetSession::OpenURL() 服务器是Web服务器



若使用CInternetSession::OpenURL() 的话,是不是服务器要装IIS?

#10


大家帮帮忙吧 小弟第一次做MFC的项目,帮忙写个简单的例子吧。这个问题研究了好几天都没有成果。。

#11


引用 10 楼 kilo1220 的回复:
大家帮帮忙吧 小弟第一次做MFC的项目,帮忙写个简单的例子吧。这个问题研究了好几天都没有成果。。



UINT DownloadFile(LPVOID pParam)
{
CWnd* pwnd = AfxGetMainWnd();
CProgressCtrl* m_Prog = (CProgressCtrl*)pwnd->GetDlgItem(IDC_PROGRESS1);
CButton* bStart = (CButton*)pwnd->GetDlgItem(IDB_BTN_START);

char filebuf[512];
CInternetSession netSession;
CStdioFile *fTargFile;
int outfs;
CString szFile,FileSize,KBin,KBsec,NewName,Perc;

try
{
pwnd->GetDlgItemText(IDC_EDIT1,szFile);
pwnd->SetDlgItemText(IDC_STAT,"ÕýÔÚУÑéÏÂÔصØÖ·...");
fTargFile = netSession.OpenURL(szFile,1,INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
nDownloaded = 1;

COleDateTime dlStart = COleDateTime::GetCurrentTime();
int filesize = fTargFile->SeekToEnd();
fTargFile->SeekToBegin();
outfs = filesize / 1024; // ¼ÆËãÎļþ´óС£¨Ç§×Ö½Ú£©
FileSize.Format("%d",outfs); // ÒÔKBΪµ¥Î»¸ñʽÎļþ´óС

// ÔÚµ±Ç°Ä¿Â¼´´½¨ÐµÄÄ¿±êÎļþ
CFile fDestFile(fTargFile->GetFileName(), CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
int byteswrite; // Ð´ÈëÎļþµÄ×Ö½ÚÊý
int pos = 0; // µ±Ç°½ø¶ÈÌõµÄλÖÃ
int nperc,kbrecv; // ½ø¶ÈÌõµÄ°Ù·Ö±È,»ñÈ¡µ½µÄÊý¾Ý´óС£¨KbsΪµ¥Î»£©
double secs,kbsec; // ¼Ç¼ÃëÊý, Ëٶȣ¨KB/Ã룩

// Èç¹ûÎļþÃûÌ«³¤£¬Ëõ¶Ì´°¿ÚµÄ±êÌâ²¢ÔÚ״̬ÏÔʾ
NewName = fTargFile->GetFileName(); // »ñÈ¡ÐÂÎļþÃû

if(fTargFile->GetFileName().GetLength() >= 10)
{
NewName = fTargFile->GetFileName().Mid(0,7); // ·Ö¸îÎļþ
NewName = NewName + "...";
}

pwnd->SetDlgItemText(IDC_STAT,"ÕýÔÚÏÂÔØ...");
m_Prog->SetRange32(0,filesize);

while (byteswrite = fTargFile->Read(filebuf, 512)) // ¶ÁÈ¡Îļþ
{
if(nTerminate == 1) // Èç¹ûµã»÷È¡ÏûÏÂÔØ
{
fDestFile.Close(); // ¹Ø±ÕÎÒÃǵÄÄ¿±êÎļþ
fTargFile->Close(); // ¹Ø±ÕÔ¶³ÌÎļþ
delete fTargFile; // É¾³ýCStdioFile¶ÔÏó£¬ÒÔ·Àֹй©
pwnd->SetDlgItemText(IDC_STAT,"ÏÂÔØʱÒѱ»Óû§È¡Ïû£¡"); // Set satus bar text
AfxEndThread(0); // ½áÊøÏÂÔØÏß³Ì
}

// ¸ù¾Ý¿ªÊ¼Ê±¼äÓ뵱ǰʱ¼ä±È½Ï£¬»ñÈ¡ÃëÊý
COleDateTimeSpan dlElapsed = COleDateTime::GetCurrentTime() - dlStart;
secs = dlElapsed.GetTotalSeconds();
pos = pos + byteswrite; // ÉèÖÃеĽø¶ÈÌõλÖÃ
fDestFile.Write(filebuf, byteswrite); // ½«Êµ¼ÊÊý¾ÝдÈëÎļþ
m_Prog->SetPos(pos);

nperc = pos * 100 / filesize; // ½ø¶È°Ù·Ö±È
kbrecv = pos / 1024; // »ñÈ¡ÊÕµ½µÄÊý¾Ý
kbsec = kbrecv / secs; // »ñȡÿÃëÏÂÔضàÉÙ£¨KB£©

Perc.Format("%d",nperc); // ¸ñʽ»¯½ø¶È°Ù·Ö±È
KBin.Format("%d",kbrecv); // ¸ñʽ»¯ÒÑÏÂÔØÊý¾Ý´óС£¨KB£©
KBsec.Format("%d",(int)kbsec); // ¸ñʽ»¯ÏÂÔØËٶȣ¨KB/Ã룩

pwnd->SetDlgItemText(IDC_EDIT_FILESIZE,FileSize + "KB");// Ô¶³ÌÎļþ´óС
pwnd->SetDlgItemText(IDC_EDIT_SIZEOK,KBin + "KB"); // ÒÑÏÂÔØ´óС
pwnd->SetDlgItemText(IDC_EDIT2,KBsec + "KB/Ãë"); // ÏÂÔØËÙ¶È
pwnd->SetDlgItemText(IDC_EDIT4,Perc + "%"); // ½ø¶È°Ù·Ö±È
}
// ÏÂÔØÍê³É£¬¹Ø±ÕÎļþ
fDestFile.Close();
}

catch(CInternetException *IE)
{
CString strerror;
TCHAR error[255];

IE->GetErrorMessage(error,255); // »ñÈ¡´íÎóÏûÏ¢
strerror = error;

pwnd->SetDlgItemText(IDC_STAT,strerror);
pwnd->SetDlgItemText(IDB_BTN_STOP,"Exit");
nDownloaded = 0;
delete fTargFile;
IE->Delete(); // É¾³ýÒì³£¶ÔÏó£¬ÒÔ·Àֹй©
}
// »Ö¸´Ä¬ÈÏ
pwnd->SetDlgItemText(IDC_EDIT2,"Kb/Ãë");
pwnd->SetDlgItemText(IDC_EDIT3,"Loading...");
pwnd->SetDlgItemText(IDC_EDIT4,"0%");

delete fTargFile;
if(nDownloaded == 1)
{
pwnd->SetDlgItemText(IDC_STAT,"ÏÂÔØÍê³É£¡");
bStart->EnableWindow(TRUE);
}
return 0;
}


VC下载文件显示进度条,就是根据服务器地址通过netSession.OpenURL获取服务器文件信息。。。
http://download.csdn.net/detail/Q5914002/1771650

#12


引用 9 楼 kilo1220 的回复:
Quote: 引用 7 楼 VisualEleven 的回复:

可以用socket,一个服务器端程序,一个客户端程序,或者用CInternetSession::OpenURL() 服务器是Web服务器



若使用CInternetSession::OpenURL() 的话,是不是服务器要装IIS?


肯定需要有服务器的,不一定就是IIS。。。没有开启服务器,肯定连接不上你那个文件的,也就更谈不上读取文件信息了。。。

#13


FTP Server

#1


在你的基础上,获取打开文件的在磁盘的临时文件,从临时文件中读取;

#2


引用 1 楼 brk1985 的回复:
在你的基础上,获取打开文件的在磁盘的临时文件,从临时文件中读取;


现在要求不让读取本地临时文件了,让直接从服务器上读取,这个能实现吗?

#3


引用 2 楼 kilo1220 的回复:
Quote: 引用 1 楼 brk1985 的回复:

在你的基础上,获取打开文件的在磁盘的临时文件,从临时文件中读取;


现在要求不让读取本地临时文件了,让直接从服务器上读取,这个能实现吗?


应该可以实现的。。。给http服务器发送命令,对回过来的数据进行解析即可。。。以下代码供参考,pageBuf 保存服务器回过来的数据。。。



//使用Get请求,得到响应
bool GetHttpResponse( const string & url, char * &response, int &bytesRead ){
string host="172.168.1.1";
string resource="temp/temp.xcp";

//建立socket
struct hostent * hp= gethostbyname( host.c_str() );
if( hp==NULL ){
cout<< "Can not find host address"<<endl;
return false;
}

SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);
if( sock == -1 || sock == -2 ){
cout << "Can not create sock."<<endl;
return false;
}

//建立服务器地址
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_port = htons( 80 );
//char addr[5];
//memcpy( addr, hp->h_addr, 4 );
//sa.sin_addr.s_addr = inet_addr(hp->h_addr);
memcpy( &sa.sin_addr, hp->h_addr, 4 );

//建立连接
if( 0!= connect( sock, (SOCKADDR*)&sa, sizeof(sa) ) ){
cout << "Can not connect: "<< url <<endl;
closesocket(sock);
return false;
};

//准备发送数据
string request = "GET " + resource + " HTTP/1.1\r\nHost:" + host + "\r\nConnection:Close\r\n\r\n";

//发送数据
if( SOCKET_ERROR ==send( sock, request.c_str(), request.size(), 0 ) ){
cout << "send error" <<endl;
closesocket( sock );
return false;
}

//接收数据
int m_nContentLength = DEFAULT_PAGE_BUF_SIZE;
char *pageBuf = (char *)malloc(m_nContentLength);
memset(pageBuf, 0, m_nContentLength);

bytesRead = 0;
int ret = 1;
cout <<"Read: ";
while(ret > 0){
ret = recv(sock, pageBuf + bytesRead, m_nContentLength - bytesRead, 0);

if(ret > 0)
{
bytesRead += ret;
}

if( m_nContentLength - bytesRead<100){
cout << "\nRealloc memorry"<<endl;
m_nContentLength *=2;
pageBuf = (char*)realloc( pageBuf, m_nContentLength);       //重新分配内存
}
cout << ret <<" ";
}
cout <<endl;

pageBuf[bytesRead] = '\0';
response = pageBuf;
closesocket( sock );
return true;
//cout<< response <<endl;
}

#4


服务器上装IIS

#5


求帮助呀求帮助~

#6


引用 4 楼 hdt 的回复:
服务器上装IIS


只装上IIS就可以跟读本地文件一样读取了吗?

#7


可以用socket,一个服务器端程序,一个客户端程序,或者用CInternetSession::OpenURL() 服务器是Web服务器

#8


引用 3 楼 brk1985 的回复:
Quote: 引用 2 楼 kilo1220 的回复:

Quote: 引用 1 楼 brk1985 的回复:

在你的基础上,获取打开文件的在磁盘的临时文件,从临时文件中读取;


现在要求不让读取本地临时文件了,让直接从服务器上读取,这个能实现吗?


应该可以实现的。。。给http服务器发送命令,对回过来的数据进行解析即可。。。以下代码供参考,pageBuf 保存服务器回过来的数据。。。



//使用Get请求,得到响应
bool GetHttpResponse( const string & url, char * &response, int &bytesRead ){
string host="172.168.1.1";
string resource="temp/temp.xcp";

//建立socket
struct hostent * hp= gethostbyname( host.c_str() );
if( hp==NULL ){
cout<< "Can not find host address"<<endl;
return false;
}

SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);
if( sock == -1 || sock == -2 ){
cout << "Can not create sock."<<endl;
return false;
}

//建立服务器地址
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_port = htons( 80 );
//char addr[5];
//memcpy( addr, hp->h_addr, 4 );
//sa.sin_addr.s_addr = inet_addr(hp->h_addr);
memcpy( &sa.sin_addr, hp->h_addr, 4 );

//建立连接
if( 0!= connect( sock, (SOCKADDR*)&sa, sizeof(sa) ) ){
cout << "Can not connect: "<< url <<endl;
closesocket(sock);
return false;
};

//准备发送数据
string request = "GET " + resource + " HTTP/1.1\r\nHost:" + host + "\r\nConnection:Close\r\n\r\n";

//发送数据
if( SOCKET_ERROR ==send( sock, request.c_str(), request.size(), 0 ) ){
cout << "send error" <<endl;
closesocket( sock );
return false;
}

//接收数据
int m_nContentLength = DEFAULT_PAGE_BUF_SIZE;
char *pageBuf = (char *)malloc(m_nContentLength);
memset(pageBuf, 0, m_nContentLength);

bytesRead = 0;
int ret = 1;
cout <<"Read: ";
while(ret > 0){
ret = recv(sock, pageBuf + bytesRead, m_nContentLength - bytesRead, 0);

if(ret > 0)
{
bytesRead += ret;
}

if( m_nContentLength - bytesRead<100){
cout << "\nRealloc memorry"<<endl;
m_nContentLength *=2;
pageBuf = (char*)realloc( pageBuf, m_nContentLength);       //重新分配内存
}
cout << ret <<" ";
}
cout <<endl;

pageBuf[bytesRead] = '\0';
response = pageBuf;
closesocket( sock );
return true;
//cout<< response <<endl;
}


有没有不使用SOCKET的方法?

#9


引用 7 楼 VisualEleven 的回复:
可以用socket,一个服务器端程序,一个客户端程序,或者用CInternetSession::OpenURL() 服务器是Web服务器



若使用CInternetSession::OpenURL() 的话,是不是服务器要装IIS?

#10


大家帮帮忙吧 小弟第一次做MFC的项目,帮忙写个简单的例子吧。这个问题研究了好几天都没有成果。。

#11


引用 10 楼 kilo1220 的回复:
大家帮帮忙吧 小弟第一次做MFC的项目,帮忙写个简单的例子吧。这个问题研究了好几天都没有成果。。



UINT DownloadFile(LPVOID pParam)
{
CWnd* pwnd = AfxGetMainWnd();
CProgressCtrl* m_Prog = (CProgressCtrl*)pwnd->GetDlgItem(IDC_PROGRESS1);
CButton* bStart = (CButton*)pwnd->GetDlgItem(IDB_BTN_START);

char filebuf[512];
CInternetSession netSession;
CStdioFile *fTargFile;
int outfs;
CString szFile,FileSize,KBin,KBsec,NewName,Perc;

try
{
pwnd->GetDlgItemText(IDC_EDIT1,szFile);
pwnd->SetDlgItemText(IDC_STAT,"ÕýÔÚУÑéÏÂÔصØÖ·...");
fTargFile = netSession.OpenURL(szFile,1,INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
nDownloaded = 1;

COleDateTime dlStart = COleDateTime::GetCurrentTime();
int filesize = fTargFile->SeekToEnd();
fTargFile->SeekToBegin();
outfs = filesize / 1024; // ¼ÆËãÎļþ´óС£¨Ç§×Ö½Ú£©
FileSize.Format("%d",outfs); // ÒÔKBΪµ¥Î»¸ñʽÎļþ´óС

// ÔÚµ±Ç°Ä¿Â¼´´½¨ÐµÄÄ¿±êÎļþ
CFile fDestFile(fTargFile->GetFileName(), CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
int byteswrite; // Ð´ÈëÎļþµÄ×Ö½ÚÊý
int pos = 0; // µ±Ç°½ø¶ÈÌõµÄλÖÃ
int nperc,kbrecv; // ½ø¶ÈÌõµÄ°Ù·Ö±È,»ñÈ¡µ½µÄÊý¾Ý´óС£¨KbsΪµ¥Î»£©
double secs,kbsec; // ¼Ç¼ÃëÊý, Ëٶȣ¨KB/Ã룩

// Èç¹ûÎļþÃûÌ«³¤£¬Ëõ¶Ì´°¿ÚµÄ±êÌâ²¢ÔÚ״̬ÏÔʾ
NewName = fTargFile->GetFileName(); // »ñÈ¡ÐÂÎļþÃû

if(fTargFile->GetFileName().GetLength() >= 10)
{
NewName = fTargFile->GetFileName().Mid(0,7); // ·Ö¸îÎļþ
NewName = NewName + "...";
}

pwnd->SetDlgItemText(IDC_STAT,"ÕýÔÚÏÂÔØ...");
m_Prog->SetRange32(0,filesize);

while (byteswrite = fTargFile->Read(filebuf, 512)) // ¶ÁÈ¡Îļþ
{
if(nTerminate == 1) // Èç¹ûµã»÷È¡ÏûÏÂÔØ
{
fDestFile.Close(); // ¹Ø±ÕÎÒÃǵÄÄ¿±êÎļþ
fTargFile->Close(); // ¹Ø±ÕÔ¶³ÌÎļþ
delete fTargFile; // É¾³ýCStdioFile¶ÔÏó£¬ÒÔ·Àֹй©
pwnd->SetDlgItemText(IDC_STAT,"ÏÂÔØʱÒѱ»Óû§È¡Ïû£¡"); // Set satus bar text
AfxEndThread(0); // ½áÊøÏÂÔØÏß³Ì
}

// ¸ù¾Ý¿ªÊ¼Ê±¼äÓ뵱ǰʱ¼ä±È½Ï£¬»ñÈ¡ÃëÊý
COleDateTimeSpan dlElapsed = COleDateTime::GetCurrentTime() - dlStart;
secs = dlElapsed.GetTotalSeconds();
pos = pos + byteswrite; // ÉèÖÃеĽø¶ÈÌõλÖÃ
fDestFile.Write(filebuf, byteswrite); // ½«Êµ¼ÊÊý¾ÝдÈëÎļþ
m_Prog->SetPos(pos);

nperc = pos * 100 / filesize; // ½ø¶È°Ù·Ö±È
kbrecv = pos / 1024; // »ñÈ¡ÊÕµ½µÄÊý¾Ý
kbsec = kbrecv / secs; // »ñȡÿÃëÏÂÔضàÉÙ£¨KB£©

Perc.Format("%d",nperc); // ¸ñʽ»¯½ø¶È°Ù·Ö±È
KBin.Format("%d",kbrecv); // ¸ñʽ»¯ÒÑÏÂÔØÊý¾Ý´óС£¨KB£©
KBsec.Format("%d",(int)kbsec); // ¸ñʽ»¯ÏÂÔØËٶȣ¨KB/Ã룩

pwnd->SetDlgItemText(IDC_EDIT_FILESIZE,FileSize + "KB");// Ô¶³ÌÎļþ´óС
pwnd->SetDlgItemText(IDC_EDIT_SIZEOK,KBin + "KB"); // ÒÑÏÂÔØ´óС
pwnd->SetDlgItemText(IDC_EDIT2,KBsec + "KB/Ãë"); // ÏÂÔØËÙ¶È
pwnd->SetDlgItemText(IDC_EDIT4,Perc + "%"); // ½ø¶È°Ù·Ö±È
}
// ÏÂÔØÍê³É£¬¹Ø±ÕÎļþ
fDestFile.Close();
}

catch(CInternetException *IE)
{
CString strerror;
TCHAR error[255];

IE->GetErrorMessage(error,255); // »ñÈ¡´íÎóÏûÏ¢
strerror = error;

pwnd->SetDlgItemText(IDC_STAT,strerror);
pwnd->SetDlgItemText(IDB_BTN_STOP,"Exit");
nDownloaded = 0;
delete fTargFile;
IE->Delete(); // É¾³ýÒì³£¶ÔÏó£¬ÒÔ·Àֹй©
}
// »Ö¸´Ä¬ÈÏ
pwnd->SetDlgItemText(IDC_EDIT2,"Kb/Ãë");
pwnd->SetDlgItemText(IDC_EDIT3,"Loading...");
pwnd->SetDlgItemText(IDC_EDIT4,"0%");

delete fTargFile;
if(nDownloaded == 1)
{
pwnd->SetDlgItemText(IDC_STAT,"ÏÂÔØÍê³É£¡");
bStart->EnableWindow(TRUE);
}
return 0;
}


VC下载文件显示进度条,就是根据服务器地址通过netSession.OpenURL获取服务器文件信息。。。
http://download.csdn.net/detail/Q5914002/1771650

#12


引用 9 楼 kilo1220 的回复:
Quote: 引用 7 楼 VisualEleven 的回复:

可以用socket,一个服务器端程序,一个客户端程序,或者用CInternetSession::OpenURL() 服务器是Web服务器



若使用CInternetSession::OpenURL() 的话,是不是服务器要装IIS?


肯定需要有服务器的,不一定就是IIS。。。没有开启服务器,肯定连接不上你那个文件的,也就更谈不上读取文件信息了。。。

#13


FTP Server