| コマンド | 説明 |
|---|---|
| ls | ファイル一覧を取得する |
| pwd | カレントディレクトリを取得する |
| cd dir | ディレクトリを移動する |
| mkdir | ディレクトリを作成する |
| delete file | ファイルを削除する |
| get | ファイルをダウンロードする |
| mget | 複数のファイルをダウンロードする |
| put | ファイルをアップロードする |
| mput | 複数のファイルをアップロードする |
| passive | PASVモードに変更する |
| ascii | アスキー転送に変更する |
| binary | バイナリ転送に変更する |
| bye, quit, exit | 切断する |
| 応答コード | 意味 |
|---|---|
| 110 | RESTコマンドのためのマーカー応答である。 |
| 120 | サービスは停止しているが、nnn分後に準備できる。 |
| 125 | データコネクションはすでに確立されている。このコネクションで転送を開始する。 |
| 150 | ファイルステータスは正常である。データコネクションを確立する。 |
| 200 | コマンドは正常に受け入れられた。 |
| 202 | コマンドは実装されていない。SITEコマンドでOSコマンドが適切でない場合など。 |
| 211 | STATコマンドに対するレスポンス。 |
| 212 | STATコマンドによるディレクトリ情報を示す。 |
| 213 | STATコマンドによるファイル情報を示す。 |
| 214 | HELPコマンドに対するレスポンス。 |
| 215 | SYSTコマンドに対するレスポンス。 |
| 220 | 新規ユーザー向けに準備が整った。ログイン時に表示される場合を想定している。 |
| 221 | コントロールコネクションを切断する。QUITコマンド時のレスポンス。 |
| 225 | データコネクションを確立した。データの転送は行われていない。 |
| 226 | 要求されたリクエストは成功した。データコネクションをクローズする。 |
| 227 | PASVコマンドへのレスポンス。h1~h4はIPアドレス、p1~p2はポート番号を示す。 |
| 230 | ユーザーログインの成功。 |
| 250 | 要求されたコマンドによる操作は正常終了した。 |
| 257 | ファイルやディレクトリを作成したというのがRFCでの意味だが、MKDコマンドの結果以外に、実際にはPWDコマンドの結果にも用いられる。 |
| 331 | パスワードの入力を求める。 |
| 332 | ACCTコマンドで課金情報を指定する必要がある。 |
| 350 | 他の何かしらの情報を求めている。 |
| 421 | サービスを提供できない。コントロールコネクションを終了する。サーバのシャットダウン時など。 |
| 425 | データコネクションをオープンできない。 |
| 426 | 何かしらの原因により、コネクションをクローズし、データ転送も中止した。 |
| 450 | 要求されたリクエストはアクセス権限やファイルシステムの理由で実行できない。 |
| 451 | ローカルエラーのため処理を中止した。 |
| 452 | ディスク容量の問題で実行できない。 |
| 500 | コマンドの文法エラー。 |
| 501 | 引数やパラメータの文法エラー。 |
| 502 | コマンドは未実装である。 |
| 503 | コマンドを用いる順番が間違っている。 |
| 504 | 引数やパラメータが未実装。 |
| 530 | ユーザーはログインできなかった。 |
| 532 | ファイル送信には、ACCTコマンドで課金情報を確認しなくてはならない。 |
| 550 | 要求されたリクエストはアクセス制限やファイルシステムの理由で実行できない。 |
| 551 | ページ構造のタイプの問題で実行できない。 |
| 552 | ディスク容量の問題で実行できない。 |
| 553 | ファイル名が間違っているため実行できない。 |
ファイルダウンロードは次の手順で行います。
WinInetを使うための前準備として「wininet.h」をインクルードし、「wininet.lib」をリンクしておきます。
WinInetライブラリの関数を使用する前にまず、InternetOpen() を使ってWinInet自体の初期化を行います。
HINTERNET InternetOpen( IN LPCTSTR lpszAgent, IN DWORD dwAccessType, IN LPCTSTR lpszProxyName, IN LPCTSTR lpszProxyBypass, IN DWORD dwFlags ); |
|
| 説明 | WinInetを初期化する。 |
|---|---|
| 引数 |
|
| 戻り値 | 成功した場合はインターネットハンドルを返す。失敗時はNULLを返す。 |
InternetConnect() でFTPサーバに接続します。
HINTERNET InternetConnect( IN HINTERNET hInternet, IN LPCTSTR lpszServerName, IN INTERNET_PORT nServerPort, IN LPCTSTR lpszUsername, IN LPCTSTR lpszPassword, IN DWORD dwService, IN DWORD dwFlags, IN DWORD dwContext ); |
|||||||||||||
| 説明 | FTPサーバに接続する。 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 引数 |
|
||||||||||||
| 戻り値 | 成功した場合はインターネットハンドルを返す。失敗時はNULLを返す。 | ||||||||||||
FtpSetCurrentDirectory() でカレントディレクトリの指定を行います。
BOOL FtpSetCurrentDirectory( IN HINTERNET hFtpSession, IN LPCSTR lpszDirectory ); |
|
| 説明 | FTPサーバのカレントディレクトリを指定する。 |
|---|---|
| 引数 |
|
| 戻り値 | 成功した場合はTRUE、失敗した場合はFALSEを返す。 |
FtpGetFile() でファイルのダウンロードを行います。
BOOL FtpGetFile( IN HINTERNET hFtpSession, IN LPCSTR lpszRemoteFile, IN LPCSTR lpszNewFile, IN BOOL fFailIfExists, IN DWORD dwLocalFlagsAndAttributes, IN DWORD dwInternetFlags, IN DWORD dwContext ); |
|||||||||||
| 説明 | FTPサーバからファイルを取得する。 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 引数 |
|
||||||||||
| 戻り値 | 成功した場合はTRUE、失敗した場合はFALSEを返す。 | ||||||||||
InternetCloseHandle() でインターネットから切断します。この関数は次のように定義されています。
BOOL InternetCloseHandle( IN HINTERNET hInet ); |
|
| 説明 | インターネットハンドルをクローズする。 |
|---|---|
| 引数 |
|
| 戻り値 | 成功した場合はTRUE、失敗した場合はFALSEを返す。 |
FTP処理を行うにあたって「InternetOpen() でオープンしたWinInet用のインターネットハンドル」と「InternetConnect() でオープンしたFTP用のインターネットハンドル」の2つをオープンしていますので、両方ともクローズする必要があります。 FTP側をクローズしてからWinInet側をクローズします。
実装例を以下に示します。まず、接続処理です。
BOOL FtpConnect(
LPCTSTR serverName, // [i] サーバ名
LPCTSTR userName, // [i] ユーザー名
LPCTSTR password, // [i] パスワード
LPCTSTR baseDir ) // [i] カレントディレクトリ
{
BOOL bRet = FALSE;
HINTERNET hInternet = NULL;
HINTERNET hFtp = NULL;
//==== インターネットオープン ====//
hInternet = InternetOpen(_T("Hoge"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(hInternet == NULL)
{
//-==- 失敗 -==-//
return FALSE;
}
//==== FTP接続 ====//
hFtp = InternetConnect(hInternet, serverName, INTERNET_INVALID_PORT_NUMBER, userName, password, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
if(hFtp == NULL)
{
//-==- 失敗 -==-//
return FALSE;
}
//==== カレントディレクトリ設定 ====//
bRet = FtpSetCurrentDirectory(hFtp, baseDir);
if(bRet == FALSE)
{
//-==- 失敗 -==-//
return FALSE;
}
return TRUE;
}
次にダウンロード処理です。
BOOL FtpDownload(
HINTERNET hFtp, // [i] FTPハンドル
LPCTSTR remoteFile, // [i] ダウンロード対象ファイル名
LPCTSTR localFile ) // [i] ダウンロードしたファイルの保存ファイル名
{
BOOL bRet = FALSE;
bRet = FtpGetFile(hFtp, remoteFile, localFile, TRUE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0);
if(bRet == FALSE)
{
//-==- 失敗 -==-//
}
return bRet;
}
基本的な流れはファイルダウンロードと変わりません。ファイルダウンロードしていた部分を以下の処理に置き換えることでアップロード処理を実装することが出来ます。
FtpPutFile() でファイルのアップロードを行う。
BOOL FtpPutFile( IN HINTERNET hFtpSession, IN LPCSTR lpszLocalFile, IN LPCSTR lpszNewRemoteFile, IN DWORD dwFlags, IN DWORD dwContext ); |
|
| 説明 | FTPサーバにファイルをアップロードする。 |
|---|---|
| 引数 |
|
| 戻り値 | 成功した場合はTRUE、失敗した場合はFALSEを返す。 |
サーバに新規ディレクトリを作成するには FtpCreateDirectory() を使用する。
BOOL FtpCreateDirectory( IN HINTERNET hFtpSession, IN LPCSTR lpszDirectory ); |
|
| 説明 | FTPサーバに新規ディレクトリを作成する。 |
|---|---|
| 引数 |
|
| 戻り値 | 成功した場合はTRUE、失敗した場合はFALSEを返す。 |
サーバのファイル削除するには FtpDeleteFile() を使用します。
BOOL FtpDeleteFile( IN HINTERNET hFtpSession, IN LPCSTR lpszFileName ); |
|
| 説明 | FTPサーバに新規ディレクトリを作成する。 |
|---|---|
| 引数 |
|
| 戻り値 | 成功した場合はTRUE、失敗した場合はFALSEを返す。 |
カレントディレクトリにあるファイル・ディレクトリを取得する方法を紹介します。
まず、カレントディレクトリを取得するために FtpGetCurrentDirectory() を使います。
BOOL FtpGetCurrentDirectory( IN HINTERNET hFtpSession, OUT LPSTR lpszCurrentDirectory, IN OUT LPDWORD lpdwCurrentDirectory ); |
|
| 説明 | カレントディレクトリを取得する。 |
|---|---|
| 引数 |
|
| 戻り値 | 成功した場合はTRUE、失敗した場合はFALSEを返す。 |
次にカレントディレクトリ内のディレクトリおよびファイルを検索します。検索には FtpFindFirstFile() および InternetFindNextFile() を使用します。
HINTERNET FtpFindFirstFile( IN HINTERNET hFtpSession, IN LPCSTR lpszSearchFile, OUT LPWIN32_FIND_DATA lpFindFileData, IN DWORD dwFlags, IN DWORD dwContext ); |
|||||||||||||||||
| 説明 | 指定ディレクトリの中を検索する。 | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 引数 |
|
||||||||||||||||
| 戻り値 | 検索ハンドルを返す。 | ||||||||||||||||
BOOL InternetFindNextFile( IN HINTERNET hFind, OUT LPVOID lpvFindData ); |
|
| 説明 | FtpFindFirstFile() または GopherFindFirstFile() で開始されたファイル検索を続行し、次のファイルを取得する。 |
|---|---|
| 引数 |
|
| 戻り値 | 成功した場合はTRUE、失敗した場合はFALSEを返す。 |