Bagikan melalui


Sesi FTP

WinINet memungkinkan aplikasi untuk menavigasi dan memanipulasi direktori dan file di server ftp. Karena proksi CERN tidak mendukung FTP, aplikasi yang menggunakan proksi CERN secara eksklusif harus menggunakan fungsi InternetOpenUrl . Untuk informasi selengkapnya tentang cara menggunakan InternetOpenUrl, lihat Mengakses URL Secara Langsung.

Untuk memulai sesi FTP, gunakan InternetConnect untuk membuat handel sesi.

WinINet memungkinkan Anda melakukan tindakan berikut pada server FTP:

  • Menavigasi antar direktori.
  • Menghitung, membuat, menghapus, dan mengganti nama direktori.
  • Ganti nama, unggah, unduh, dan hapus file.

Navigasi disediakan oleh fungsi FtpGetCurrentDirectory dan FtpSetCurrentDirectory . Fungsi-fungsi ini menggunakan handel sesi yang dibuat oleh panggilan sebelumnya ke InternetConnect untuk menentukan direktori mana aplikasi saat ini berada, atau untuk mengubah ke subdirektori yang berbeda.

Enumerasi direktori dilakukan dengan menggunakan fungsi FtpFindFirstFile dan InternetFindNextFile . FtpFindFirstFile menggunakan handel sesi yang dibuat oleh InternetConnect untuk menemukan file pertama yang cocok dengan kriteria pencarian yang diberikan dan mengembalikan handel untuk melanjutkan enumerasi direktori. InternetFindNextFile menggunakan handel yang dikembalikan oleh FtpFindFirstFile untuk mengembalikan file berikutnya yang cocok dengan kriteria pencarian asli. Aplikasi harus terus memanggil InternetFindNextFile sampai tidak ada lagi file yang tersisa di direktori.

Gunakan fungsi FtpCreateDirectory untuk membuat direktori baru. Fungsi ini menggunakan handel sesi yang dibuat oleh InternetConnect dan membuat direktori yang ditentukan oleh string yang diteruskan ke fungsi. String dapat berisi nama direktori yang relatif terhadap direktori saat ini, atau jalur direktori yang sepenuhnya memenuhi syarat.

Untuk mengganti nama file atau direktori, aplikasi dapat memanggil FtpRenameFile. Fungsi ini menggantikan nama asli dengan nama baru yang diteruskan ke fungsi. Nama file atau direktori dapat relatif terhadap direktori saat ini, atau nama yang sepenuhnya memenuhi syarat.

Untuk mengunggah atau menempatkan file di server FTP, aplikasi dapat menggunakan FtpPutFile atau FtpOpenFile (bersama dengan InternetWriteFile). FtpPutFile dapat digunakan jika file sudah ada secara lokal, sementara FtpOpenFile dan InternetWriteFile dapat digunakan jika data perlu ditulis ke file di server FTP.

Untuk mengunduh atau mendapatkan file, aplikasi dapat menggunakan FtpGetFile atau FtpOpenFile (dengan InternetReadFile). FtpGetFile digunakan untuk mengambil file dari server FTP dan menyimpannya secara lokal, sementara FtpOpenFile dan InternetReadFile dapat digunakan untuk mengontrol ke mana informasi yang diunduh berlangsung (misalnya, aplikasi dapat menampilkan informasi dalam kotak edit).

Hapus file di server FTP dengan menggunakan fungsi FtpDeleteFile . Fungsi ini menghapus nama file yang relatif terhadap direktori saat ini atau ke nama file yang sepenuhnya memenuhi syarat dari server FTP. FtpDeleteFile memerlukan handel sesi yang dikembalikan oleh InternetConnect.

Handel Fungsi FTP

Agar berfungsi dengan baik, fungsi FTP memerlukan jenis handel HINTERNET tertentu. Handel ini harus dibuat dalam urutan tertentu, dimulai dengan handel akar yang dibuat oleh InternetBuka. InternetConnect kemudian dapat membuat handel sesi FTP.

Diagram berikut menunjukkan fungsi yang bergantung pada handel sesi FTP yang dikembalikan oleh InternetConnect. Kotak berbayang mewakili fungsi yang mengembalikan handel HINTERNET , sementara kotak biasa mewakili fungsi yang menggunakan handel HINTERNET yang dibuat oleh fungsi yang bergantung padanya.

Fungsi ftp bergantung pada handel sesi ftp yang dikembalikan oleh internetconnect

Diagram berikut menunjukkan dua fungsi yang mengembalikan handel HINTERNET dan fungsi yang bergantung padanya. Kotak berbayang mewakili fungsi yang mengembalikan handel HINTERNET , sementara kotak biasa mewakili fungsi yang menggunakan handel HINTERNET yang dibuat oleh fungsi yang bergantung padanya.

