На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
  
    > При преждевременном завершении скачки файла с FTP файл не разблокируется.
      Здрасте, возникла проблема.

      Делаю обновление своей программы. Для этого новая версия качается с FTP сервера.

      Вот код скачки файла:
      ExpandedWrap disabled
        #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;
        }


      Код обработчика нажатия на кнопку "Отмена"
      ExpandedWrap disabled
        {
                EnterCriticalSection(&cs);
            fCancelUpdate = true;
            LeaveCriticalSection(&cs);
            return 0;
        }


      fCancelUpdate - флаг, нажали ли кнопку "Отмена".

      Если "Отмена" не нажимать и дать закачаться до конца - все прекрасно работает.
      Если же Прервать закачку - тоже работает, недокаченный файл удаляется, но
      Unlocker-ом видно, что файл остался заблокирован FTP-сервером =(

      WinXP, MS Visual 2008, Golden FTP Server.
        Какой файл заблокирован сервером? Ты же сам качаешь файл, клиентским кодом... Причем тут сервер? Если глюги не у тебя в программе - а на сервере, то это в другой раздел, где софт обсуждается, или в поддержку/на форум разработчиков сервера.
          Файл, который качаю. в том-то и заморочка, что если до конца дочитывать файл - ничего заблокированным не остается =)

          Но спасиб за идею - сейчас попробую с другим сервером
            Да, ошибка была на сервере.
            поставил Cerberus FTP Server.
            Но все равно как-то нехорошо происходит.
            Лог завершенной закачки:

            ExpandedWrap disabled
               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.


            И незавершенной:
            ExpandedWrap disabled
              .....
              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.


            Но файл не остается занятым сервером. :)
            Сообщение отредактировано: mYziK -
              Цитата mYziK @
              Файл, который качаю.

              Есть два файла - первый лежит на FTP, второй - тот, в который пишется то, что скачивается с FTP. Если со вторым проблем нет, то по поводу кода тут и обсуждать нечего, т.к. все остальное - это серверные проблемы с установкой/конфигурацией ПО.
                Спасибо!
                п.с. Golden FTP даже не сконфигурируешь, прост до безобразия :)
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0546 ]   [ 16 queries used ]   [ Generated: 10.05.24, 10:48 GMT ]