Freigeben über


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 InternetOpenUrl-finden Sie unter Zugreifen auf URLs direkt.

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.
  • Aufzählen, Erstellen, Entfernen und Umbenennen von Verzeichnissen.
  • Umbenennen, Hochladen, Herunterladen und Löschen von Dateien

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 gerade befindet, oder um zu einem anderen Unterverzeichnis zu wechseln.

Die Verzeichnisaufzählung wird mithilfe der funktionen FtpFindFirstFile und InternetFindNextFile ausgeführt. FtpFindFirstFile verwendet das sitzungshandle, das von InternetConnect erstellt wurde, 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 verbleiben.

Verwenden Sie die FtpCreateDirectory--Funktion, um neue Verzeichnisse zu erstellen. Diese Funktion verwendet das von InternetConnect erstellte Sitzungshandle und erstellt das durch die an die Funktion übergebene Zeichenfolge angegebene Verzeichnis. 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.

Um Dateien auf einem FTP-Server hochzuladen oder zu platzieren, 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 auf dem FTP-Server in eine Datei geschrieben werden müssen.

Um Dateien herunterzuladen oder abzurufen, 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, wo die heruntergeladenen Informationen ausgeführt werden (z. B. kann die Anwendung die Informationen in einem Bearbeitungsfeld anzeigen).

Löschen Sie Dateien auf einem FTP-Server mithilfe der funktion FtpDeleteFile. Diese Funktion entfernt einen Dateinamen, der relativ zum aktuellen Verzeichnis oder zu einem vollqualifizierten Dateinamen vom FTP-Server ist. FtpDeleteFile- erfordert ein Sitzungshandle, das von InternetConnect-zurückgegeben wird.

FTP-Funktionshandles

Um ordnungsgemäß zu funktionieren, benötigen die FTP-Funktionen bestimmte Typen von HINTERNET- Handles. Diese Handles müssen in einer bestimmten Reihenfolge erstellt werden, beginnend mit dem Stammhandle, das von InternetOpenerstellt wurde. 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 von der Funktion erstellte HINTERNET-Handle verwenden, von dem sie abhängen.

ftp-Funktionen abhängig vom ftp-Sitzungshandle, das von internetconnect

Das folgende Diagramm zeigt die beiden Funktionen, die HINTERNET--Handles und die von ihnen abhängigen Funktionen zurückgeben. 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 wird, von der sie abhängen.

ftp-Funktionen, die Hinternet-Handles

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 Zugreifen auf URLs direkt.

Funktion Beschreibung
FtpCreateDirectory- Erstellt ein neues Verzeichnis auf dem Server. Für diese Funktion ist ein Handle erforderlich, das von InternetConnect-erstellt wurde.
FtpDeleteFile- Löscht eine Datei vom Server. Für diese Funktion ist ein Handle erforderlich, das von InternetConnect-erstellt wurde.
FtpFindFirstFile- Startet die Dateiaufzählung oder Dateisuche im aktuellen Verzeichnis. Für diese Funktion ist ein Handle erforderlich, das von InternetConnect-erstellt wurde.
FtpGetCurrentDirectory Gibt das aktuelle Verzeichnis des Clients auf dem Server zurück. Für diese Funktion ist ein Handle erforderlich, das von InternetConnect-erstellt wurde.
FtpGetFile- Ruft eine Datei vom Server ab. Für diese Funktion ist ein Handle erforderlich, das von InternetConnect-erstellt wurde.
FtpOpenFile- Initiiert den Zugriff auf eine Datei auf dem Server zum Lesen oder Schreiben. Für diese Funktion ist ein Handle erforderlich, das von InternetConnect-erstellt wurde.
FtpPutFile- Schreibt eine Datei auf den Server. Für diese Funktion ist ein Handle erforderlich, das von InternetConnect-erstellt wurde.
FtpRemoveDirectory Löscht ein Verzeichnis auf dem Server. Für diese Funktion ist ein Handle erforderlich, das von InternetConnect-erstellt wurde.
FtpRenameFile- Benennt eine Datei auf dem Server um. Für diese Funktion ist ein Handle erforderlich, das von InternetConnect-erstellt wurde.
FtpSetCurrentDirectory Ändert das aktuelle Verzeichnis des Clients auf dem Server. Für diese Funktion ist ein Handle erforderlich, das von InternetConnect-erstellt wurde.
InternetWriteFile- Schreibt Daten in eine geöffnete Datei auf dem Server. Für diese Funktion ist ein Handle erforderlich, der 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). Für passive FTP-Semantik muss die Anwendung auch das INTERNET_FLAG_PASSIVE 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 den Benutzernamen und das Kennwort können auf NULL-festgelegt werden. Wenn beide Werte auf NULL-festgelegt sind, verwendet InternetConnect für den Benutzernamen "anonym" 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 kein Wert NULL-ist, werden der Benutzername und das Kennwort verwendet, das InternetConnect- angegeben wird.