fungsi ftp yang mengembalikan handel hinternet

Untuk informasi selengkapnya, lihat Handel HINTERNET.

Menggunakan Fungsi WinINet untuk Sesi FTP

Fungsi berikut digunakan selama sesi FTP. Fungsi-fungsi ini tidak dikenali oleh proksi CERN. Aplikasi yang harus berfungsi melalui proksi CERN harus menggunakan InternetOpenUrl dan mengakses sumber daya secara langsung. Untuk informasi selengkapnya tentang akses sumber daya langsung, lihat Mengakses URL Secara Langsung.

Fungsi Deskripsi
FtpCreateDirectory Membuat direktori baru pada server. Fungsi ini memerlukan handel yang dibuat oleh InternetConnect.
FtpDeleteFile Menghapus file dari server. Fungsi ini memerlukan handel yang dibuat oleh InternetConnect.
FtpFindFirstFile Memulai enumerasi file atau pencarian file di direktori saat ini. Fungsi ini memerlukan handel yang dibuat oleh InternetConnect.
FtpGetCurrentDirectory Mengembalikan direktori klien saat ini di server. Fungsi ini memerlukan handel yang dibuat oleh InternetConnect.
FtpGetFile Mengambil file dari server. Fungsi ini memerlukan handel yang dibuat oleh InternetConnect.
FtpOpenFile Memulai akses ke file di server untuk membaca atau menulis. Fungsi ini memerlukan handel yang dibuat oleh InternetConnect.
FtpPutFile Menulis file ke server. Fungsi ini memerlukan handel yang dibuat oleh InternetConnect.
FtpRemoveDirectory Menghapus direktori pada server. Fungsi ini memerlukan handel yang dibuat oleh InternetConnect.
FtpRenameFile Mengganti nama file pada server. Fungsi ini memerlukan handel yang dibuat oleh InternetConnect.
FtpSetCurrentDirectory Mengubah direktori klien saat ini pada server. Fungsi ini memerlukan handel yang dibuat oleh InternetConnect.
InternetWriteFile Menulis data ke file terbuka di server. Fungsi ini memerlukan handel yang dibuat oleh FtpOpenFile.

 

Memulai Sesi FTP

Aplikasi ini membuat sesi FTP dengan memanggil InternetConnect pada handel yang dibuat oleh InternetBuka. InternetConnect memerlukan nama server, nomor port, nama pengguna, kata sandi, dan jenis layanan (yang harus diatur ke INTERNET_SERVICE_FTP). Untuk semantik FTP pasif, aplikasi juga harus mengatur bendera INTERNET_FLAG_PASSIVE .

Nilai INTERNET_DEFAULT_FTP_PORT dan INTERNET_INVALID_PORT_NUMBER dapat digunakan untuk nomor port. INTERNET_DEFAULT_FTP_PORT menggunakan port FTP default, tetapi jenis layanan masih harus diatur. INTERNET_INVALID_PORT_NUMBER menggunakan nilai default untuk jenis layanan yang ditunjukkan.

Nilai untuk nama pengguna dan kata sandi dapat diatur ke NULL. Jika kedua nilai diatur ke NULL, InternetConnect menggunakan "anonim" untuk nama pengguna, dan alamat email pengguna untuk kata sandi. Jika hanya kata sandi yang diatur ke NULL, nama pengguna yang diteruskan ke InternetConnect digunakan untuk nama pengguna, dan string kosong digunakan untuk kata sandi. Jika tidak ada nilai NULL, nama pengguna dan kata sandi yang diberikan ke InternetConnect akan digunakan.

Menghitung Direktori

Enumerasi direktori pada server FTP memerlukan pembuatan handel oleh FtpFindFirstFile. Handel ini adalah cabang handel sesi yang dibuat oleh InternetConnect. FtpFindFirstFile menemukan file atau direktori pertama di server dan mengembalikannya dalam struktur WIN32_FIND_DATA . Gunakan InternetFindNextFile hingga kembali ERROR_NO_MORE_FILES. Metode ini menemukan semua file dan direktori berikutnya di server. Untuk informasi selengkapnya tentang InternetFindNextFile, lihat Menemukan File Berikutnya.

Untuk menentukan apakah file yang diambil oleh FtpFindFirstFile atau InternetFindNextFile adalah direktori, periksa anggota dwFileAttributes dari struktur WIN32_FIND_DATA untuk melihat apakah sama dengan FILE_ATTRIBUTE_DIRECTORY.

Jika aplikasi membuat perubahan pada server FTP atau jika server FTP sering berubah, bendera INTERNET_FLAG_NO_CACHE_WRITE dan INTERNET_FLAG_RELOAD harus diatur di FtpFindFirstFile. Bendera ini memastikan bahwa informasi direktori yang diambil dari server FTP saat ini.

