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 InternetOpenUrl finden 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 Sie zwischen Verzeichnissen.
  • Auflisten, Erstellen, Entfernen und Umbenennen von Verzeichnissen.
  • Umbenennen, Hochladen, Herunterladen und Löschen von Dateien.

Die Navigation wird von den 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 gerade befindet, oder um in ein anderes Unterverzeichnis zu wechseln.

Die Verzeichnisaufzählung 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 Verzeichnisaufzählung 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 FtpRenameFile aufrufen. 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 gehen (z. B. könnte die Anwendung die Informationen 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 von InternetConnect zurückgegebenes Sitzungshandle.

FTP-Funktionshandles

Um ordnungsgemäß zu funktionieren, erfordern die FTP-Funktionen bestimmte Typen von HINTERNET-Handles . Diese Handles müssen in einer bestimmten Reihenfolge erstellt werden, beginnend mit dem von InternetOpen erstellten Stammhandle. InternetConnect kann dann ein FTP-Sitzungshandle erstellen.

Das folgende Diagramm zeigt die Funktionen, die vom von InternetConnect zurückgegebenen FTP-Sitzungshandle abhängig sind. 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.

ftp-Funktionen, die vom von internetconnect zurückgegebenen FTP-Sitzungshandle abhängen

Das folgende Diagramm zeigt die beiden Funktionen, die HINTERNET-Handles zurückgeben, und die Funktionen, die davon abhängig sind. 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.

ftp-Funktionen, die Hinternet-Handles zurückgeben

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 von InternetConnect erstelltes Handle.
FtpDeleteFile Löscht eine Datei vom Server. Diese Funktion erfordert ein von InternetConnect erstelltes Handle.
FtpFindFirstFile Startet die Dateiaufzählung oder Dateisuche im aktuellen Verzeichnis. Diese Funktion erfordert ein von InternetConnect erstelltes Handle.
FtpGetCurrentDirectory Gibt das aktuelle Verzeichnis des Clients auf dem Server zurück. Diese Funktion erfordert ein von InternetConnect erstelltes Handle.
FtpGetFile Ruft eine Datei vom Server ab. Diese Funktion erfordert ein von InternetConnect erstelltes Handle.
FtpOpenFile Initiiert den Zugriff auf eine Datei auf dem Server zum Lesen oder Schreiben. Diese Funktion erfordert ein von InternetConnect erstelltes Handle.
FtpPutFile Schreibt eine Datei auf den Server. Diese Funktion erfordert ein von InternetConnect erstelltes Handle.
FtpRemoveDirectory Löscht ein Verzeichnis auf dem Server. Diese Funktion erfordert ein von InternetConnect erstelltes Handle.
FtpRenameFile Benennt eine Datei auf dem Server um. Diese Funktion erfordert ein von InternetConnect erstelltes Handle.
FtpSetCurrentDirectory Ändert das aktuelle Verzeichnis des Clients auf dem Server. Diese Funktion erfordert ein von InternetConnect erstelltes Handle.
InternetWriteFile Schreibt Daten in eine geöffnete Datei auf dem Server. Diese Funktion erfordert ein von FtpOpenFile erstelltes Handle.

 

Starten einer FTP-Sitzung

Die Anwendung richtet eine FTP-Sitzung durch Aufrufen von InternetConnect für ein von InternetOpen erstelltes Handle ein. 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 flag INTERNET_FLAG_PASSIVE 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 FTP-Standardport, 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 "anonym" für den 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 verwendet, und für das Kennwort wird eine leere Zeichenfolge verwendet. Wenn keiner der Werte NULL ist, werden der Benutzername und das Kennwort für InternetConnect verwendet.

Auflisten von Verzeichnissen

Die Enumeration eines Verzeichnisses auf einem FTP-Server erfordert die Erstellung eines Handle durch FtpFindFirstFile. Dieses Handle ist ein Branch des von InternetConnect erstellten Sitzungshandles. 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_FILES zurückgegeben wird. Diese Methode sucht alle nachfolgenden Dateien und Verzeichnisse auf dem Server. Weitere Informationen zu InternetFindNextFile finden 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-Element der WIN32_FIND_DATA Struktur, um festzustellen, ob sie gleich FILE_ATTRIBUTE_DIRECTORY ist.

Wenn die Anwendung Änderungen auf dem FTP-Server vornimmt 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 Verzeichnisaufzählung abgeschlossen hat, muss die Anwendung internetCloseHandle für das von FtpFindFirstFile erstellte Handle aufrufen. Bis dieses Handle geschlossen ist, kann die Anwendung FtpFindFirstFile nicht erneut für das von InternetConnect erstellte Sitzungshandle aufrufen. Wenn ein Aufruf von FtpFindFirstFile für dasselbe Sitzungshandle erfolgt, bevor der vorherige Aufruf derselben Funktion geschlossen wird, schlägt die Funktion fehl, wodurch ERROR_FTP_TRANSFER_IN_PROGRESS zurückgegeben wird.

Im folgenden Beispiel werden die Inhalte eines FTP-Verzeichnisses in einem Listenfeldsteuerelement aufgelistet. Der hConnection-Parameter ist ein Handle, das von der InternetConnect-Funktion zurückgegeben wird, nachdem sie eine FTP-Sitzung eingerichtet hat. Beispielquellcode für die InternetErrorOut-Funktion, auf die in diesem Beispiel verwiesen wird, finden Sie im Thema Behandlungsfehler.

#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 );
}

