需要があるか不明だが、調査したのでポスト。
FTP GET
以下のコードでFTP GETできる。
なお、CURLOPT_URLに与えたパスがディレクトリの場合、ディレクトリの内容が表示される。
CURLcode curl_code;
CURL *curl = curl_easy_init();
if (curl == NULL) {
// エラー
}
// 取得したファイルデータを格納するファイルハンドルをオープン
// 後続のcurl_easy_perform が終了するまでオープンしておく。
FILE *out = fopen("outputfile.txt", "w");
// 取得元のURL を指定する ftp://ftpuser:ftppasswd@localhost/path でも可。
curl_code = curl_easy_setopt(curl, CURLOPT_URL, "ftp://localhost/path");
// エラー処理は省略
curl_code = curl_easy_setopt(curl, CURLOPT_USERNAME, "ftpuser");
curl_code = curl_easy_setopt(curl, CURLOPT_PASSWORD, "ftppasswd");
// 出力先のファイルハンドルを指定する
curl_code = curl_easy_setopt(curl, CURLOPT_FILE, out);
// テキストモードでファイル取得したい場合は、以下を指定する。
// デフォルトでは、バイナリモードで転送される。
curl_code = curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT, 1);
curl_code = curl_easy_perform(curl);
if (curl_code != CURLE_OK) {
// curl_easy_strerror(curl) でエラー文字列が取得できる。
fprintf(stderr, "FTP GET failed: %s\n", curl_easy_strerror(curl_code));
} else {
fprintf(stderr, "FTP GET OK\n")
}
if (fclose(out) == EOF) {
// エラー。
}
// CURLハンドルをクローズする。
curl_easy_cleanup(curl);
FTP PUT
GETとの違いは、以下の通り。
- CURLOPT_URLにアップロードするパスをファイル名込みで指定する。
- CURLOPT_FILE ではなく、CURLOPT_INFILE に送信するファイルのハンドルを指定する。
- CURLOPT_UPLOAD に 1 を設定する。
FTP LIST
前述のとおり、GET のソースコードでディレクトリの一覧は表示できる。ファイル名だけ取得する場合は、CURLOPT_FTPLISTONLY に 1 を設定する。
CURLOPT_FILEで指定したファイルに、ディレクトリのエントリが1ファイルにつき1行出力される。
転送状況の表示
CURLPOT_NOPROGRESS に 0 を設定する。
CURLOPT_PROGRESSFUNCTION に コールバック関数を指定する。(オプション)
指定する関数は以下のシグネチャのとおり。
int progress_callback(
void *userptr, // CURLPOT_PROGRESSDATA に指定したポインタ
double dltotal, // ダウンロードするバイト数
double dlnow, // ダウンロードした累計バイト数
double uptotal, // アップロードするバイト数
double upnow); // アップロードした累計バイト数
CURLOPT_PROGRESSDATA にコールバック関数の第一引数に渡すデータのポインタを指定する。(オプション)
CURLPOT_INFILESIZE にアップロードするファイルサイズを指定する。(PUT時のオプション)指定しない場合は、コールバック関数のuptotalには-1が設定される。
FTPコマンドの表示
CURLPOT_VERBOSE に 1 を設定すると、FTPコマンドのやり取りが出力される。
デフォルトでは標準エラー出力に出力されるが、CURLOPT_STDERR に出力先のファイルハンドルを指定できる。