Setelah aplikasi menyelesaikan enumerasi direktori, aplikasi harus melakukan panggilan ke InternetCloseHandle pada handel yang dibuat oleh FtpFindFirstFile. Hingga handel ditutup, aplikasi tidak dapat memanggil FtpFindFirstFile lagi pada handel sesi yang dibuat oleh InternetConnect. Jika panggilan ke FtpFindFirstFile dilakukan pada handel sesi yang sama sebelum panggilan sebelumnya ke fungsi yang sama ditutup, fungsi gagal, mengembalikan ERROR_FTP_TRANSFER_IN_PROGRESS.

Contoh berikut menghitung konten direktori FTP ke dalam kontrol kotak daftar. Parameter hConnection adalah handel yang dikembalikan oleh fungsi InternetConnect setelah menetapkan sesi FTP. Contoh kode sumber untuk fungsi InternetErrorOut yang dirujuk dalam contoh ini dapat ditemukan dalam topik Menangani Kesalahan.

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

Fungsi FtpGetCurrentDirectory dan FtpSetCurrentDirectory menangani navigasi direktori.

FtpGetCurrentDirectory mengembalikan direktori aplikasi saat ini di server FTP. Jalur direktori dari direktori akar pada server FTP disertakan.

FtpSetCurrentDirectory mengubah direktori kerja di server. Informasi direktori yang diteruskan ke FtpSetCurrentDirectory dapat berupa nama jalur sebagian atau sepenuhnya memenuhi syarat yang relatif terhadap direktori saat ini. Misalnya, jika aplikasi saat ini berada di direktori "public/info" dan jalurnya adalah "ftp/example", FtpSetCurrentDirectory mengubah direktori saat ini menjadi "public/info/ftp/example".

Contoh berikut menggunakan hConnection handel sesi FTP, yang dikembalikan oleh InternetConnect. Nama direktori baru diambil dari kotak edit dialog induk yang IDC-nya diteruskan dalam parameter nDirNameId . Sebelum perubahan direktori dilakukan, fungsi mengambil direktori saat ini dan menyimpannya dalam kotak edit yang sama. Kode souce untuk fungsi DisplayFtpDir yang disebut di akhir tercantum di atas.

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

Memanipulasi Direktori di Server FTP

WinINet menyediakan kemampuan untuk membuat dan menghapus direktori di server FTP tempat aplikasi memiliki hak istimewa yang diperlukan. Jika aplikasi harus masuk ke server dengan nama pengguna dan kata sandi tertentu, nilai dapat digunakan di InternetConnect saat membuat handel sesi FTP.

Fungsi FtpCreateDirectory mengambil handel sesi FTP yang valid dan string yang dihentikan null yang berisi jalur yang sepenuhnya memenuhi syarat atau nama yang relatif terhadap direktori saat ini dan membuat direktori di server FTP.

Contoh berikut menunjukkan dua panggilan terpisah ke FtpCreateDirectory. Dalam kedua contoh, hFtpSession adalah handel sesi yang dibuat oleh fungsi InternetConnect , dan direktori akar adalah direktori saat ini.

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

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

Fungsi FtpRemoveDirectory mengambil handel sesi dan string yang dihentikan null yang berisi jalur yang sepenuhnya memenuhi syarat atau nama yang relatif terhadap direktori saat ini dan menghapus direktori tersebut dari server FTP.

Contoh berikut menunjukkan dua sampel panggilan ke FtpRemoveDirectory. Dalam kedua panggilan, hFtpSession adalah handel sesi yang dibuat oleh fungsi InternetConnect , dan direktori akar adalah direktori saat ini. Ada direktori yang disebut "uji" di direktori akar dan direktori yang disebut "contoh" dalam direktori "uji".

/* 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. */

Contoh berikut membuat direktori baru di server FTP. Nama direktori baru diambil dari kotak edit dialog induk yang IDC-nya diteruskan dalam parameter nDirNameId . Handel hConnection dibuat oleh InternetConnect setelah membuat sesi FTP. Kode sumber untuk fungsi DisplayFtpDir yang disebut di akhir tercantum di atas.

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

Contoh berikut menghapus direktori dari server FTP. Nama direktori yang akan dihapus diambil dari kotak edit dalam dialog induk yang IDC-nya diteruskan ke parameter nDirNameId . Handel hConnection dibuat oleh InternetConnect setelah membuat sesi FTP. Kode sumber untuk fungsi DisplayFtpDir yang disebut di akhir tercantum di atas.

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

Mendapatkan File di Server FTP

Ada tiga metode untuk mengambil file dari server FTP:

Untuk informasi selengkapnya tentang menggunakan fungsi InternetReadFile , lihat Membaca File.