Aufzählen von Verzeichnissen

Für die Aufzählung eines Verzeichnisses auf einem FTP-Server ist die Erstellung eines Handles durch FtpFindFirstFile-erforderlich. Dieses Handle ist eine Verzweigung des Sitzungshandles, das von InternetConnecterstellt wird. FtpFindFirstFile die erste Datei oder das erste Verzeichnis auf dem Server findet und in einer WIN32_FIND_DATA Struktur zurückgibt. Verwenden Sie InternetFindNextFile-, bis sie ERROR_NO_MORE_FILESzurückgibt. Diese Methode findet alle nachfolgenden Dateien und Verzeichnisse auf dem Server. Weitere Informationen zu InternetFindNextFile-finden Sie unter Suchen der nächsten Datei.

Um festzustellen, ob die datei, die von FtpFindFirstFile oder InternetFindNextFile ein Verzeichnis ist, überprüfen Sie das dwFileAttributes Member der WIN32_FIND_DATA-Struktur, um festzustellen, ob sie gleich FILE_ATTRIBUTE_DIRECTORY ist.

Wenn die Anwendung Änderungen am FTP-Server vor nimmt oder sich der FTP-Server häufig ändert, sollten die INTERNET_FLAG_NO_CACHE_WRITE und INTERNET_FLAG_RELOAD Flags in FtpFindFirstFilefestgelegt werden. Diese Flags stellen sicher, dass die Verzeichnisinformationen, die vom FTP-Server abgerufen werden, aktuell sind.

Nachdem die Anwendung die Verzeichnisaufzählung abgeschlossen hat, muss die Anwendung einen Aufruf InternetCloseHandle- für das handle ausführen, das von FtpFindFirstFileerstellt wurde. Bis dieses Handle geschlossen ist, kann die Anwendung FtpFindFirstFile erneut auf dem Sitzungshandle aufrufen, das von InternetConnecterstellt wurde. Wenn ein Aufruf von FtpFindFirstFile auf demselben Sitzungshandle ausgeführt wird, bevor der vorherige Aufruf derselben Funktion geschlossen wird, schlägt die Funktion fehl, und gibt ERROR_FTP_TRANSFER_IN_PROGRESSzurück.

Im folgenden Beispiel wird der Inhalt eines FTP-Verzeichnisses in ein Listenfeld-Steuerelement aufgelistet. Der hConnection Parameter ist ein Handle, das von der InternetConnect--Funktion zurückgegeben wird, nachdem eine FTP-Sitzung eingerichtet wurde. Beispielquellcode für die In diesem Beispiel referenzierte InternetErrorOut-Funktion finden Sie im Thema Behandeln von Fehlern.

#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 FtpGetCurrentDirectory und FtpSetCurrentDirectory Funktionen verarbeiten die Verzeichnisnavigation.

FtpGetCurrentDirectory 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 verzeichnisbezogenen Informationen, die an FtpSetCurrentDirectory übergeben werden, können entweder ein teilweiser oder vollqualifizierter Pfadname relativ zum aktuellen Verzeichnis sein. Wenn sich die Anwendung z. B. aktuell im Verzeichnis "public/info" befindet und der Pfad "ftp/example" lautet, FtpSetCurrentDirectory das aktuelle Verzeichnis in "public/info/ftp/example" ändert.

Im folgenden Beispiel wird das FTP-Sitzungshandle hConnection verwendet, das von InternetConnect-zurückgegeben wird. Der neue Verzeichnisname stammt aus dem Bearbeitungsfeld des übergeordneten Dialogfelds, dessen IDC in der nDirNameId Parameter ü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 beim Erstellen des FTP-Sitzungshandles in InternetConnect- verwendet werden.

Die FtpCreateDirectory--Funktion akzeptiert ein gültiges FTP-Sitzungshandle und eine null--terminated-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 an FtpCreateDirectory. In beiden Beispielen ist hFtpSession das Sitzungshandle, das von der funktion InternetConnect erstellt wird, 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 übernimmt ein Sitzungshandle und eine null--terminated-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 an FtpRemoveDirectory. In beiden Aufrufen ist hFtpSession das Sitzungshandle, das von der funktion InternetConnect erstellt wird, und das Stammverzeichnis ist das aktuelle Verzeichnis. Es gibt ein Verzeichnis namens "test" im Stammverzeichnis und ein Verzeichnis namens "example" im Verzeichnis "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. */

