FTP-Sitzungen
WinINet ermöglicht Anwendungen das Navigieren und Bearbeiten von Verzeichnissen und Dateien auf einem FTP-Server. Da CERN-Proxys FTP nicht unterstützen, müssen Anwendungen, die ausschließlich einen CERN-Proxy verwenden, die InternetOpenUrl-Funktion verwenden. Weitere Informationen zur Verwendung von InternetOpenUrlfinden Sie unter Direktes Zugreifen auf URLs.
Um eine FTP-Sitzung zu starten, verwenden Sie InternetConnect, um das Sitzungshandle zu erstellen.
Mit WinINet können Sie die folgenden Aktionen auf einem FTP-Server ausführen:
- Navigieren zwischen Verzeichnissen.
- Aufzählen, Erstellen, Entfernen und Umbenennen von Verzeichnissen.
- Umbenennen, Hochladen, Herunterladen und Löschen von Dateien.
Die Navigation wird durch die Funktionen FtpGetCurrentDirectory und FtpSetCurrentDirectory bereitgestellt. Diese Funktionen verwenden das Sitzungshandle, das durch einen vorherigen Aufruf von InternetConnect erstellt wurde, um zu bestimmen, in welchem Verzeichnis sich die Anwendung derzeit befindet, oder um in ein anderes Unterverzeichnis zu wechseln.
Die Verzeichnisenumeration erfolgt mithilfe der Funktionen FtpFindFirstFile und InternetFindNextFile. FtpFindFirstFile verwendet das von InternetConnect erstellte Sitzungshandle, um die erste Datei zu finden, die den angegebenen Suchkriterien entspricht, und gibt ein Handle zurück, um die Verzeichnisenumeration fortzusetzen. InternetFindNextFile verwendet das von FtpFindFirstFile zurückgegebene Handle, um die nächste Datei zurückzugeben, die den ursprünglichen Suchkriterien entspricht. Die Anwendung sollte weiterhin InternetFindNextFile aufrufen, bis keine weiteren Dateien im Verzeichnis vorhanden sind.
Verwenden Sie die FtpCreateDirectory-Funktion, um neue Verzeichnisse zu erstellen. Diese Funktion verwendet das von InternetConnect erstellte Sitzungshandle und erstellt das Verzeichnis, das durch die an die Funktion übergebene Zeichenfolge angegeben wird. Die Zeichenfolge kann einen Verzeichnisnamen relativ zum aktuellen Verzeichnis oder einen vollqualifizierten Verzeichnispfad enthalten.
Um Dateien oder Verzeichnisse umzubenennen, kann die Anwendung FtpRenameFileaufrufen. Diese Funktion ersetzt den ursprünglichen Namen durch den neuen Namen, der an die Funktion übergeben wird. Der Name der Datei oder des Verzeichnisses kann relativ zum aktuellen Verzeichnis oder einem vollqualifizierten Namen sein.
Zum Hochladen oder Platzieren von Dateien auf einem FTP-Server kann die Anwendung entweder FtpPutFile oder FtpOpenFile (zusammen mit InternetWriteFile)verwenden. FtpPutFile kann verwendet werden, wenn die Datei bereits lokal vorhanden ist, während FtpOpenFile und InternetWriteFile verwendet werden können, wenn Daten in eine Datei auf dem FTP-Server geschrieben werden müssen.
Zum Herunterladen oder Abrufen von Dateien kann die Anwendung entweder FtpGetFile oder FtpOpenFile (mit InternetReadFile)verwenden. FtpGetFile wird verwendet, um eine Datei von einem FTP-Server abzurufen und lokal zu speichern, während FtpOpenFile und InternetReadFile verwendet werden können, um zu steuern, wohin die heruntergeladenen Informationen gelangen (die Anwendung kann die Informationen beispielsweise in einem Bearbeitungsfeld anzeigen).
Löschen Sie Dateien auf einem FTP-Server mithilfe der FtpDeleteFile-Funktion. Diese Funktion entfernt einen Dateinamen, der entweder relativ zum aktuellen Verzeichnis oder zu einem vollqualifizierten Dateinamen vom FTP-Server ist. FtpDeleteFile erfordert ein Sitzungshandle, das von InternetConnectzurückgegeben wird.
FTP-Funktionshandles
Um ordnungsgemäß zu funktionieren, erfordern die FTP-Funktionen bestimmte HinterNET-Handles. Diese Handles müssen in einer bestimmten Reihenfolge erstellt werden, beginnend mit dem von InternetOpenerstellten Stammhandle. InternetConnect kann dann ein FTP-Sitzungshandle erstellen.
Das folgende Diagramm zeigt die Funktionen, die vom FTP-Sitzungshandle abhängig sind, das von InternetConnectzurückgegeben wird. Die schattierten Felder stellen Funktionen dar, die HINTERNET-Handles zurückgeben, während die einfachen Felder Funktionen darstellen, die das HINTERNET-Handle verwenden, das von der Funktion erstellt wurde, von der sie abhängig sind.

