关于CFtpConnection同时下载文件的有关问题
关于CFtpConnection同时下载文件的问题
这是我的下载函数 用按钮控制启动线程下载 问题是当一个文件没有下载完成 也就是FtpFile->Close()没执行的时候,再点击按钮开线程下载会导致m_pFtpCon->OpenFile(sourcepath)异常。
我目前的解决办法是每次开线程都重新
m_pFtpCon = m_InternetSession->GetFtpConnection(ip, user, passwd, port);一次,这样可以解决问题。
但是不知道好不好。请问有别的方法实现吗?FTP客户端软件又是如何实现的呢?
------解决方案--------------------
那你就全部用栈变量吧,不要使用成员变量了,否则需要加入线程保护的。
- C/C++ code
#define DL_BUFFER_SIZE 4096 #define PROGRESS_REPORT WM_USER + 1 BOOL CFtpClient::Download(CString sourcename, CString destpath, HWND hwnd) { CString sourcepath; BOOL bl = FindFile(sourcename, sourcepath); if (bl == FALSE) { return FALSE; } CInternetFile* FtpFile = m_pFtpCon->OpenFile(sourcepath); CFile LocalFile; if(LocalFile.Open(destpath, CFile::modeCreate | CFile::modeWrite, NULL) == FALSE) { return FALSE; } char buffer[DL_BUFFER_SIZE]; unsigned int amount_read = DL_BUFFER_SIZE; unsigned int total_read = 0; while (amount_read == DL_BUFFER_SIZE) { amount_read = FtpFile->Read(buffer, DL_BUFFER_SIZE); LocalFile.Write(buffer, amount_read); PostMessage(hwnd, PROGRESS_REPORT, 0, 0); //给调用窗口发进度消息 } FtpFile->Close(); LocalFile.Close(); return TRUE; }
这是我的下载函数 用按钮控制启动线程下载 问题是当一个文件没有下载完成 也就是FtpFile->Close()没执行的时候,再点击按钮开线程下载会导致m_pFtpCon->OpenFile(sourcepath)异常。
我目前的解决办法是每次开线程都重新
m_pFtpCon = m_InternetSession->GetFtpConnection(ip, user, passwd, port);一次,这样可以解决问题。
但是不知道好不好。请问有别的方法实现吗?FTP客户端软件又是如何实现的呢?
------解决方案--------------------
那你就全部用栈变量吧,不要使用成员变量了,否则需要加入线程保护的。