Im folgenden Beispiel wird ein neues Verzeichnis auf dem FTP-Server erstellt. Der neue Verzeichnisname stammt aus dem Bearbeitungsfeld des übergeordneten Dialogfelds, dessen IDC in der nDirNameId Parameter übergeben wird. Das hConnection Handle wurde durch InternetConnect erstellt, nachdem eine FTP-Sitzung eingerichtet wurde. Der Quellcode für die DisplayFtpDir-Funktion, die am Ende aufgerufen wird, wird 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 stammt aus dem Bearbeitungsfeld im übergeordneten Dialogfeld, dessen IDC an den parameter nDirNameId übergeben wird. Das hConnection Handle wurde durch InternetConnect erstellt, nachdem eine FTP-Sitzung eingerichtet wurde. Der Quellcode für die DisplayFtpDir-Funktion, die am Ende aufgerufen wird, wird 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 Lesedateien.

Wenn die URL der Datei verfügbar ist, kann die Anwendung InternetOpenUrl- aufrufen, um eine Verbindung mit dieser URL herzustellen, und verwenden Sie InternetReadFile-, um den Download der Datei zu steuern. Dies ermöglicht der Anwendung eine engere Kontrolle über den Download und eignet sich ideal für Situationen, in denen keine anderen Vorgänge auf dem FTP-Server vorgenommen werden müssen. Weitere Informationen zum direkten Zugriff auf Ressourcen finden Sie unter Zugreifen auf URLs direkt.

Wenn die Anwendung ein FTP-Sitzungshandle für den Server mit InternetConnecteingerichtet 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 engere Kontrolle über den Download und hält die Verbindung mit dem FTP-Server, 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-Sitzungshandle, dem Remotedateinamen und dem lokalen Dateinamen verwenden, um die Datei abzurufen. FtpGetFile- führt alle Buchführungs- und Overhead-Vorgänge aus, die mit dem Lesen einer Datei von einem FTP-Server verbunden sind und lokal gespeichert werden.

Im folgenden Beispiel wird eine Datei von einem FTP-Server abgerufen und lokal gespeichert. Der Name der Datei auf dem FTP-Server stammt aus dem Bearbeitungsfeld im übergeordneten Dialogfeld, dessen IDC in der nFtpFileNameId Parameter übergeben wird, und der lokale Name, unter dem die Datei gespeichert wird, aus dem Bearbeitungsfeld entnommen wird, dessen IDC in der nLocalFileNameId Parameter übergeben wird. Das hConnection Handle wurde durch 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 keine lokale Datei mit allen 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 gesamten Aufwand aus, der mit dem Hochladen einer lokalen Datei auf einen Remote-FTP-Server verbunden ist.

Im folgenden Beispiel wird eine lokale Datei auf den FTP-Server kopiert. Der lokale Name der Datei stammt aus dem Bearbeitungsfeld im übergeordneten Dialogfeld, dessen IDC in der nLocalFileNameId Parameter übergeben wird, und der Name, unter dem die Datei auf dem FTP-Server gespeichert wird, wird aus dem Bearbeitungsfeld entnommen, dessen IDC in der nFtpFileNameId Parameter übergeben wird. Das hConnection Handle wurde durch 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 funktion FtpDeleteFile. 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 stammt aus dem Bearbeitungsfeld im übergeordneten Dialogfeld, dessen IDC int der nFtpFileNameId Parameter übergeben wird. Das hConnection Handle wurde durch InternetConnect erstellt, nachdem eine FTP-Sitzung eingerichtet wurde. Da diese Funktion keine Dateiauflistungen oder Verzeichnisanzeigen aktualisiert, sollte der Aufrufvorgang bei erfolgreicher Löschung ausgeführt werden.

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 funktion FtpRenameFile umbenannt werden. FtpRenameFile- akzeptiert zwei NULL--terminated-Zeichenfolgen, die entweder teilweise oder vollqualifizierte Namen relativ zum aktuellen Verzeichnis enthalten. Die Funktion ändert den Namen der Datei, die durch die erste Zeichenfolge festgelegt wurde, in den Namen, der durch die zweite Zeichenfolge festgelegt wurde.

Im folgenden Beispiel wird eine Datei oder ein Verzeichnis auf dem FTP-Server umbenannt. Der aktuelle Name der Datei oder des Verzeichnisses stammt aus dem Bearbeitungsfeld im übergeordneten Dialogfeld, dessen IDC in der nOldFileNameId Parameter übergeben wird, und der neue Name wird aus dem Bearbeitungsfeld übernommen, dessen IDC in der nNewFileNameId Parameter übergeben wird. Das hConnection Handle wurde durch InternetConnect erstellt, nachdem eine FTP-Sitzung eingerichtet wurde. Da diese Funktion keine Dateiauflistungen oder Verzeichnisanzeigen aktualisiert, sollte der Aufrufvorgang dies bei 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
}

Anmerkung

WinINet unterstützt keine Serverimplementierungen. Darüber hinaus sollte sie nicht von einem Dienst verwendet werden. Verwenden Sie für Serverimplementierungen oder -dienste Microsoft Windows HTTP Services (WinHTTP).