Das folgende Diagramm zeigt die beiden Funktionen, die HINTERNET-Handles zurückgeben, und die von ihnen abhängigen Funktionen. Die schattierten Felder stellen Funktionen dar, die HINTERNET-Handles zurückgeben, während die einfachen Felder Funktionen darstellen, die das HINTERNET-Handle verwenden, das von der Funktion erstellt wurde, von der sie abhängen.

Weitere Informationen finden Sie unter HINTERNET Handles.
Verwenden der WinINet-Funktionen für FTP-Sitzungen
Die folgenden Funktionen werden während FTP-Sitzungen verwendet. Diese Funktionen werden von CERN-Proxys nicht erkannt. Anwendungen, die über CERN-Proxys funktionieren müssen, sollten InternetOpenUrl verwenden und direkt auf die Ressourcen zugreifen. Weitere Informationen zum direkten Ressourcenzugriff finden Sie unter Direktes Zugreifen auf URLs.
| Funktion | BESCHREIBUNG |
|---|---|
| FtpCreateDirectory | Erstellt ein neues Verzeichnis auf dem Server. Diese Funktion erfordert ein handle, das von InternetConnecterstellt wurde. |
| FtpDeleteFile | Löscht eine Datei vom Server. Diese Funktion erfordert ein handle, das von InternetConnecterstellt wurde. |
| FtpFindFirstFile | Startet die Dateienumeration oder Dateisuche im aktuellen Verzeichnis. Diese Funktion erfordert ein handle, das von InternetConnecterstellt wurde. |
| FtpGetCurrentDirectory | Gibt das aktuelle Verzeichnis des Clients auf dem Server zurück. Diese Funktion erfordert ein handle, das von InternetConnecterstellt wurde. |
| FtpGetFile | Ruft eine Datei vom Server ab. Diese Funktion erfordert ein handle, das von InternetConnecterstellt wurde. |
| FtpOpenFile | Initiiert den Zugriff auf eine Datei auf dem Server zum Lesen oder Schreiben. Diese Funktion erfordert ein handle, das von InternetConnecterstellt wurde. |
| FtpPutFile | Schreibt eine Datei auf den Server. Diese Funktion erfordert ein handle, das von InternetConnecterstellt wurde. |
| FtpRemoveDirectory | Löscht ein Verzeichnis auf dem Server. Diese Funktion erfordert ein handle, das von InternetConnecterstellt wurde. |
| FtpRenameFile | Benennt eine Datei auf dem Server um. Diese Funktion erfordert ein handle, das von InternetConnecterstellt wurde. |
| FtpSetCurrentDirectory | Ändert das aktuelle Verzeichnis des Clients auf dem Server. Diese Funktion erfordert ein handle, das von InternetConnecterstellt wurde. |
| InternetWriteFile | Schreibt Daten in eine geöffnete Datei auf dem Server. Diese Funktion erfordert ein handle, das von FtpOpenFileerstellt wurde. |
Starten einer FTP-Sitzung
Die Anwendung richtet eine FTP-Sitzung ein, indem InternetConnect für ein handle aufgerufen wird, das von InternetOpenerstellt wurde. InternetConnect benötigt den Servernamen, die Portnummer, den Benutzernamen, das Kennwort und den Diensttyp (der auf INTERNET SERVICE FTP festgelegt werden _ _ muss). Bei passiver FTP-Semantik muss die Anwendung auch das _ _ PASSIVE FLAG INTERNET FLAG festlegen.
Die Werte INTERNET _ DEFAULT FTP PORT und INTERNET INVALID PORT NUMBER können für die _ _ _ _ _ Portnummer verwendet werden. INTERNET _ DEFAULT FTP PORT verwendet den _ _ STANDARDMÄßIGEN FTP-Port, aber der Diensttyp muss weiterhin festgelegt werden. INTERNET _ INVALID PORT NUMBER verwendet den Standardwert für den _ _ angegebenen Diensttyp.
Die Werte für Benutzername und Kennwort können auf NULL festgelegt werden. Wenn beide Werte auf NULL festgelegt sind, verwendet InternetConnect "anonymous" als Benutzernamen und die E-Mail-Adresse des Benutzers für das Kennwort. Wenn nur das Kennwort auf NULL festgelegt ist, wird der an InternetConnect übergebene Benutzername für den Benutzernamen und eine leere Zeichenfolge für das Kennwort verwendet. Wenn keiner der Werte NULL ist, werden der Benutzername und das Kennwort für InternetConnect verwendet.
Aufzählen von Verzeichnissen
Die Enumeration eines Verzeichnisses auf einem FTP-Server erfordert die Erstellung eines Handles durch FtpFindFirstFile. Dieses Handle ist ein Branch des Sitzungshandle, das von InternetConnecterstellt wurde. FtpFindFirstFile sucht die erste Datei oder das erste Verzeichnis auf dem Server und gibt sie in einer WIN32 _ FIND _ DATA-Struktur zurück. Verwenden Sie InternetFindNextFile, bis ERROR NO MORE _ _ _ FILESzurückgegeben wird. Diese Methode sucht alle nachfolgenden Dateien und Verzeichnisse auf dem Server. Weitere Informationen zu InternetFindNextFilefinden Sie unter Suchen der nächsten Datei.
Um zu ermitteln, ob die von FtpFindFirstFile oder InternetFindNextFile abgerufene Datei ein Verzeichnis ist, überprüfen Sie das dwFileAttributes-Mitglied der WIN32 _ FIND _ DATA-Struktur, um festzustellen, ob sie file _ ATTRIBUTE DIRECTORY _ entspricht.
Wenn die Anwendung Änderungen auf dem FTP-Server vornannt oder sich der FTP-Server häufig ändert, sollten die Flags INTERNET FLAG NO CACHE _ _ _ _ WRITE und INTERNET FLAG _ _ RELOAD in FtpFindFirstFile festgelegt werden. Diese Flags stellen sicher, dass die vom FTP-Server abgerufenen Verzeichnisinformationen aktuell sind.
Nachdem die Anwendung die Verzeichnisenumeration abgeschlossen hat, muss die Anwendung internetCloseHandle für das von FtpFindFirstFileerstellte Handle aufrufen. Bis dieses Handle geschlossen wird, kann die Anwendung FtpFindFirstFile nicht erneut für das sitzungshand handle aufrufen, das von InternetConnect erstellt wurde. Wenn ein Aufruf von FtpFindFirstFile auf demselben Sitzungshandling erfolgt, bevor der vorherige Aufruf derselben Funktion geschlossen wird, schlägt die Funktion fehl und gibt ERROR FTP TRANSFER IN PROGRESS _ _ _ _ zurück.
Im folgenden Beispiel wird der Inhalt eines FTP-Verzeichnisses in ein Listenfeld-Steuerelement auflistet. Der hConnection-Parameter ist ein Handle, das von der InternetConnect-Funktion zurückgegeben wird, nachdem eine FTP-Sitzung erstellt wurde. Beispiel quellcode für die InternetErrorOut-Funktion, auf die in diesem Beispiel verwiesen wird, finden Sie im Thema Behandeln vonFehlern.
#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 );
}
Navigieren in Verzeichnissen
Die Funktionen FtpGetCurrentDirectory und FtpSetCurrentDirectory verarbeiten die Verzeichnisnavigation.
FtpGetCurrentDirectory gibt das aktuelle Verzeichnis der Anwendung auf dem FTP-Server zurück. Der Verzeichnispfad aus dem Stammverzeichnis auf dem FTP-Server ist enthalten.
FtpSetCurrentDirectory ändert das Arbeitsverzeichnis auf dem Server. Die an FtpSetCurrentDirectory übergebenen Verzeichnisinformationen können entweder ein teilweiser oder vollqualifizierter Pfadname relativ zum aktuellen Verzeichnis sein. Wenn sich die Anwendung beispielsweise derzeit im Verzeichnis "public/info" befindet und der Pfad "ftp/example" ist, ändert FtpSetCurrentDirectory das aktuelle Verzeichnis in "public/info/ftp/example".
Im folgenden Beispiel wird das FTP-Sitzungshand handle hConnection verwendet, das von InternetConnect zurückgegeben wird. Der neue Verzeichnisname wird aus dem Bearbeitungsfeld des übergeordneten Dialogfelds übernommen, dessen IDC im Parameter nDirNameId übergeben wird. Bevor die Verzeichnisänderung vorgenommen wird, ruft die Funktion das aktuelle Verzeichnis ab und speichert es im gleichen Bearbeitungsfeld. Der Souce-Code für die DisplayFtpDir-Funktion, die am Ende aufgerufen wird, ist oben aufgeführt.
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 );
}
Bearbeiten von Verzeichnissen auf einem FTP-Server
WinINet bietet die Möglichkeit, Verzeichnisse auf einem FTP-Server zu erstellen und zu entfernen, für den die Anwendung über die erforderlichen Berechtigungen verfügt. Wenn sich die Anwendung bei einem Server mit einem bestimmten Benutzernamen und Kennwort anmelden muss, können die Werte in InternetConnect verwendet werden, wenn das FTP-Sitzungshand handle erstellt wird.
Die FtpCreateDirectory-Funktion verwendet ein gültiges FTP-Sitzungshandl und eine auf NULL beendete Zeichenfolge, die entweder einen vollqualifizierten Pfad oder einen Namen relativ zum aktuellen Verzeichnis enthält und ein Verzeichnis auf dem FTP-Server erstellt.
Das folgende Beispiel zeigt zwei separate Aufrufe von FtpCreateDirectory. In beiden Beispielen ist hFtpSession das Sitzungshand handle, das von der InternetConnect-Funktion erstellt wurde, und das Stammverzeichnis ist das aktuelle Verzeichnis.
/* Creates the directory "test" in the current (root) directory. */
FtpCreateDirectory( hFtpSession, "test" );
/* Creates the directory "example" in the test directory. */
FtpCreateDirectory( hFtpSession, "\\test\\example" );
Die FtpRemoveDirectory-Funktion verwendet ein Sitzungshandchen und eine mit NULL beendete Zeichenfolge, die entweder einen vollqualifizierten Pfad oder einen Namen relativ zum aktuellen Verzeichnis enthält und dieses Verzeichnis vom FTP-Server entfernt.
Das folgende Beispiel zeigt zwei Beispielaufrufe von FtpRemoveDirectory. In beiden Aufrufen ist hFtpSession das Sitzungshand handle, das von der InternetConnect-Funktion erstellt wurde, und das Stammverzeichnis ist das aktuelle Verzeichnis. Im Stammverzeichnis befindet sich ein Verzeichnis namens "test" und im Verzeichnis "test" das Verzeichnis "example".
/* 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. */
Im folgenden Beispiel wird ein neues Verzeichnis auf dem FTP-Server erstellt. Der neue Verzeichnisname wird aus dem Bearbeitungsfeld des übergeordneten Dialogfelds übernommen, dessen IDC im Parameter nDirNameId übergeben wird. Das hConnection-Handle wurde von InternetConnect erstellt, nachdem eine FTP-Sitzung eingerichtet wurde. Der Quellcode für die DisplayFtpDir-Funktion, die am Ende aufgerufen wird, ist oben aufgeführt.
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 ) );
}
Im folgenden Beispiel wird ein Verzeichnis vom FTP-Server gelöscht. Der Name des zu löschenden Verzeichnisses wird aus dem Bearbeitungsfeld im übergeordneten Dialogfeld übernommen, dessen IDC an den Parameter nDirNameId übergeben wird. Das hConnection-Handle wurde von InternetConnect erstellt, nachdem eine FTP-Sitzung eingerichtet wurde. Der Quellcode für die DisplayFtpDir-Funktion, die am Ende aufgerufen wird, ist oben aufgeführt.
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 ) );
}
Abrufen von Dateien auf einem FTP-Server
Es gibt drei Methoden zum Abrufen von Dateien von einem FTP-Server:
- Verwenden Sie InternetOpenUrl und InternetReadFile.
- Verwenden Sie FtpOpenFile und InternetReadFile.
- Verwenden Sie FtpGetFile.
Weitere Informationen zur Verwendung der InternetReadFile-Funktion finden Sie unter Lesen von Dateien.
Wenn die URL der Datei verfügbar ist, kann die Anwendung InternetOpenUrl aufrufen, um eine Verbindung mit dieser URL herzustellen, und dann InternetReadFile verwenden, um den Download der Datei zu steuern. Dies ermöglicht der Anwendung eine strengere Kontrolle über den Download und eignet sich ideal für Situationen, in denen keine anderen Vorgänge auf dem FTP-Server ausgeführt werden müssen. Weitere Informationen zum direkten Zugriff auf Ressourcen finden Sie unter Direkter Zugriff auf URLs.
Wenn die Anwendung mit InternetConnectein FTP-Sitzungshand handle für den Server eingerichtet hat, kann die Anwendung FtpOpenFile mit dem vorhandenen Dateinamen und mit einem neuen Namen für die lokal gespeicherte Datei aufrufen. Die Anwendung kann dann InternetReadFile verwenden, um die Datei herunterzuladen. Dies ermöglicht der Anwendung eine strengere Kontrolle über den Download und behält die Verbindung mit dem FTP-Server bei, sodass weitere Befehle ausgeführt werden können.
Wenn die Anwendung keine enge Kontrolle über den Download benötigt, kann die Anwendung FtpGetFile mit dem FTP-Sitzungshand handle, dem Remotedateinamen und dem lokalen Dateinamen verwenden, um die Datei abzurufen. FtpGetFile führt alle Buchhaltungs- und Mehraufwandsaufgaben aus, die mit dem Lesen einer Datei von einem FTP-Server und dem lokalen Speichern verbunden sind.
Im folgenden Beispiel wird eine Datei von einem FTP-Server abgerufen und lokal gespeichert. Der Name der Datei auf dem FTP-Server wird aus dem Bearbeitungsfeld im übergeordneten Dialogfeld übernommen, dessen IDC im Parameter nFtpFileNameId übergeben wird. Der lokale Name, unter dem die Datei gespeichert wird, wird aus dem Bearbeitungsfeld übernommen, dessen IDC im Parameter nLocalFileNameId übergeben wird. Das hConnection-Handle wurde von InternetConnect erstellt, nachdem eine FTP-Sitzung eingerichtet wurde.
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 );
}
Platzieren von Dateien auf einem FTP-Server
Es gibt zwei Methoden zum Platzieren einer Datei auf einem FTP-Server:
- Verwenden Sie FtpOpenFile mit InternetWriteFile.
- Verwenden Sie FtpPutFile.
Eine Anwendung, die Daten an einen FTP-Server senden muss, aber nicht über eine lokale Datei verfügt, die alle Daten enthält, sollte ftpOpenFile verwenden, um eine Datei auf dem FTP-Server zu erstellen und zu öffnen. Die Anwendung kann dann InternetWriteFile verwenden, um die Informationen in die Datei hochzuladen.
Wenn die Datei bereits lokal vorhanden ist, kann die Anwendung ftpPutFile verwenden, um die Datei auf den FTP-Server hochzuladen. FtpPutFile führt den ganzen Mehraufwand durch, der mit dem Hochladen einer lokalen Datei auf einen FTP-Remoteserver verbunden ist.
Im folgenden Beispiel wird eine lokale Datei auf den FTP-Server kopiert. Der lokale Name der Datei wird aus dem Bearbeitungsfeld im übergeordneten Dialogfeld übernommen, dessen IDC im Parameter nLocalFileNameId übergeben wird, und der Name, unter dem die Datei auf dem FTP-Server gespeichert wird, wird aus dem Bearbeitungsfeld übernommen, dessen IDC im Parameter nFtpFileNameId übergeben wird. Das hConnection-Handle wurde von InternetConnect erstellt, nachdem eine FTP-Sitzung eingerichtet wurde.
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
}
Löschen von Dateien von einem FTP-Server
Verwenden Sie die FtpDeleteFile-Funktion, um eine Datei von einem FTP-Server zu löschen. Die aufrufende Anwendung muss über die erforderlichen Berechtigungen zum Löschen einer Datei vom FTP-Server verfügen.
Im folgenden Beispiel wird eine Datei vom FTP-Server gelöscht. Der Name der zu löschenden Datei wird aus dem Bearbeitungsfeld im übergeordneten Dialogfeld übernommen, dessen IDC an den Parameter nFtpFileNameId übergeben wird. Das hConnection-Handle wurde von InternetConnect erstellt, nachdem eine FTP-Sitzung eingerichtet wurde. Da diese Funktion keine Dateiauflistungen oder die Verzeichnisanzeige aktualisiert, sollte der aufrufende Prozess dies nach erfolgreichem Löschen tun.
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
}
Umbenennen von Dateien und Verzeichnissen auf einem FTP-Server
Dateien und Verzeichnisse auf einem FTP-Server können mithilfe der FtpRenameFile-Funktion umbenannt werden. FtpRenameFile akzeptiert zwei mit NULL beendete Zeichenfolgen, die entweder teilweise oder vollqualifizierte Namen relativ zum aktuellen Verzeichnis enthalten. Die Funktion ändert den Namen der Datei, die von der ersten Zeichenfolge angegeben wird, in den Namen, der von der zweiten Zeichenfolge angegeben wird.
Im folgenden Beispiel wird eine Datei oder ein Verzeichnis auf dem FTP-Server umbenannt. Der aktuelle Name der Datei oder des Verzeichnisses wird aus dem Bearbeitungsfeld im übergeordneten Dialogfeld übernommen, dessen IDC im Parameter nOldFileNameId übergeben wird, und der neue Name wird aus dem Bearbeitungsfeld übernommen, dessen IDC im Parameter nNewFileNameId übergeben wird. Das hConnection-Handle wurde von InternetConnect erstellt, nachdem eine FTP-Sitzung eingerichtet wurde. Da diese Funktion keine Dateiauflistungen oder die Verzeichnisanzeige aktualisiert, sollte der aufrufende Prozess dies nach erfolgreicher Umbenennung tun.
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
}
Hinweis
WinINet unterstützt keine Serverimplementierung. Darüber hinaus sollte sie nicht von einem Dienst verwendet werden. Verwenden Sie für Serverimplementierungen oder -dienste Microsoft Windows HTTP Services (WinHTTP).