Die Funktionen FtpGetCurrentDirectory und FtpSetCurrentDirectory behandeln 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 teilweise oder vollständig qualifizierter Pfadname relativ zum aktuellen Verzeichnis sein. Wenn sich die Anwendung beispielsweise derzeit im Verzeichnis "public/info" befindet und der Pfad "ftp/example" lautet, ändert FtpSetCurrentDirectory das aktuelle Verzeichnis in "public/info/ftp/example".

Im folgenden Beispiel wird das FTP-Sitzungshandle 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 selben 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 );
}

Ändern 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 beim Erstellen des FTP-Sitzungshandles verwendet werden.

Die FtpCreateDirectory-Funktion verwendet ein gültiges FTP-Sitzungshandle und eine null-beendete Zeichenfolge, die entweder einen vollqualifizierten Pfad oder einen Namen relativ zum aktuellen Verzeichnis enthält, und erstellt ein Verzeichnis auf dem FTP-Server.

Das folgende Beispiel zeigt zwei separate Aufrufe von FtpCreateDirectory. In beiden Beispielen ist hFtpSession das von der InternetConnect-Funktion erstellte Sitzungshandle, 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 Sitzungshandle und eine null-beendete Zeichenfolge, die entweder einen vollqualifizierten Pfad oder einen Namen relativ zum aktuellen Verzeichnis enthält, und entfernt dieses Verzeichnis vom FTP-Server.

Das folgende Beispiel zeigt zwei Beispielaufrufe von FtpRemoveDirectory. In beiden Aufrufen ist hFtpSession das Sitzungshandle, 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" ein Verzeichnis namens "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 nDirNameId-Parameter ü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:

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. Verwenden Sie dann InternetReadFile , um den Download der Datei zu steuern. Dies ermöglicht der Anwendung eine engere Kontrolle über den Download und ist 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 ein FTP-Sitzungshandle für den Server mit InternetConnect eingerichtet hat, kann die Anwendung FtpOpenFile mit dem vorhandenen Dateinamen und 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 engere 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 strenge Kontrolle über den Download benötigt, kann die Anwendung FtpGetFile mit dem FTP-Sitzungshandle, dem Remotedateinamen und dem lokalen Dateinamen verwenden, um die Datei abzurufen. FtpGetFile führt den gesamten Buchführungs- und Mehraufwand aus, der mit dem Lesen einer Datei von einem FTP-Server und ihrer lokalen Speicherung verbunden ist.

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 nFtpFileNameId-Parameter übergeben wird, und der lokale Name, unter dem die Datei gespeichert wird, wird aus dem Bearbeitungsfeld entnommen, 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:

Eine Anwendung, die Daten an einen FTP-Server senden muss, aber nicht über eine lokale Datei mit allen Daten verfügt, 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 übernimmt den gesamten Mehraufwand, 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

Um eine Datei von einem FTP-Server zu löschen, verwenden Sie die FtpDeleteFile-Funktion . Die aufrufende Anwendung muss über die erforderlichen Berechtigungen verfügen, um eine Datei vom FTP-Server zu löschen.

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 im Parameter nFtpFileNameId übergeben wird. Das hConnection-Handle wurde von InternetConnect erstellt, nachdem eine FTP-Sitzung eingerichtet wurde. Da diese Funktion keine Dateiauflistungen oder Verzeichnisanzeigen aktualisiert, sollte dies beim erfolgreichen Löschen durch den aufrufenden Prozess erfolgen.

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 NULL-beendete Zeichenfolgen, die entweder teilweise oder vollqualifizierte Namen relativ zum aktuellen Verzeichnis enthalten. Die Funktion ändert den Namen der von der ersten Zeichenfolge angegebenen Datei in den Namen, der durch die zweite Zeichenfolge festgelegt ist.

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 Dateilisten oder Verzeichnisanzeigen 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 Serverimplementierungen. Darüber hinaus sollte es nicht von einem Dienst aus verwendet werden. Verwenden Sie für Serverimplementierungen oder Dienste Microsoft Windows HTTP Services (WinHTTP).