Jika URL file tersedia, aplikasi dapat memanggil InternetOpenUrl untuk terhubung ke URL tersebut, lalu menggunakan InternetReadFile untuk mengontrol pengunduhan file. Ini memungkinkan kontrol aplikasi yang lebih ketat atas unduhan dan ideal untuk situasi di mana tidak ada operasi lain yang perlu dilakukan di server FTP. Untuk informasi selengkapnya tentang cara mengakses sumber daya secara langsung, lihat Mengakses URL Secara Langsung.

Jika aplikasi telah membuat handel sesi FTP ke server dengan InternetConnect, aplikasi dapat memanggil FtpOpenFile dengan nama file yang ada dan dengan nama baru untuk file yang disimpan secara lokal. Aplikasi kemudian dapat menggunakan InternetReadFile untuk mengunduh file. Ini memungkinkan kontrol aplikasi yang lebih ketat atas unduhan dan menjaga koneksi ke server FTP, sehingga lebih banyak perintah dapat dijalankan.

Jika aplikasi tidak memerlukan kontrol ketat atas unduhan, aplikasi dapat menggunakan FtpGetFile dengan handel sesi FTP, nama file jarak jauh, dan nama file lokal untuk mengambil file. FtpGetFile melakukan semua pembukuan dan overhead yang terkait dengan membaca file dari server FTP dan menyimpannya secara lokal.

Contoh berikut mengambil file dari server FTP dan menyimpannya secara lokal. Nama file di server FTP diambil dari kotak edit dalam dialog induk yang IDC-nya diteruskan dalam parameter nFtpFileNameId , dan nama lokal tempat file disimpan diambil dari kotak edit yang IDC-nya diteruskan dalam parameter nLocalFileNameId . Handel hConnection dibuat oleh InternetConnect setelah membuat sesi FTP.

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

Menempatkan File di Server FTP

Ada dua metode untuk menempatkan file di server FTP:

Aplikasi yang harus mengirim data ke server FTP, tetapi tidak memiliki file lokal yang berisi semua data, harus menggunakan FtpOpenFile untuk membuat dan membuka file di server ftp. Aplikasi kemudian dapat menggunakan InternetWriteFile untuk mengunggah informasi ke file.

Jika file sudah ada secara lokal, aplikasi dapat menggunakan FtpPutFile untuk mengunggah file ke server FTP. FtpPutFile melakukan semua overhead yang berjalan dengan mengunggah file lokal ke server FTP jarak jauh.

Contoh berikut menyalin file lokal ke server FTP. Nama lokal file diambil dari kotak edit dalam dialog induk yang IDC-nya diteruskan dalam parameter nLocalFileNameId , dan nama tempat file disimpan di server FTP diambil dari kotak edit yang IDC-nya diteruskan dalam parameter nFtpFileNameId . Handel hConnection dibuat oleh InternetConnect setelah membuat sesi FTP.

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
}

Menghapus File dari Server FTP

Untuk menghapus file dari server FTP, gunakan fungsi FtpDeleteFile . Aplikasi panggilan harus memiliki hak istimewa yang diperlukan untuk menghapus file dari server FTP.

Contoh berikut menghapus file dari server FTP. Nama file yang akan dihapus diambil dari kotak edit dalam dialog induk yang IDC-nya diteruskan dengan parameter nFtpFileNameId . Handel hConnection dibuat oleh InternetConnect setelah membuat sesi FTP. Karena fungsi ini tidak menyegarkan daftar file atau tampilan direktori, proses panggilan harus melakukannya setelah penghapusan berhasil.

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
}

Mengganti nama File dan Direktori pada Server FTP

File dan direktori pada server FTP dapat diganti namanya menggunakan fungsi FtpRenameFile . FtpRenameFile menerima dua string yang dihentikan null yang berisi nama sebagian atau sepenuhnya memenuhi syarat relatif terhadap direktori saat ini. Fungsi mengubah nama file yang ditunjuk oleh string pertama menjadi nama yang ditunjuk oleh string kedua.

Contoh berikut mengganti nama file atau direktori di server FTP. Nama file atau direktori saat ini diambil dari kotak edit dalam dialog induk yang IDC-nya diteruskan dalam parameter nOldFileNameId , dan nama baru diambil dari kotak edit yang IDC-nya diteruskan dalam parameter nNewFileNameId . Handel hConnection dibuat oleh InternetConnect setelah membuat sesi FTP. Karena fungsi ini tidak menyegarkan daftar file atau tampilan direktori, proses panggilan harus melakukannya setelah penggantian nama berhasil.

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
}

Catatan

WinINet tidak mendukung implementasi server. Selain itu, itu tidak boleh digunakan dari layanan. Untuk implementasi atau layanan server, gunakan Microsoft Windows HTTP Services (WinHTTP).