Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.225.31.77] |
|
Сообщ.
#1
,
|
|
|
Здрасте, возникла проблема.
Делаю обновление своей программы. Для этого новая версия качается с FTP сервера. Вот код скачки файла: #define MAX_BUFFER_SIZE 4096 extern CRITICAL_SECTION cs; extern bool fCancelUpdate; UINT DownloadUpdate(LPCWSTR host, LPWSTR lpFileName, UINT uLength) { UINT err = 0; HINTERNET hInternetFile = 0; HANDLE hThread; vector<BYTE> buffer; buffer.resize(MAX_BUFFER_SIZE); HANDLE f; HINTERNET hInternet = InternetOpen (L"Update agent",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL, 0); if (!hInternet) { return IDS_NOINTERNETCONNECTION; } hInternetFile = InternetConnect(hInternet, host, INTERNET_DEFAULT_FTP_PORT, L"anonymous", L"guest", INTERNET_SERVICE_FTP, 0, (DWORD)0); if(hInternetFile) { FtpSetCurrentDirectory(hInternetFile,L"SHARE"); DWORD ThreadId; WIN32_FIND_DATA wf; ZeroMemory(&wf,sizeof(wf)); HINTERNET hi; DWORD FileSizeH=0; DWORD FileSize=0; UINT PrevPercent=0; HINTERNET hFile = FtpOpenFile(hInternetFile, L"filename.exe", GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, 0); if(!hFile) { InternetCloseHandle(hInternet); InternetCloseHandle(hInternetFile); err = IDS_FAILDOWNLOAD; } if(!err) { FileSize = FtpGetFileSize(hFile,&FileSizeH); if(FileSizeH) { FileSize+=FileSizeH*MAXDWORD; } f = CreateFile(lpFileName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); if(f==INVALID_HANDLE_VALUE) { InternetCloseHandle(hFile); InternetCloseHandle(hInternet); InternetCloseHandle(hInternetFile); err = IDS_FAILDOWNLOAD; } DWORD dwBytesRead = 0; DWORD bufsize = MAX_BUFFER_SIZE; DWORD burwrite = 0; while(bufsize > 0) { EnterCriticalSection(&cs); if(fCancelUpdate) { LeaveCriticalSection(&cs); break; } LeaveCriticalSection(&cs); if(!InternetReadFile(hFile, &buffer[0], MAX_BUFFER_SIZE, &bufsize)) { err = IDS_FAILDOWNLOAD; break; } if(bufsize > 0 && bufsize <= MAX_BUFFER_SIZE) { WriteFile(f,&buffer[0],bufsize,&burwrite,0); if(burwrite != bufsize) { err = IDS_FAILDOWNLOAD; break; } dwBytesRead += bufsize; if((dwBytesRead*100)/(FileSize?FileSize:1)!=PrevPercent) { PrevPercent = (dwBytesRead*100)/(FileSize?FileSize:1); SendMessage(wnd.ProgressUpdate.m_hWnd,WM_SETPROGRESSVALUE,(WPARAM)PrevPercent,0); } } } } CloseHandle(f); InternetCloseHandle(hFile); InternetCloseHandle(hInternet); InternetCloseHandle(hInternetFile); EnterCriticalSection(&cs); if(fCancelUpdate) { DeleteFile(lpFileName); err = IDS_UPDATECANCELED; fCancelUpdate = false; } LeaveCriticalSection(&cs); } else err = IDS_FILENOTFOUND; } else err = IDS_FAILCONNECT; return err; } Код обработчика нажатия на кнопку "Отмена" { EnterCriticalSection(&cs); fCancelUpdate = true; LeaveCriticalSection(&cs); return 0; } fCancelUpdate - флаг, нажали ли кнопку "Отмена". Если "Отмена" не нажимать и дать закачаться до конца - все прекрасно работает. Если же Прервать закачку - тоже работает, недокаченный файл удаляется, но Unlocker-ом видно, что файл остался заблокирован FTP-сервером =( WinXP, MS Visual 2008, Golden FTP Server. |
Сообщ.
#2
,
|
|
|
Какой файл заблокирован сервером? Ты же сам качаешь файл, клиентским кодом... Причем тут сервер? Если глюги не у тебя в программе - а на сервере, то это в другой раздел, где софт обсуждается, или в поддержку/на форум разработчиков сервера.
|
Сообщ.
#3
,
|
|
|
Файл, который качаю. в том-то и заморочка, что если до конца дочитывать файл - ничего заблокированным не остается =)
Но спасиб за идею - сейчас попробую с другим сервером |
Сообщ.
#4
,
|
|
|
Да, ошибка была на сервере.
поставил Cerberus FTP Server. Но все равно как-то нехорошо происходит. Лог завершенной закачки: Incoming connection request on interface 10.3.0.13 20090827132150 [7] Connection request accepted from 10.3.0.13 20090827132150 [7] USER anonymous 20090827132150 [7] 331 User anonymous, password please 20090827132150 [7] PASS *********** 20090827132150 [7] Anonymous user 'anonymous' logged in with password 'guest' 20090827132150 [7] 230 Password Ok, User logged in 20090827132150 [7] PWD 20090827132150 [7] 257 "/" is the current directory 20090827132150 [7] CWD SHARE 20090827132150 [7] 250 Change directory ok 20090827132150 [7] TYPE A 20090827132150 [7] 200 Type ASCII 20090827132150 [7] PORT 10,3,0,13,6,4 20090827132150 [7] 200 Port command received 20090827132150 [7] LIST filename.exe 20090827132150 [7] 150 Opening data connection 20090827132150 [7] 226 Transfer complete 20090827132150 [7] TYPE I 20090827132150 [7] 200 Type Binary 20090827132150 [7] PORT 10,3,0,13,6,5 20090827132150 [7] 200 Port command received 20090827132150 [7] SIZE filename.exe 20090827132150 [7] 213 17044992 20090827132150 [7] RETR filename.exe 20090827132150 [7] 150 Opening data connection 20090827132150 [7] File transfer complete 20090827132150 [7] 226 Transfer complete 20090827132151 [7] The client closed the connection 20090827132151 [7] Connection terminated. И незавершенной: ..... 20090827134038 [9] TYPE I 20090827134038 [9] 200 Type Binary 20090827134038 [9] PORT 10,3,0,13,6,51 20090827134038 [9] 200 Port command received 20090827134038 [9] SIZE filename.exe 20090827134038 [9] 213 17044992 20090827134038 [9] RETR filename.exe 20090827134038 [9] 150 Opening data connection 20090827134040 [9] An existing connection was forcibly closed by the remote host. 20090827134040 [9] 550 File transfer failed 20090827134040 [9] The client closed the connection 20090827134040 [9] Connection terminated. Но файл не остается занятым сервером. |
Сообщ.
#5
,
|
|
|
Цитата mYziK @ Файл, который качаю. Есть два файла - первый лежит на FTP, второй - тот, в который пишется то, что скачивается с FTP. Если со вторым проблем нет, то по поводу кода тут и обсуждать нечего, т.к. все остальное - это серверные проблемы с установкой/конфигурацией ПО. |
Сообщ.
#6
,
|
|
|
Спасибо!
п.с. Golden FTP даже не сконфигурируешь, прост до безобразия |