FTP 會話

WinINet 可讓應用程式巡覽及操作 ftp 伺服器上的目錄和檔案。 因為 CERN Proxy 不支援 FTP,所以單獨使用 CERN Proxy 的應用程式必須使用 InternetOpenUrl 函式。 如需如何使用 InternetOpenUrl的詳細資訊,請參閱 直接存取 URL

若要開始 FTP 會話,請使用 InternetConnect 建立會話控制碼。

WinINet 可讓您在 FTP 伺服器上執行下列動作:

  • 在目錄之間巡覽。
  • 列舉、建立、移除和重新命名目錄。
  • 重新命名、上傳、下載和刪除檔案。

流覽是由 FtpGetCurrentDirectoryFtpSetCurrentDirectory 函式所提供。 這些函式會利用先前呼叫 InternetConnect 所建立的會話控制碼來判斷應用程式目前所在的目錄,或變更為不同的子目錄。

目錄列舉是使用 FtpFindFirstFileInternetFindNextFile 函式來執行。 FtpFindFirstFile 會使用 InternetConnect 建立的會話控制碼來尋找符合指定搜尋準則的第一個檔案,並傳回控制碼以繼續目錄列舉。 InternetFindNextFile 會使用 FtpFindFirstFile 傳回的控制碼,傳回符合原始搜尋準則的下一個檔案。 應用程式應該會繼續呼叫 InternetFindNextFile ,直到目錄中沒有剩餘的檔案為止。

使用 FtpCreateDirectory 函 式來建立新的目錄。 此函式會使用 InternetConnect 所建立的會話控制碼,並建立傳遞至函式的字串所指定的目錄。 字串可以包含相對於目前目錄或完整目錄路徑的目錄名稱。

若要重新命名檔案或目錄,應用程式可以呼叫 FtpRenameFile。 此函式會將原始名稱取代為傳遞至函式的新名稱。 檔案或目錄的名稱可以是相對於目前目錄或完整名稱。

若要上傳或放置 FTP 伺服器上的檔案,應用程式可以使用FtpPutFile 或 FtpOpenFile (以及InternetWriteFile) 。 如果檔案已經存在本機,則可以使用FtpPutFile,而如果需要將資料寫入 FTP 伺服器上的檔案,可以使用FtpOpenFileInternetWriteFile

若要下載或取得檔案,應用程式可以使用FtpGetFile 或 FtpOpenFile (搭配InternetReadFile) 。 FtpGetFile 可用來從 FTP 伺服器擷取檔案並將其儲存在本機,而 FtpOpenFileInternetReadFile 可用來控制下載資訊 (的位置,例如,應用程式可以在編輯方塊中顯示資訊) 。

使用 FtpDeleteFile 函式刪除 FTP 伺服器上的檔案。 此函式會從 FTP 伺服器移除相對於目前目錄或完整檔案名的檔案名。 FtpDeleteFile 需要 InternetConnect傳回的會話控制碼。

FTP 函式控制碼

若要正常運作,FTP 函式需要特定類型的 HINTERNET 控制碼。 這些控制碼必須依照特定順序建立,從 InternetOpen所建立的根控制碼開始。 InternetConnect 接著可以建立 FTP 會話控制碼。

下圖顯示與 InternetConnect所傳回之 FTP 會話控制碼相依的函式。 陰影方塊代表傳回 HINTERNET 控制碼的函式,而純方塊則代表使用函式所建立之 HINTERNET 控制碼的函式。

ftp 函式相依于 internetconnect 所傳回的 ftp 會話控制碼

下圖顯示傳回 HINTERNET 控制碼的兩個函式,以及相依的函式。 陰影方塊代表傳回 HINTERNET 控制碼的函式,而純方塊則代表使用函式所建立 之 HINTERNET 控制碼的函式。

傳回 hinternet 控制碼的 ftp 函式

如需詳細資訊,請參閱 HINTERNET 控制碼

使用適用于 FTP 會話的 WinINet 函式

FTP 會話期間會使用下列函式。 CERN Proxy 無法辨識這些函式。 必須透過 CERN Proxy 運作的應用程式應該使用 InternetOpenUrl ,並直接存取資源。 如需直接資源存取的詳細資訊,請參閱 直接存取 URL

