4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

libcurl で FTP通信

Posted at

需要があるか不明だが、調査したのでポスト。

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 に出力先のファイルハンドルを指定できる。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?