004
13.09.2002, 18:36 Uhr
Uwe
C/C++ Master (Administrator)
|
Hallo Leif, habe mich auch, nach einigem Hin- und Her dazu entschlossen, die Sache über FTP zu machen. Per HTTP ist die Sache "mords" störanfällig. Das Bsp. nutzt die Standardverbindung, die Trennen-Routine würde ich über die RAS Funktion aus meinem Bsp. unter VC++ machen, da die Standardverbindung sich mit dem Beenden schwer tut.
C++: |
void CFor_LeifDlg::OnDownload() { /* zusätzlich benötigte Elemente: Dialog IDD_PROGRESS auf diesem: Fortschrittsanzeige IDC_IDC_PROGRESS Statisches Textfeld IDC_STATUS */ CString sMsg; CProgressdlg dlg; dlg.Create( IDD_PROGRESS, this ); dlg.ShowWindow(SW_SHOW);
CString ServerName= "www.fun-soft.de"; CString UserName= "******"; //mache hier eine Weichcodierung, die ist in einem Debugger nicht auszumachen! CString Password= "******"; CString RemoteFile= "/web/Download/Verbindung/verbindung.zip"; CString LocalFile= "c: \\verbindung.zip";
CInternetSession session("My FTP Session");
sMsg.Format("Verbinde mit: %s...", (LPCSTR)ServerName ); dlg.SetDlgItemText( IDC_STATUS, sMsg );
CFtpConnection* pConn=session.GetFtpConnection( ServerName, UserName, Password );
DWORD nErr= GetLastError(); if ( nErr ){ sMsg.Format( "%d",nErr ); AfxMessageBox( sMsg ); return; } CInternetFile* pfRemoteFile= pConn->OpenFile( RemoteFile, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, 1 );
CFile fLocalFile; BOOL fRet= fLocalFile.Open(LocalFile, CFile::modeCreate | CFile::modeWrite ); if ( fRet == FALSE ){ sMsg.Format("Error opening/creating target file \n'%s'", (LPCSTR)LocalFile ); AfxMessageBox( sMsg ); return; }
dlg.m_ctlProcress.SetRange32(0,100); int nCurProgress= 0; int nMaxProgress= 10000; int nTargetPct= 25; int nLargestPct= 0; char inBuf[512]; while( TRUE ){ UINT nActual= pfRemoteFile->Read( inBuf, 512 ); fLocalFile.Write(inBuf, nActual ); nCurProgress += nActual; int nPct= nCurProgress*100 / nMaxProgress; if ( nPct > nTargetPct ){ nMaxProgress= nCurProgress + (nCurProgress/2); nTargetPct += 2; if (nTargetPct > 98 ){ nTargetPct= 99; } } nPct= nCurProgress*100 / nMaxProgress; if ( nLargestPct < nPct ) nLargestPct= nPct; if ( nPct < nLargestPct ) nPct= nLargestPct; dlg.m_ctlProcress.SetPos( nPct );
sMsg.Format("Received: %d bytes", nCurProgress ); dlg.SetDlgItemText( IDC_STATUS, sMsg );
if (nActual != 512 ) { dlg.m_ctlProcress.SetPos( nMaxProgress ); dlg.SetDlgItemText( IDC_STATUS, "Fertig !" ); break; } } Sleep(2000); // Ergebnis 2 Sek. halten, dann raus }
|
-- "Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."
Bis dann... Uwe Dieser Post wurde am 13.09.2002 um 18:37 Uhr von Uwe editiert. |