函式 描述
FtpCreateDirectory 在伺服器上建立新的目錄。 此函式需要 InternetConnect所建立的控制碼。
FtpDeleteFile 從伺服器刪除檔案。 此函式需要 InternetConnect所建立的控制碼。
FtpFindFirstFile 啟動目前目錄中的檔案列舉或檔案搜尋。 此函式需要 InternetConnect所建立的控制碼。
FtpGetCurrentDirectory 傳回伺服器上的用戶端目前目錄。 此函式需要 InternetConnect所建立的控制碼。
FtpGetFile 從伺服器擷取檔案。 此函式需要 InternetConnect所建立的控制碼。
FtpOpenFile 起始伺服器上檔案的讀取或寫入存取權。 此函式需要 InternetConnect所建立的控制碼。
FtpPutFile 將檔案寫入伺服器。 此函式需要 InternetConnect所建立的控制碼。
FtpRemoveDirectory 刪除伺服器上的目錄。 此函式需要 InternetConnect所建立的控制碼。
FtpRenameFile 重新命名伺服器上的檔案。 此函式需要 InternetConnect所建立的控制碼。
FtpSetCurrentDirectory 變更伺服器上的用戶端目前目錄。 此函式需要 InternetConnect所建立的控制碼。
InternetWriteFile 將資料寫入伺服器上開啟的檔案。 此函式需要 FtpOpenFile所建立的控制碼。

 

啟動 FTP 會話

應用程式會在InternetOpen所建立的控制碼上呼叫InternetConnect,以建立 FTP 會話。 InternetConnect 需要伺服器名稱、埠號碼、使用者名稱、密碼和服務類型 (必須設定為INTERNET_SERVICE_FTP) 。 針對被動 FTP 語意,應用程式也必須設定 INTERNET_FLAG_PASSIVE 旗標。

INTERNET_DEFAULT_FTP_PORT和INTERNET_INVALID_PORT_NUMBER值可用於埠號碼。 INTERNET_DEFAULT_FTP_PORT會使用預設 FTP 埠,但仍必須設定服務類型。 INTERNET_INVALID_PORT_NUMBER會針對指定的服務類型使用預設值。

使用者名稱和密碼的值可以設定為 Null。 如果這兩個值都設定為 NullInternetConnect 會使用 「anonymous」 做為使用者名稱,並使用使用者的電子郵件地址做為密碼。 如果只有密碼設定為 Null,則傳遞至 InternetConnect 的使用者名稱會用於使用者名稱,而空字串則用於密碼。 如果兩個值都不是 Null,則會使用提供給 InternetConnect 的使用者名稱和密碼。

列舉目錄

FTP 伺服器上的目錄列舉需要建立 FtpFindFirstFile的控制碼。 此控制碼是 InternetConnect所建立之會話控制碼的分支。 FtpFindFirstFile 會找出伺服器上的第一個檔案或目錄,並在 WIN32_FIND_DATA 結構中傳回該檔案。 使用 InternetFindNextFile ,直到傳回 ERROR_NO_MORE_FILES為止。 此方法會尋找伺服器上的所有後續檔案和目錄。 如需 InternetFindNextFile的詳細資訊,請參閱 尋找下一個檔案

若要判斷FtpFindFirstFileInternetFindNextFile所擷取的檔案是否為目錄,請檢查WIN32_FIND_DATA結構的dwFileAttributes成員,以查看它是否等於FILE_ATTRIBUTE_DIRECTORY。

如果應用程式在 FTP 伺服器上進行變更,或 FTP 伺服器經常變更,則應該在FtpFindFirstFile中設定INTERNET_FLAG_NO_CACHE_WRITEINTERNET_FLAG_RELOAD旗標。 這些旗標可確保從 FTP 伺服器擷取的目錄資訊是最新的。

應用程式完成目錄列舉之後,應用程式必須在FtpFindFirstFile所建立的控制碼上呼叫InternetCloseHandle。 在關閉該控制碼之前,應用程式無法在InternetConnect所建立的會話控制碼上再次呼叫FtpFindFirstFile。 如果在關閉對相同函式的上一個呼叫之前,在相同的會話控制碼上呼叫 FtpFindFirstFile ,則函式會失敗,並傳回 ERROR_FTP_TRANSFER_IN_PROGRESS

