FTP-sessies
Met WinINet kunnen toepassingen navigeren in mappen en bestanden op een FTP-server en deze bewerken. Omdat CERN-proxy's FTP niet ondersteunen, moeten toepassingen die uitsluitend een CERN-proxy gebruiken, de functie InternetOpenUrl gebruiken. Zie Toegang tot URL's rechtstreeksvoor meer informatie over het gebruik van InternetOpenUrl.
Als u een FTP-sessie wilt starten, gebruikt u InternetConnect om de sessie-handle te maken.
Met WinINet kunt u de volgende acties uitvoeren op een FTP-server:
- Navigeren tussen mappen.
- Mappen inventariseren, maken, verwijderen en de naam ervan wijzigen.
- Bestanden een andere naam geven, uploaden, downloaden en verwijderen.
Navigatie wordt geleverd door de functies ftpGetCurrentDirectory en FtpSetCurrentDirectory. Deze functies maken gebruik van de sessiegreep die is gemaakt door een eerdere aanroep naar InternetConnect om te bepalen in welke map de toepassing zich momenteel bevindt of om over te schakelen naar een andere submap.
Directory-inventarisatie wordt uitgevoerd met behulp van de FtpFindFirstFile- en InternetFindNextFile-functies. FtpFindFirstFile gebruikt de sessiehandgreep die is gemaakt door InternetConnect- om het eerste bestand te vinden dat overeenkomt met de opgegeven zoekcriteria en een ingang retourneert om door te gaan met de opsomming van de map. InternetFindNextFile gebruikt de ingang die wordt geretourneerd door FtpFindFirstFile- om het volgende bestand te retourneren dat overeenkomt met de oorspronkelijke zoekcriteria. De toepassing moet InternetFindNextFile blijven aanroepen totdat er geen bestanden meer in de map staan.
Gebruik de functie FtpCreateDirectory om nieuwe mappen te maken. Deze functie maakt gebruik van de sessiehandgreep die is gemaakt door InternetConnect en maakt de map die is opgegeven door de tekenreeks die aan de functie is doorgegeven. De tekenreeks kan een mapnaam bevatten ten opzichte van de huidige map of een volledig gekwalificeerde mappad.
Als u de naam van bestanden of mappen wilt wijzigen, kan de toepassing ftpRenameFileaanroepen. Deze functie vervangt de oorspronkelijke naam door de nieuwe naam die aan de functie is doorgegeven. De naam van het bestand of de map kan relatief zijn ten opzichte van de huidige map of een volledig gekwalificeerde naam.
Als u bestanden op een FTP-server wilt uploaden of plaatsen, kan de toepassing gebruikmaken van FtpPutFile- of ftpOpenFile- (samen met InternetWriteFile-). ftpPutFile kan worden gebruikt als het bestand al lokaal bestaat, terwijl ftpOpenFile en InternetWriteFile kunnen worden gebruikt als gegevens naar een bestand op de FTP-server moeten worden geschreven.
Als u bestanden wilt downloaden of ophalen, kan de toepassing gebruikmaken van FtpGetFile- of ftpOpenFile- (met InternetReadFile-). FtpGetFile- wordt gebruikt om een bestand op te halen van een FTP-server en het lokaal op te slaan, terwijl FtpOpenFile- en InternetReadFile- kunnen worden gebruikt om te bepalen waar de gedownloade gegevens naartoe gaan (de toepassing kan bijvoorbeeld de informatie weergeven in een invoervak).
Verwijder bestanden op een FTP-server met behulp van de functie FtpDeleteFile. Met deze functie wordt een bestandsnaam verwijderd die relatief is ten opzichte van de huidige map of een volledig gekwalificeerde bestandsnaam van de FTP-server. FtpDeleteFile- vereist een sessiehandgreep die wordt geretourneerd door InternetConnect-.
FTP-functiegrepen
Om goed te kunnen werken, zijn voor de FTP-functies bepaalde typen ACHTERNET ingangen vereist. Deze ingangen moeten in een specifieke volgorde worden gemaakt, te beginnen met de hoofdgreep die is gemaakt door InternetOpen. InternetConnect vervolgens een FTP-sessiehandgreep kan maken.
In het volgende diagram ziet u de functies die afhankelijk zijn van de FTP-sessiegreep die wordt geretourneerd door InternetConnect. De gearceerde vakken vertegenwoordigen functies die ACHTERNET ingangen retourneren, terwijl de vakken zonder opmaak functies vertegenwoordigen die gebruikmaken van de ACHTERNET-ingang die is gemaakt door de functie waarvan ze afhankelijk zijn.
In het volgende diagram ziet u de twee functies die ACHTERNET retourneren ingangen en de functies die hiervan afhankelijk zijn. De gearceerde vakken vertegenwoordigen functies die ACHTERNET ingangen retourneren, terwijl de vakken zonder opmaak functies vertegenwoordigen die gebruikmaken van de ACHTERNET- handle die zijn gemaakt door de functie waarvan ze afhankelijk zijn.
Zie ACHTERNET Handlesvoor meer informatie.
De WinINet-functies voor FTP-sessies gebruiken
De volgende functies worden gebruikt tijdens FTP-sessies. Deze functies worden niet herkend door CERN-proxy's. Toepassingen die moeten functioneren via CERN-proxy's moeten InternetOpenUrl gebruiken en rechtstreeks toegang krijgen tot de resources. Zie Url's rechtstreeksopenen voor meer informatie over directe toegang tot resources.
Functie | Beschrijving |
---|---|
ftpCreateDirectory- | Hiermee maakt u een nieuwe map op de server. Voor deze functie is een ingang vereist die is gemaakt door InternetConnect. |
FtpDeleteFile- | Hiermee verwijdert u een bestand van de server. Voor deze functie is een ingang vereist die is gemaakt door InternetConnect. |
FtpFindFirstFile- | Hiermee start u de inventarisatie van bestanden of het zoeken naar bestanden in de huidige map. Voor deze functie is een ingang vereist die is gemaakt door InternetConnect. |
FtpGetCurrentDirectory | Retourneert de huidige map van de client op de server. Voor deze functie is een ingang vereist die is gemaakt door InternetConnect. |
ftpGetFile- | Hiermee haalt u een bestand op van de server. Voor deze functie is een ingang vereist die is gemaakt door InternetConnect. |
ftpOpenFile- | Hiermee wordt de toegang tot een bestand op de server gestart voor lezen of schrijven. Voor deze functie is een ingang vereist die is gemaakt door InternetConnect. |
FtpPutFile- | Hiermee schrijft u een bestand naar de server. Voor deze functie is een ingang vereist die is gemaakt door InternetConnect. |
FtpRemoveDirectory- | Hiermee verwijdert u een map op de server. Voor deze functie is een ingang vereist die is gemaakt door InternetConnect. |
ftpRenameFile- | Hiermee wijzigt u de naam van een bestand op de server. Voor deze functie is een ingang vereist die is gemaakt door InternetConnect. |
FtpSetCurrentDirectory- | Hiermee wijzigt u de huidige map van de client op de server. Voor deze functie is een ingang vereist die is gemaakt door InternetConnect. |
InternetWriteFile- | Hiermee schrijft u gegevens naar een geopend bestand op de server. Voor deze functie is een ingang vereist die is gemaakt door FtpOpenFile-. |
Een FTP-sessie starten
De toepassing brengt een FTP-sessie tot stand door InternetConnect- aan te roepen op een ingang die is gemaakt door InternetOpen. InternetConnect- moet de servernaam, het poortnummer, de gebruikersnaam, het wachtwoord en het servicetype (die moeten worden ingesteld op INTERNET_SERVICE_FTP). Voor passieve FTP-semantiek moet de toepassing ook de vlag INTERNET_FLAG_PASSIVE instellen.
De waarden voor INTERNET_DEFAULT_FTP_PORT en INTERNET_INVALID_PORT_NUMBER kunnen worden gebruikt voor het poortnummer. INTERNET_DEFAULT_FTP_PORT de standaard-FTP-poort gebruikt, maar het servicetype moet nog steeds worden ingesteld. INTERNET_INVALID_PORT_NUMBER gebruikt de standaardwaarde voor het aangegeven servicetype.
De waarden voor de gebruikersnaam en het wachtwoord kunnen worden ingesteld op NULL-. Als beide waarden zijn ingesteld op NULL-, gebruikt InternetConnect 'anoniem' voor de gebruikersnaam en het e-mailadres van de gebruiker voor het wachtwoord. Als alleen het wachtwoord is ingesteld op NULL-, wordt de gebruikersnaam die is doorgegeven aan InternetConnect- gebruikt voor de gebruikersnaam en wordt er een lege tekenreeks gebruikt voor het wachtwoord. Als geen van beide waarden NULL-, worden de gebruikersnaam en het wachtwoord die zijn opgegeven aan InternetConnect- gebruikt.
Mappen inventariseren
Opsomming van een map op een FTP-server vereist het maken van een ingang door FtpFindFirstFile. Deze ingang is een vertakking van de sessie-handle die is gemaakt door InternetConnect. FtpFindFirstFile zoekt het eerste bestand of de eerste map op de server en retourneert het in een WIN32_FIND_DATA structuur. Gebruik InternetFindNextFile totdat deze ERROR_NO_MORE_FILESretourneert. Met deze methode worden alle volgende bestanden en mappen op de server gevonden. Zie Het volgende bestand zoekenvoor meer informatie over InternetFindNextFile.
Als u wilt bepalen of het bestand dat is opgehaald door FtpFindFirstFile of InternetFindNextFile een map is, controleert u de dwFileAttributes lid van de WIN32_FIND_DATA structuur om te zien of het gelijk is aan FILE_ATTRIBUTE_DIRECTORY.
Als de toepassing wijzigingen aanbrengt op de FTP-server of als de FTP-server regelmatig wordt gewijzigd, moeten de vlaggen INTERNET_FLAG_NO_CACHE_WRITE en INTERNET_FLAG_RELOAD worden ingesteld in FtpFindFirstFile-. Deze vlaggen zorgen ervoor dat de mapgegevens die worden opgehaald van de FTP-server actueel zijn.
Nadat de toepassing de mapinventarisatie heeft voltooid, moet de toepassing een aanroep uitvoeren naar InternetCloseHandle- op de ingang die is gemaakt door FtpFindFirstFile. Totdat deze ingang is gesloten, kan de toepassing geen FtpFindFirstFile opnieuw aanroepen op de sessiegreep die is gemaakt door InternetConnect-. Als een aanroep naar FtpFindFirstFile wordt uitgevoerd op dezelfde sessiehandgreep voordat de vorige aanroep naar dezelfde functie wordt gesloten, mislukt de functie en retourneert deze ERROR_FTP_TRANSFER_IN_PROGRESS.
In het volgende voorbeeld wordt de inhoud van een FTP-map opgesomd in een keuzelijstbesturingselement. De parameter hConnection is een ingang die wordt geretourneerd door de functie InternetConnect nadat er een FTP-sessie is gemaakt. Voorbeeldbroncode voor de internetErrorOut-functie waarnaar in dit voorbeeld wordt verwezen, vindt u in het onderwerp Afhandelingsfouten.
#include <windows.h>
#include <strsafe.h>
#include <wininet.h>
#pragma comment(lib, "wininet.lib")
#pragma comment(lib, "user32.lib")
#define FTP_FUNCTIONS_BUFFER_SIZE MAX_PATH+8
BOOL WINAPI DisplayFtpDir(
HWND hDlg,
HINTERNET hConnection,
DWORD dwFindFlags,
int nListBoxId )
{
WIN32_FIND_DATA dirInfo;
HINTERNET hFind;
DWORD dwError;
BOOL retVal = FALSE;
TCHAR szMsgBuffer[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szFName[FTP_FUNCTIONS_BUFFER_SIZE];
SendDlgItemMessage( hDlg, nListBoxId, LB_RESETCONTENT, 0, 0 );
hFind = FtpFindFirstFile( hConnection, TEXT( "*.*" ),
&dirInfo, dwFindFlags, 0 );
if ( hFind == NULL )
{
dwError = GetLastError( );
if( dwError == ERROR_NO_MORE_FILES )
{
StringCchCopy( szMsgBuffer, FTP_FUNCTIONS_BUFFER_SIZE,
TEXT( "No files found at FTP location specified." ) );
retVal = TRUE;
goto DisplayDirError_1;
}
StringCchCopy( szMsgBuffer, FTP_FUNCTIONS_BUFFER_SIZE,
TEXT( "FtpFindFirstFile failed." ) );
goto DisplayDirError_1;
}
do
{
if( FAILED( StringCchCopy( szFName, FTP_FUNCTIONS_BUFFER_SIZE,
dirInfo.cFileName ) ) ||
( ( dirInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) &&
( FAILED( StringCchCat( szFName, FTP_FUNCTIONS_BUFFER_SIZE,
TEXT( " <DIR> " ) ) ) ) ) )
{
StringCchCopy( szMsgBuffer, FTP_FUNCTIONS_BUFFER_SIZE,
TEXT( "Failed to copy a file or directory name." ) );
retVal = FALSE;
goto DisplayDirError_2;
}
SendDlgItemMessage( hDlg, nListBoxId, LB_ADDSTRING,
0, (LPARAM) szFName );
} while( InternetFindNextFile( hFind, (LPVOID) &dirInfo ) );
if( ( dwError = GetLastError( ) ) == ERROR_NO_MORE_FILES )
{
InternetCloseHandle(hFind);
return( TRUE );
}
StringCchCopy( szMsgBuffer, FTP_FUNCTIONS_BUFFER_SIZE,
TEXT( "FtpFindNextFile failed." ) );
DisplayDirError_2:
InternetCloseHandle( hFind );
DisplayDirError_1:
MessageBox( hDlg,
(LPCTSTR) szMsgBuffer,
TEXT( "DisplayFtpDir( ) Problem" ),
MB_OK | MB_ICONERROR );
return( retVal );
}
Navigeren in mappen
De ftpGetCurrentDirectory en ftpSetCurrentDirectory functies verwerken directorynavigatie.
FtpGetCurrentDirectory retourneert de huidige map van de toepassing op de FTP-server. Het mappad van de hoofdmap op de FTP-server is opgenomen.
FtpSetCurrentDirectory wijzigt de werkmap op de server. De mapgegevens die worden doorgegeven aan FtpSetCurrentDirectory kunnen een gedeeltelijk of volledig gekwalificeerde padnaam zijn ten opzichte van de huidige map. Als de toepassing zich momenteel in de map 'public/info' bevindt en het pad 'ftp/example' is, FtpSetCurrentDirectory de huidige map wijzigt in 'public/info/ftp/example'.
In het volgende voorbeeld wordt de FTP-sessie-handle hConnection gebruikt, die wordt geretourneerd door InternetConnect. De nieuwe mapnaam wordt opgehaald uit het invoervak van het bovenliggende dialoogvenster waarvan de IDC wordt doorgegeven in de parameter nDirNameId. Voordat de map wordt gewijzigd, haalt de functie de huidige map op en slaat deze op in hetzelfde invoervak. De souce-code voor de functie DisplayFtpDir die aan het einde wordt aangeroepen, wordt hierboven vermeld.
BOOL WINAPI ChangeFtpDir( HWND hDlg,
HINTERNET hConnection,
int nDirNameId,
int nListBoxId )
{
DWORD dwSize;
TCHAR szNewDirName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szOldDirName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR* szFailedFunctionName;
dwSize = FTP_FUNCTIONS_BUFFER_SIZE;
if( !GetDlgItemText( hDlg, nDirNameId, szNewDirName, dwSize ) )
{
szFailedFunctionName = TEXT( "GetDlgItemText" );
goto ChangeFtpDirError;
}
if ( !FtpGetCurrentDirectory( hConnection, szOldDirName, &dwSize ))
{
szFailedFunctionName = TEXT( "FtpGetCurrentDirectory" );
goto ChangeFtpDirError;
}
if( !SetDlgItemText( hDlg, nDirNameId, szOldDirName ) )
{
szFailedFunctionName = TEXT( "SetDlgItemText" );
goto ChangeFtpDirError;
}
if( !FtpSetCurrentDirectory( hConnection, szNewDirName ) )
{
szFailedFunctionName = TEXT( "FtpSetCurrentDirectory" );
goto ChangeFtpDirError;
}
return( DisplayFtpDir( hDlg, hConnection, 0, nListBoxId ) );
ChangeFtpDirError:
InternetErrorOut( hDlg, GetLastError( ), szFailedFunctionName );
DisplayFtpDir( hDlg, hConnection, INTERNET_FLAG_RELOAD, nListBoxId);
return( FALSE );
}
Mappen bewerken op een FTP-server
WinINet biedt de mogelijkheid om mappen te maken en te verwijderen op een FTP-server waarop de toepassing de benodigde bevoegdheden heeft. Als de toepassing zich moet aanmelden bij een server met een specifieke gebruikersnaam en wachtwoord, kunnen de waarden worden gebruikt in InternetConnect- bij het maken van de FTP-sessie-handle.
De functie FtpCreateDirectory gebruikt een geldige FTP-sessiehandgreep en een null-tekenreeks-beëindigde tekenreeks die een volledig gekwalificeerd pad of een naam bevat ten opzichte van de huidige map en maakt een map op de FTP-server.
In het volgende voorbeeld ziet u twee afzonderlijke aanroepen voor FtpCreateDirectory. In beide voorbeelden is hFtpSession de sessiehandgreep die is gemaakt door de functie InternetConnect en is de hoofdmap de huidige map.
/* Creates the directory "test" in the current (root) directory. */
FtpCreateDirectory( hFtpSession, "test" );
/* Creates the directory "example" in the test directory. */
FtpCreateDirectory( hFtpSession, "\\test\\example" );
De functie FtpRemoveDirectory gebruikt een sessiehandgreep en een null--beëindigde tekenreeks die een volledig gekwalificeerd pad of een naam bevat ten opzichte van de huidige map en die map van de FTP-server verwijdert.
In het volgende voorbeeld ziet u twee voorbeeldoproepen naar FtpRemoveDirectory. In beide aanroepen is hFtpSession de sessiehandgreep die is gemaakt door de functie InternetConnect en is de hoofdmap de huidige map. Er is een map met de naam 'test' in de hoofdmap en een map met de naam 'voorbeeld' in de map 'test'.
/* Removes the "example" directory (plus any files/directories it contains) from the "test" directory. */
FtpRemoveDirectory(hFtpSession,"\\test\\example");
/* Removes the "test" directory (plus any files/directories it contains) from the root directory. */
FtpRemoveDirectory(hFtpSession, "test");
FtpRemoveDirectory(hFtpSession,TEXT("\\test\\example"));
/* Removes the "example" directory and any files or
directories contained in it from the "test" directory. */
FtpRemoveDirectory(hFtpSession, TEXT("test"));
/* Removes the "test" directory and any files or
directories contained in it from the root directory. */
In het volgende voorbeeld wordt een nieuwe map op de FTP-server gemaakt. De nieuwe mapnaam wordt opgehaald uit het invoervak van het bovenliggende dialoogvenster waarvan de IDC wordt doorgegeven in de parameter nDirNameId. De hConnection ingang is gemaakt door InternetConnect na het tot stand brengen van een FTP-sessie. De broncode voor de functie DisplayFtpDir die aan het einde wordt aangeroepen, wordt hierboven vermeld.
BOOL WINAPI CreateFtpDir( HWND hDlg, HINTERNET hConnection,
int nDirNameId, int nListBoxId )
{
TCHAR szNewDirName[FTP_FUNCTIONS_BUFFER_SIZE];
if( !GetDlgItemText( hDlg, nDirNameId,
szNewDirName,
FTP_FUNCTIONS_BUFFER_SIZE ) )
{
MessageBox( hDlg,
TEXT( "Error: Directory Name Must Be Specified" ),
TEXT( "Create FTP Directory" ),
MB_OK | MB_ICONERROR );
return( FALSE );
}
if( !FtpCreateDirectory( hConnection, szNewDirName ) )
{
InternetErrorOut( hDlg, GetLastError( ),
TEXT( "FtpCreateDirectory" ) );
return( FALSE );
}
return( DisplayFtpDir( hDlg, hConnection,
INTERNET_FLAG_RELOAD,
nListBoxId ) );
}
In het volgende voorbeeld wordt een map van de FTP-server verwijderd. De naam van de map die moet worden verwijderd, wordt opgehaald uit het invoervak in het bovenliggende dialoogvenster waarvan de IDC wordt doorgegeven aan de parameter nDirNameId. De hConnection ingang is gemaakt door InternetConnect na het tot stand brengen van een FTP-sessie. De broncode voor de functie DisplayFtpDir die aan het einde wordt aangeroepen, wordt hierboven vermeld.
BOOL WINAPI RemoveFtpDir( HWND hDlg, HINTERNET hConnection,
int nDirNameId, int nListBoxId )
{
TCHAR szDelDirName[FTP_FUNCTIONS_BUFFER_SIZE];
if( !GetDlgItemText( hDlg, nDirNameId, szDelDirName,
FTP_FUNCTIONS_BUFFER_SIZE ) )
{
MessageBox( hDlg,
TEXT( "Error: Directory Name Must Be Specified" ),
TEXT( "Remove FTP Directory" ),
MB_OK | MB_ICONERROR );
return( FALSE );
}
if( !FtpRemoveDirectory( hConnection, szDelDirName ) )
{
InternetErrorOut( hDlg, GetLastError( ),
TEXT( "FtpRemoveDirectory" ) );
return( FALSE );
}
return( DisplayFtpDir( hDlg, hConnection,
INTERNET_FLAG_RELOAD, nListBoxId ) );
}
Bestanden op een FTP-server krijgen
Er zijn drie methoden voor het ophalen van bestanden vanaf een FTP-server:
- Gebruik InternetOpenUrl en InternetReadFile.
- Gebruik FtpOpenFile- en InternetReadFile-.
- Gebruik FtpGetFile-.
Zie Bestanden lezenvoor meer informatie over het gebruik van de functie InternetReadFile.
Als de URL van het bestand beschikbaar is, kan de toepassing InternetOpenUrl- aanroepen om verbinding te maken met die URL. Gebruik vervolgens InternetReadFile- om het downloaden van het bestand te beheren. Hierdoor is de toepassing strakkere controle over de download en is ideaal voor situaties waarin geen andere bewerkingen op de FTP-server hoeven te worden uitgevoerd. Zie Toegang tot URL's rechtstreeksvoor meer informatie over het rechtstreeks openen van resources.
Als de toepassing een FTP-sessiehandgreep heeft ingesteld op de server met InternetConnect-, kan de toepassing FTPOpenFile- aanroepen met de bestaande bestandsnaam en met een nieuwe naam voor het lokaal opgeslagen bestand. De toepassing kan vervolgens InternetReadFile gebruiken om het bestand te downloaden. Hierdoor kan de toepassing strakkere controle over het downloaden hebben en de verbinding met de FTP-server houden, zodat er meer opdrachten kunnen worden uitgevoerd.
Als de toepassing geen strikte controle over het downloaden nodig heeft, kan de toepassing gebruikmaken van FtpGetFile- met de FTP-sessiehandgreep, externe bestandsnaam en lokale bestandsnaam om het bestand op te halen. FtpGetFile- alle boekhouding en overhead uitvoert die is gekoppeld aan het lezen van een bestand vanaf een FTP-server en het lokaal opslaan.
In het volgende voorbeeld wordt een bestand opgehaald van een FTP-server en lokaal opgeslagen. De naam van het bestand op de FTP-server wordt opgehaald uit het invoervak in het bovenliggende dialoogvenster waarvan de IDC wordt doorgegeven in de parameter nFtpFileNameId, en de lokale naam waaronder het bestand wordt opgeslagen, wordt opgehaald uit het bewerkingsvak waarvan de IDC wordt doorgegeven in de nLocalFileNameId parameter. De hConnection ingang is gemaakt door InternetConnect na het tot stand brengen van een FTP-sessie.
BOOL WINAPI GetFtpFile( HWND hDlg, HINTERNET hConnection,
int nFtpFileNameId, int nLocalFileNameId )
{
TCHAR szFtpFileName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szLocalFileName[FTP_FUNCTIONS_BUFFER_SIZE];
DWORD dwTransferType;
TCHAR szBoxTitle[] = TEXT( "Download FTP File" );
TCHAR szAsciiQuery[] =
TEXT("Do you want to download as ASCII text?(Default is binary)");
TCHAR szAsciiDone[] =
TEXT( "ASCII Transfer completed successfully..." );
TCHAR szBinaryDone[] =
TEXT( "Binary Transfer completed successfully..." );
if( !GetDlgItemText( hDlg, nFtpFileNameId, szFtpFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) ||
!GetDlgItemText( hDlg, nLocalFileNameId, szLocalFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) )
{
MessageBox( hDlg,
TEXT( "Target File or Destination File Missing" ),
szBoxTitle,
MB_OK | MB_ICONERROR );
return( FALSE );
}
dwTransferType = ( MessageBox( hDlg,
szAsciiQuery,
szBoxTitle,
MB_YESNO ) == IDYES ) ?
FTP_TRANSFER_TYPE_ASCII : FTP_TRANSFER_TYPE_BINARY;
dwTransferType |= INTERNET_FLAG_RELOAD;
if( !FtpGetFile( hConnection, szFtpFileName, szLocalFileName, FALSE,
FILE_ATTRIBUTE_NORMAL, dwTransferType, 0 ) )
{
InternetErrorOut( hDlg, GetLastError( ), TEXT( "FtpGetFile" ) );
return( FALSE );
}
MessageBox( hDlg,( dwTransferType ==
(FTP_TRANSFER_TYPE_ASCII | INTERNET_FLAG_RELOAD)) ?
szAsciiDone : szBinaryDone, szBoxTitle, MB_OK );
return( TRUE );
}
Bestanden op een FTP-server plaatsen
Er zijn twee methoden voor het plaatsen van een bestand op een FTP-server:
- Gebruik FtpOpenFile- met InternetWriteFile-.
- Gebruik FtpPutFile-.
Een toepassing die gegevens naar een FTP-server moet verzenden, maar geen lokaal bestand bevat dat alle gegevens bevat, moet FtpOpenFile- gebruiken om een bestand op de FTP-server te maken en te openen. De toepassing kan vervolgens InternetWriteFile gebruiken om de gegevens naar het bestand te uploaden.
Als het bestand al lokaal bestaat, kan de toepassing FTPPutFile gebruiken om het bestand te uploaden naar de FTP-server. FtpPutFile- voert alle overhead uit die nodig is bij het uploaden van een lokaal bestand naar een externe FTP-server.
In het volgende voorbeeld wordt een lokaal bestand gekopieerd naar de FTP-server. De lokale naam van het bestand wordt opgehaald uit het invoervak in het bovenliggende dialoogvenster waarvan de IDC wordt doorgegeven in de parameter nLocalFileNameId, en de naam waaronder het bestand wordt opgeslagen op de FTP-server, wordt opgehaald uit het invoervak waarvan de IDC wordt doorgegeven in de nFtpFileNameId parameter. De hConnection ingang is gemaakt door InternetConnect na het tot stand brengen van een FTP-sessie.
BOOL WINAPI PutFtpFile( HWND hDlg, HINTERNET hConnection,
int nFtpFileNameId, int nLocalFileNameId )
{
TCHAR szFtpFileName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szLocalFileName[FTP_FUNCTIONS_BUFFER_SIZE];
DWORD dwTransferType;
TCHAR szBoxTitle[] = TEXT( "Upload FTP File" );
TCHAR szASCIIQuery[] =
TEXT("Do you want to upload as ASCII text? (Default is binary)");
TCHAR szAsciiDone[] =
TEXT( "ASCII Transfer completed successfully..." );
TCHAR szBinaryDone[] =
TEXT( "Binary Transfer completed successfully..." );
if( !GetDlgItemText( hDlg, nFtpFileNameId, szFtpFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) ||
!GetDlgItemText( hDlg, nLocalFileNameId, szLocalFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) )
{
MessageBox( hDlg,
TEXT("Target File or Destination File Missing"),
szBoxTitle,
MB_OK | MB_ICONERROR );
return( FALSE );
}
dwTransferType =
( MessageBox( hDlg,
szASCIIQuery,
szBoxTitle,
MB_YESNO ) == IDYES ) ?
FTP_TRANSFER_TYPE_ASCII : FTP_TRANSFER_TYPE_BINARY;
if( !FtpPutFile( hConnection,
szLocalFileName,
szFtpFileName,
dwTransferType,
0 ) )
{
InternetErrorOut( hDlg, GetLastError( ), TEXT( "FtpGetFile" ) );
return( FALSE );
}
MessageBox( hDlg,
( dwTransferType == FTP_TRANSFER_TYPE_ASCII ) ?
szAsciiDone : szBinaryDone, szBoxTitle, MB_OK );
return( TRUE ); // Remember to refresh directory listing
}
Bestanden verwijderen van een FTP-server
Als u een bestand van een FTP-server wilt verwijderen, gebruikt u de functie FtpDeleteFile. De aanroepende toepassing moet over de benodigde bevoegdheden beschikken om een bestand van de FTP-server te verwijderen.
In het volgende voorbeeld wordt een bestand van de FTP-server verwijderd. De naam van het te verwijderen bestand wordt opgehaald uit het invoervak in het bovenliggende dialoogvenster waarvan idc wordt doorgegeven in de nFtpFileNameId parameter. De hConnection ingang is gemaakt door InternetConnect na het tot stand brengen van een FTP-sessie. Omdat deze functie bestandsvermeldingen of mapweergave niet vernieuwt, moet het aanroepende proces dit doen bij een geslaagde verwijdering.
BOOL WINAPI DeleteFtpFile( HWND hDlg, HINTERNET hConnection,
int nFtpFileNameId )
{
TCHAR szFtpFileName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szBoxTitle[] = TEXT( "Delete FTP File" );
if( !GetDlgItemText( hDlg, nFtpFileNameId, szFtpFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) )
{
MessageBox( hDlg, TEXT( "File Name Must Be Specified!" ),
szBoxTitle, MB_OK | MB_ICONERROR );
return( FALSE );
}
if( !FtpDeleteFile( hConnection, szFtpFileName ) )
{
InternetErrorOut( hDlg,
GetLastError( ),
TEXT( "FtpDeleteFile" ) );
return( FALSE );
}
MessageBox( hDlg,
TEXT( "File has been deleted" ),
szBoxTitle,
MB_OK );
return( TRUE ); // Remember to refresh directory listing
}
De naam van bestanden en mappen op een FTP-server wijzigen
Bestanden en mappen op een FTP-server kunnen worden gewijzigd met behulp van de ftpRenameFile functie. FtpRenameFile accepteert twee null-tekenreeksen-beëindigd die gedeeltelijk of volledig gekwalificeerde namen bevatten ten opzichte van de huidige map. De functie wijzigt de naam van het bestand dat door de eerste tekenreeks is aangewezen in de naam die door de tweede tekenreeks is aangewezen.
In het volgende voorbeeld wordt de naam van een bestand of map op de FTP-server gewijzigd. De huidige naam van het bestand of de map wordt opgehaald uit het invoervak in het bovenliggende dialoogvenster waarvan de IDC wordt doorgegeven in de parameter nOldFileNameId. De nieuwe naam wordt overgenomen uit het invoervak waarvan de IDC wordt doorgegeven in de nNewFileNameId parameter. De hConnection ingang is gemaakt door InternetConnect na het tot stand brengen van een FTP-sessie. Omdat deze functie bestandsvermeldingen of mapweergave niet vernieuwt, moet het aanroepende proces dit doen wanneer de naam is gewijzigd.
BOOL WINAPI RenameFtpFile( HWND hDlg, HINTERNET hConnection,
int nOldFileNameId, int nNewFileNameId )
{
TCHAR szOldFileName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szNewFileName[FTP_FUNCTIONS_BUFFER_SIZE];
TCHAR szBoxTitle[] = TEXT( "Rename FTP File" );
if( !GetDlgItemText( hDlg, nOldFileNameId, szOldFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) ||
!GetDlgItemText( hDlg, nNewFileNameId, szNewFileName,
FTP_FUNCTIONS_BUFFER_SIZE ) )
{
MessageBox( hDlg,
TEXT( "Both the current and new file names must be supplied" ),
szBoxTitle,
MB_OK | MB_ICONERROR );
return( FALSE );
}
if( !FtpRenameFile( hConnection, szOldFileName, szNewFileName ) )
{
MessageBox( hDlg,
TEXT( "FtpRenameFile failed" ),
szBoxTitle,
MB_OK | MB_ICONERROR );
return( FALSE );
}
return( TRUE ); // Remember to refresh directory listing
}
Notitie
WinINet biedt geen ondersteuning voor serverimplementaties. Daarnaast mag deze niet worden gebruikt vanuit een service. Voor server-implementaties of -services wordt Microsoft Windows HTTP Services (WinHTTP)gebruikt.