WinINet 使應用程式能夠導航和作 ftp 伺服器上的目錄和檔。 由於 CERN 代理不支援 FTP,因此專門使用 CERN 代理的應用程式必須使用 InternetOpenUrl 函數。 有關如何使用 InternetOpenUrl 的更多資訊,請參閱 直接訪問 URL。
要開始 FTP 工作階段,請使用 InternetConnect 創建工作階段句柄。
WinINet 允許您在 FTP 伺服器上執行以下作:
- 在目錄之間導航。
- 枚舉、創建、刪除和重命名目錄。
- 重新命名、上傳、下載和刪除檔。
導航由 FtpGetCurrentDirectory 和 FtpSetCurrentDirectory 函數提供。 這些函數利用上一次調用 InternetConnect 創建的會話句柄來確定應用程式當前位於哪個目錄,或更改為其他子目錄。
目錄枚舉是使用 FtpFindFirstFile 和 InternetFindNextFile 函數執行的。 FtpFindFirstFile 使用 InternetConnect 創建的會話句柄查找與給定搜索條件匹配的第一個檔,並返回一個句柄以繼續目錄枚舉。 InternetFindNextFile 使用 FtpFindFirstFile 傳回的句柄返回與原始搜尋條件匹配的下一個檔。 應用程式應繼續調用 InternetFindNextFile ,直到目錄中沒有更多檔。
使用 FtpCreateDirectory 函數創建新目錄。 此函數使用 InternetConnect 建立的工作階段句柄,並創建由傳遞給該函數的字串指定的目錄。 該字串可以包含相對於當前目錄的目錄名稱,或完全限定的目錄路徑。
要重新命名檔或目錄,應用程式可以調用 FtpRenameFile。 此函數將原始名稱替換為傳遞給函數的新名稱。 文件或目錄的名稱可以是相對於當前目錄的名稱,也可以是完全限定的名稱。
要在 FTP 伺服器上上傳或放置檔,應用程式可以使用 FtpPutFile 或 FtpOpenFile (以及 InternetWriteFile)。 如果檔在本地已存在,則可以使用 FtpPutFile,而如果需要將數據寫入 FTP 伺服器上的檔,則可以使用 FtpOpenFile 和 InternetWriteFile。
若要下載或獲取檔,應用程式可以使用 FtpGetFile 或 FtpOpenFile (帶有 InternetReadFile)。 FtpGetFile 用於從 FTP 伺服器檢索檔並將其存儲在本地,而 FtpOpenFile 和 InternetReadFile 可用於控制下載資訊的去向(例如,應用程式可以在編輯框中顯示資訊)。
使用 FtpDeleteFile 函數刪除 FTP 伺服器上的檔。 此函數從 FTP 伺服器中刪除相對於當前目錄或完全限定檔名的檔名。 FtpDeleteFile 需要 InternetConnect 傳回的會話句柄。
FTP 函數句柄
要正常工作,FTP 函數需要某些類型的 HINTERNET 句柄。 這些句柄必須按特定順序創建,從 InternetOpen 創建的根句柄開始。 然後,InternetConnect 可以創建 FTP 會話句柄。
下圖顯示了依賴於 InternetConnect 傳回的 FTP 會話句柄的函數。 陰影框表示返回 HINTERNET 句柄的函數,而普通框表示使用由它們所依賴的函數創建的 HINTERNET 句柄的函數。
下圖顯示了返回 HINTERNET 句柄的兩個函數以及依賴於它們的函數。 陰影框表示返回 HINTERNET 句柄的函數,而普通框表示使用由它們所依賴的函數創建的 HINTERNET 句柄的函數。
如需詳細資訊,請參閱 HINTERNET 句柄。
將 WinINet 函數用於 FTP 工作階段
在 FTP 工作階段期間使用以下函數。 CERN 代理無法識別這些函數。 必須通過 CERN 代理運行的應用程式應使用 InternetOpenUrl 並直接存取資源。 有關直接訪問資源的更多資訊,請參閱 直接訪問URL。
| 功能 | 說明 |
|---|---|
| FtpCreateDirectory (建立目錄) | 在伺服器上創建新目錄。 此函式需要由 InternetConnect所建立的句柄。 |
| FtpDelete檔 | 從伺服器中刪除檔。 此函式需要由 InternetConnect所建立的句柄。 |
| FtpFindFirstFile 檔 | 在當前目錄中啟動檔枚舉或檔搜索。 此函式需要由 InternetConnect所建立的句柄。 |
| FtpGetCurrentDirectory | 返回客戶端在伺服器上的當前目錄。 此函式需要由 InternetConnect所建立的句柄。 |
| FtpGetFile 檔 | 從伺服器檢索檔。 此函式需要由 InternetConnect所建立的句柄。 |
| FtpOpen檔 | 啟動對伺服器上檔的訪問以進行讀取或寫入。 此函式需要由 InternetConnect所建立的句柄。 |
| FtpPut檔 | 將檔案寫入伺服器。 此函式需要由 InternetConnect所建立的句柄。 |
| FtpRemoveDirectory (英文) | 刪除伺服器上的目錄。 此函式需要由 InternetConnect所建立的句柄。 |
| Ftp重命名檔 | 重新命名伺服器上的檔。 此函式需要由 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。 如果兩個值都設置為 NULL,則 InternetConnect 使用 “anonymous” 作為使用者名,使用使用者的電子郵件地址作為密碼。 如果僅將密碼設置為 NULL,則傳遞給 InternetConnect 的用戶名將用作使用者名,空字串將用於密碼。 如果兩個值都不為 NULL,則使用提供給 InternetConnect 的使用者名和密碼。
枚舉目錄
在 FTP 伺服器上枚舉目錄需要 FtpFindFirstFile 創建句柄。 此句柄是 InternetConnect 創建的會話句柄的一個分支。 FtpFindFirstFile 查找伺服器上的第一個檔或目錄,並以 WIN32_FIND_DATA 結構返回它。 使用 InternetFindNextFile ,直到它返回 ERROR_NO_MORE_FILES。 此方法將查找伺服器上的所有後續檔和目錄。 如需 InternetFindNextFile的詳細資訊,請參閱 尋找下一個檔案。
若要確定 FtpFindFirstFile 或 InternetFindNextFile 檢索的檔是否為目錄,請檢查 WIN32_FIND_DATA 結構的 dwFileAttributes 成員,查看它是否等於 FILE_ATTRIBUTE_DIRECTORY。
如果應用程式在 FTP 伺服器上進行更改,或者 FTP 伺服器頻繁更改,則應在 FtpFindFirstFile 中設置 INTERNET_FLAG_NO_CACHE_WRITE 和 INTERNET_FLAG_RELOAD 標誌。 這些標誌確保從 FTP 伺服器檢索的目錄資訊是最新的。
應用程式完成目錄枚舉後,應用程式必須對 FtpFindFirstFile 創建的句柄調用 InternetCloseHandle。 在該句柄關閉之前,應用程式無法在 InternetConnect 創建的會話句柄上再次調用 FtpFindFirstFile。 如果在關閉對同一函數的上一個調用之前對同一會話句柄調用 FtpFindFirstFile ,則該函數將失敗,並返回 ERROR_FTP_TRANSFER_IN_PROGRESS。
下面的範例將 FTP 目錄的內容枚舉到清單框控制件中。 hConnection 參數是 InternetConnect 函數在建立 FTP 會話後返回的句柄。 此示例中引用的 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 );
}
導航目錄
FtpGetCurrentDirectory 和 FtpSetCurrentDirectory 函數處理目錄導航。
FtpGetCurrentDirectory 傳回應用程式在 FTP 伺服器上的當前目錄。 包括 FTP 伺服器上根目錄的目錄路徑。
FtpSetCurrentDirectory 更改伺服器上的工作目錄。 傳遞給 FtpSetCurrentDirectory 的目錄資訊可以是相對於當前目錄的部分或完全限定的路徑名。 例如,如果應用程式當前位於目錄 「public/info」 中,路徑為 「ftp/example」。, 則 FtpSetCurrentDirectory 會將當前目錄更改為 “public/info/ftp/example”。
以下示例使用 InternetConnect 傳回的 FTP 會話句柄 hConnection。 新目錄名稱取自父對話框的編輯框,其 IDC 在 nDirNameId 參數中傳遞。 在進行目錄更改之前,該函數會檢索當前目錄並將其存儲在同一個編輯框中。 上面列出了最後調用的 DisplayFtpDir 函數的原始程式碼。
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 會話句柄和以 null 結尾的字串,該字串包含完全限定路徑或相對於當前目錄的名稱,並在 FTP 伺服器上創建一個目錄。
以下示例顯示了對 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 參數中傳遞。 hConnection 句柄是在建立 FTP 工作階段後由 InternetConnect 創建的。 上面列出了最後調用的 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 參數中。 hConnection 句柄是在建立 FTP 工作階段後由 InternetConnect 創建的。 上面列出了最後調用的 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 伺服器檢索檔:
- 使用 InternetOpenUrl 和 InternetReadFile。
- 使用 FtpOpenFile 和 InternetReadFile。
- 使用 FtpGetFile。
有關使用 InternetReadFile 函數的更多資訊,請參閱 讀取檔。
如果檔的 URL 可用,則應用程式可以調用 InternetOpenUrl 以連接到該 URL,然後使用 InternetReadFile 控制檔的下載。 這允許應用程式更嚴格地控制下載,並且非常適合不需要在 FTP 伺服器上進行其他作的情況。 有關如何直接訪問資源的更多資訊,請參閱 直接訪問URL。
如果應用程式已使用 InternetConnect 與伺服器建立了 FTP 會話句柄,則應用程式可以使用現有檔名和本地儲存檔的新名稱調用 FtpOpenFile 。 然後,應用程式可以使用 InternetReadFile 下載檔。 這允許應用程式更嚴格地控制下載並保持與 FTP 伺服器的連接,以便可以執行更多命令。
如果應用程式不需要對下載進行嚴格控制,則應用程式可以將 FtpGetFile 與 FTP 會話句柄、遠端檔名和本地檔名一起使用來檢索檔。 FtpGetFile 執行與從 FTP 伺服器讀取檔並將其儲存在本地相關的所有簿記和開銷。
以下示例從 FTP 伺服器檢索檔並將其保存在本地。 FTP 伺服器上的檔名稱取自父對話框的編輯框,其 IDC 在 nFtpFileNameId 參數中傳遞,保存檔的本地名稱取自編輯框,其 IDC 在 nLocalFileNameId 參數中傳遞。 hConnection 句柄是在建立 FTP 工作階段後由 InternetConnect 創建的。
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 伺服器上:
- 將 FtpOpenFile 與 InternetWriteFile 一起使用。
- 使用 FtpPutFile。
必須將數據發送到 FTP 伺服器,但沒有包含所有資料的本地檔的應用程式,應使用 FtpOpenFile 在 ftp 伺服器上創建並打開檔。 然後,應用程式可以使用 InternetWriteFile 將資訊上傳到檔。
如果檔在本地已存在,則應用程式可以使用 FtpPutFile 將檔案上傳到 FTP 伺服器。 FtpPutFile 執行將本地檔上傳到遠端 FTP 伺服器的所有開銷。
以下範例將本地檔案複製到 FTP 伺服器上。 檔的本地名稱取自父對話框的編輯框,其 IDC 在 nLocalFileNameId 參數中傳遞,檔在 FTP 伺服器上保存的名稱取自其 IDC 在 nFtpFileNameId 參數中傳遞的編輯框。 hConnection 句柄是在建立 FTP 工作階段後由 InternetConnect 創建的。
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 參數傳遞。 hConnection 句柄是在建立 FTP 工作階段後由 InternetConnect 創建的。 由於此函數不會刷新檔案清單或目錄顯示,因此調用進程應在成功刪除後執行此作。
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 參數中傳遞的編輯框。 hConnection 句柄是在建立 FTP 工作階段後由 InternetConnect 創建的。 由於此函數不會刷新檔案清單或目錄顯示,因此調用進程應在成功重命名後執行此作。
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)。