下列範例會將 FTP 目錄的內容列舉到清單方塊控制項中。 hConnection參數是在建立 FTP 會話之後,InternetConnect函式所傳回的控制碼。 如需此範例中所參考之 InternetErrorOut 函式的範例原始程式碼,請參閱 處理錯誤主題。

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

FtpGetCurrentDirectoryFtpSetCurrentDirectory 函式會處理瀏覽目錄。

FtpGetCurrentDirectory 會傳回 FTP 伺服器上的應用程式目前目錄。 FTP 伺服器上的根目錄包含目錄路徑。

FtpSetCurrentDirectory 會變更伺服器上的工作目錄。 傳遞至 FtpSetCurrentDirectory 的目錄資訊可以是相對於目前目錄的部分或完整路徑名稱。 例如,如果應用程式目前位於目錄 「public/info」,且路徑為 「ftp/example」, FtpSetCurrentDirectory 會將目前目錄變更為 「public/info/ftp/example」。

下列範例使用 InternetConnect 所傳回的 FTP 會話控制碼 hConnection。 新的目錄名稱取自父對話方塊的編輯方塊,其 IDC 會傳入 nDirNameId 參數。 在進行目錄變更之前,函式會擷取目前的目錄,並將它儲存在相同的編輯方塊中。 上面列出在結尾所呼叫 DisplayFtpDir 函式的 souce 程式碼。

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

操作 FTP 伺服器上的目錄

WinINet 提供在應用程式具有必要許可權的 FTP 伺服器上建立和移除目錄的功能。 如果應用程式必須登入具有特定使用者名稱和密碼的伺服器,則建立 FTP 會話控制碼時,可以在 InternetConnect 中使用這些值。

FtpCreateDirectory函式會採用有效的 FTP 會話控制碼,以及包含完整路徑或相對於目前目錄的名稱,並在 FTP 伺服器上建立目錄的Null終止字串。

下列範例顯示 FtpCreateDirectory的兩個不同的呼叫。 在這兩個範例中,hFtpSession 是 InternetConnect 函式所建立的會話控制碼,而根目錄則是目前的目錄。

/* Creates the directory "test" in the current (root) directory. */
FtpCreateDirectory( hFtpSession, "test" );

/* Creates the directory "example" in the test directory. */
FtpCreateDirectory( hFtpSession, "\\test\\example" );

FtpRemoveDirectory函式會採用會話控制碼和以 Null結尾的字串,其中包含與目前目錄相關的完整路徑或名稱,並從 FTP 伺服器中移除該目錄。

下列範例顯示 FtpRemoveDirectory的兩個範例呼叫。 在這兩個呼叫中,hFtpSession 都是 InternetConnect 函式所建立的會話控制碼,而根目錄則是目前的目錄。 根目錄中有一個名為 「test」 的目錄,以及 「test」 目錄中名為 「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. */

下列範例會在 FTP 伺服器上建立新的目錄。 新的目錄名稱取自父對話方塊的編輯方塊,其 IDC 會傳入 nDirNameId 參數。 建立 FTP 會話之後,InternetConnect 會建立 hConnection控制碼。 上面列出在結尾所呼叫 DisplayFtpDir 函式的原始程式碼。

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

下列範例會從 FTP 伺服器刪除目錄。 要刪除的目錄名稱取自父對話方塊中的編輯方塊,其 IDC 會傳遞至 nDirNameId 參數。 建立 FTP 會話之後,InternetConnect 會建立 hConnection控制碼。 上面列出在結尾所呼叫 DisplayFtpDir 函式的原始程式碼。

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

取得 FTP 伺服器上的檔案

從 FTP 伺服器擷取檔案的方法有三種:

如需使用 InternetReadFile 函式的詳細資訊,請參閱 讀取檔案

如果檔案的 URL 可用,應用程式可以呼叫 InternetOpenUrl 以連線到該 URL,然後使用 InternetReadFile 來控制檔案的下載。 這可讓應用程式更嚴格地控制下載,非常適合不需要在 FTP 伺服器上執行其他作業的情況。 如需如何直接存取資源的詳細資訊,請參閱 直接存取 URL

如果應用程式已建立網際網路 Connect伺服器的 FTP 會話控制碼,應用程式可以使用現有的檔案名呼叫 FtpOpenFile,並使用本機預存檔案的新名稱呼叫 FtpOpenFile 。 應用程式接著可以使用 InternetReadFile 來下載檔案。 這可讓應用程式更嚴格地控制下載,並保留與 FTP 伺服器的連線,因此可以執行更多命令。

如果應用程式不需要嚴格控制下載,應用程式可以使用 FtpGetFile 搭配 FTP 會話控制碼、遠端檔案名和本機檔案名來擷取檔案。 FtpGetFile 會執行與從 FTP 伺服器讀取檔案並儲存在本機上相關聯的所有記事和額外負荷。

下列範例會從 FTP 伺服器擷取檔案,並將它儲存在本機。 FTP 伺服器上的檔案名取自父對話方塊中的編輯方塊,其 IDC 在 nFtpFileNameId 參數中傳遞,而儲存檔案所在的本機名稱則取自 IDC 在 nLocalFileNameId 參數中傳遞的編輯方塊。 建立 FTP 會話之後,InternetConnect 會建立 hConnection控制碼。

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

將檔案放在 FTP 伺服器上

在 FTP 伺服器上放置檔案的方法有兩種:

必須將資料傳送至 FTP 伺服器但沒有包含所有資料的本機檔案的應用程式,應該使用 FtpOpenFile 在 ftp 伺服器上建立和開啟檔案。 應用程式接著可以使用 InternetWriteFile 將資訊上傳至檔案。

如果檔案已存在於本機,應用程式可以使用 FtpPutFile 將檔案上傳至 FTP 伺服器。 FtpPutFile 會執行將本機檔案上傳至遠端 FTP 伺服器的所有額外負荷。

下列範例會將本機檔案複製到 FTP 伺服器。 檔案的本機名稱取自父對話方塊中的編輯方塊,其 IDC 在 nLocalFileNameId 參數中傳遞,而 FTP 伺服器上儲存檔案的名稱則取自 IDC 在 nFtpFileNameId 參數中傳遞的編輯方塊。 建立 FTP 會話之後,InternetConnect 會建立 hConnection控制碼。

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
}

從 FTP 伺服器刪除檔案

若要從 FTP 伺服器刪除檔案,請使用 FtpDeleteFile 函式。 呼叫端應用程式必須具有從 FTP 伺服器刪除檔案的必要許可權。

下列範例會從 FTP 伺服器中刪除檔案。 要刪除的檔案名取自父對話方塊中的編輯方塊,其 IDC 會傳入 nFtpFileNameId 參數。 建立 FTP 會話之後,InternetConnect 會建立 hConnection控制碼。 由於此函式不會重新整理檔案清單或目錄顯示,因此在成功刪除時,呼叫程式應該執行此動作。

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
}

重新命名 FTP 伺服器上的檔案和目錄

FTP 伺服器上的檔案和目錄可以使用 FtpRenameFile 函式重新命名。 FtpRenameFile 接受兩個 以 Null結尾的字串,其中包含相對於目前目錄的部分或完整名稱。 函式會將第一個字串所指定的檔案名變更為第二個字串所指定的名稱。

下列範例會重新命名 FTP 伺服器上的檔案或目錄。 檔案或目錄的目前名稱取自父對話方塊中的編輯方塊,其 IDC 會傳入 nOldFileNameId 參數,而新名稱取自 IDC 在 nNewFileNameId 參數中傳遞的編輯方塊。 建立 FTP 會話之後,InternetConnect 會建立 hConnection控制碼。 由於此函式不會重新整理檔案清單或目錄顯示,因此在成功重新命名時,呼叫程式應該執行此動作。

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
}

注意

WinINet 不支援伺服器實作。 此外,它不應該從服務使用。 對於伺服器實作或服務,請使用 Microsoft Windows HTTP 服務 (WinHTTP)