.NET TIPS

WebRequest/WebResponseクラスでFTPによりファイル転送を行うには?[2.0のみ、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2006/06/16

 「TIPS:WebClientクラスでFTPによりファイル転送を行うには?」では、WebClientクラスを使ってFTPのファイル転送を簡単に行う方法について解説しているが、HTTPの場合と同様に、WebRequest/WebResponseクラス(System.Net名前空間)を利用して、より細かな制御を行いながらFTPを行うことも可能だ(参考:「TIPS:WebRequest/WebResponseクラスでWebページを取得するには?」)。

 本稿ではWebRequest/WebResponseクラスを用いたFTPによる基本的なファイルのダウンロード/アップロードついて解説する。

FTPによるファイルのダウンロード

 WebRequest/WebResponseクラスでFTPを行う場合にも、基本的なプログラムの構造はHTTP(Webページ)の場合と変わらず、まずWebRequestクラスのCreateメソッドにより「リクエスト」であるWebRequestオブジェクトを作成する。

WebRequest req = WebRequest.Create("ftp://……")

 このときパラメータにHTTPのURL(http://〜)を指定すると、リクエストの実体はHttpWebRequestクラスのオブジェクトとなるが、FTPのURL(ftp://〜)を指定した場合には、それはFtpWebRequestクラスのオブジェクトとなる(ともにWebRequestクラスの派生クラス)。つまり、Createメソッドはパラメータで指定されたURLのスキーム部分(httpやftpなどのプロトコル指定部分)により、リクエストとして作成するオブジェクトを判断するわけだ。

 FTPサーバにアクセスするためのユーザー名とパスワードは、前掲のTIPSと同様に、NetworkCredentialクラス(System.Net名前空間)のオブジェクトを作成し、Credentialsプロパティに設定しておく。

req.Credentials = new NetworkCredential("ユーザー名", "パスワード")

 次に、FTPのアクセスで用いるアクション(コマンド)をMethodプロパティに設定する。これに設定する値は、WebRequestMethods.Ftpクラス(System.Net名前空間)*のパブリックなフィールドから選択する。このクラスでは、FTPサーバ上のファイル一覧を取得する「ListDirectory」や、ディレクトリを作成する「MakeDirectory」などのフィールドが定義されている。

* このクラスはWebRequestMethodsクラス内で定義されている入れ子クラス(インナー・クラス)である。

 ここではファイルのダウンロードを行うので、以下のように「DownloadFile」を指定する。ただしこの設定がWebRequestクラスのデフォルトであるため、ダウンロードの場合に限りMethodプロパティの設定は省略できる。

req.Method = WebRequestMethods.Ftp.DownloadFile

 以上でリクエストの作成は完了だ。次にWebRequestオブジェクトのGetResponseメソッドを呼び出し、「レスポンス」であるWebResponseオブジェクトを取得する。FTPサーバへの通信はこの時点で開始される。

WebResponse res = req.GetResponse()

 レスポンスが正しく得られれば、後はGetResponseStreamメソッドによりFTPサーバ上のファイルに対するストリームを取得できるので、それを少しずつ読み出しながら、ローカル・ファイルに順次書き込んでいけばよい。

 以下にWebRequest/WebResponseクラスを使ってFTPでダウンロードを行うサンプル・プログラムを示す。このプログラムは前掲のTIPSで示したダウンロードを行うサンプル・プログラムと同じ動作をする。

// ftpwebget.cs

using System;
using System.Net;
using System.IO;

class FtpWebGet {
  static void Main() {

    string uri = "ftp://servername/pub/secret.png";
    string myFile = "tmp.png";

    WebRequest req = WebRequest.Create(uri);
    req.Credentials = new NetworkCredential("user01", "mypassword");
    req.Method = WebRequestMethods.Ftp. DownloadFile; // 省略可

    using (WebResponse res = req.GetResponse())
    using (Stream st = res.GetResponseStream())
    using (FileStream fs = new FileStream(myFile, FileMode.Create)) {
      Byte[] buf = new Byte[1024];
      int count = 0;

      do {
        count = st.Read(buf, 0, buf.Length);
        fs.Write(buf, 0, count);
      } while (count != 0);
    }
  }
}

// コンパイル方法:csc ftpwebget.cs
WebRequest/WebResponseクラスによりFTPでダウンロードを行うC#のサンプル・プログラム(ftpwebget.cs)

' ftpwebget.vb

Imports System
Imports System.Net
Imports System.IO

Class test
  Shared Sub main()

    Dim uri As String = "ftp://servername/pub/secret.png"
    Dim myFile As String = "tmp.png"

    Dim req As WebRequest = WebRequest.Create(uri)
    req.Credentials = New NetworkCredential("user01", "mypassword")
    req.Method = WebRequestMethods.Ftp. DownloadFile ' 省略可

    Using res As WebResponse = req.GetResponse()
      Using st As Stream = res.GetResponseStream()
        Using fs As New FileStream(myFile, FileMode.Create)
          Dim buf(1024) As Byte
          Dim count As Integer = 0

          Do
            count = st.Read(buf, 0, buf.Length)
            fs.Write(buf, 0, count)
          Loop While count <> 0
        End Using
      End Using
    End Using
  End Sub
End Class

' コンパイル方法:vbc ftpwebget.vb
WebRequest/WebResponseクラスによりFTPでダウンロードを行うVBのサンプル・プログラム(ftpwebget.vb)

FTPによるファイルのアップロード

 ファイルのアップロードを行う場合には、先ほどと同様にしてWebRequestオブジェクトを作成し、Methodプロパティには「WebRequestMethods.Ftp.UploadFile」を指定する。

 そしてWebRequestオブジェクトのGetRequestStreamメソッドを呼び出し、今度はリクエストに対するストリームを取得する。この時点でFTPサーバへの通信は開始される。

 後はローカル・ファイルを読み込みながら、取得したストリームにそのデータを書き込めばよい。単にファイルをアップロードするだけなら、WebResponseクラスの利用は不要だ。

 以下にWebRequestクラスを使ってFTPでアップロードを行うサンプル・プログラムを示す。

// ftpwebput.cs

using System;
using System.Net;
using System.IO;

class FtpWebPut {
  static void Main() {

    string uri = "ftp://servername/Upload/secret.png";
    string myFile = "tmp.png";

    WebRequest req = WebRequest.Create(uri);
    req.Credentials = new NetworkCredential("user01", "mypassword");
    req.Method = WebRequestMethods.Ftp.UploadFile;

    using (Stream st = req.GetRequestStream())
    using (FileStream fs = new FileStream(myFile, FileMode.Open)) {
      Byte[] buf = new Byte[1024];
      int count = 0;

      do {
        count = fs.Read(buf, 0, buf.Length);
        st.Write(buf, 0, count);
      } while (count != 0);
    }
  }
}

// コンパイル方法:ftpwebput.cs
WebRequestクラスによりFTPでアップロードを行うC#のサンプル・プログラム(ftpwebput.cs)

' ftpwebput.vb

Imports System
Imports System.Net
Imports System.IO

Class test
  Shared Sub main()

    Dim uri As String = "ftp://servername/upload/secret.png"
    Dim myFile As String = "tmp.png"

    Dim req As WebRequest = WebRequest.Create(uri)
    req.Credentials = New NetworkCredential("user01", "mypassword")
    req.Method = WebRequestMethods.Ftp.UploadFile

    Using st As Stream = req.GetRequestStream()
      Using fs As New FileStream(myFile, FileMode.Open)
        Dim buf(1024) As Byte
        Dim count As Integer = 0

        Do
          count = fs.Read(buf, 0, buf.Length)
          st.Write(buf, 0, count)
        Loop While count <> 0
      End Using
    End Using
  End Sub
End Class

' コンパイル方法:vbc ftpwebput.vb
WebRequestクラスによりFTPでアップロードを行うVBのサンプル・プログラム(ftpwebput.vb)

 なお、FTPによるファイル転送にはバイナリ・モードとアスキー・モード(テキスト・モード)の2つがあるが、本稿ではバイナリ・ファイルを転送するため、すべてバイナリ・モードを使用している(このモードがデフォルト)。アスキー・モードによる転送を行うには、FtpWebRequestオブジェクト(WebRequestオブジェクトをFtpWebRequest型にキャストする)のUseBinaryプロパティにfalseを設定すればよい。

 ちなみに、FTPによる接続は再利用される。このため連続してファイルのダウンロードを行う場合などは、1つ目のダウンロードまでには時間がかかるが2つ目以降は速くなるはずだ。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:クラス・ライブラリ 処理対象:ネットワーク
使用ライブラリ:WebRequestクラス(System.Net名前空間)
使用ライブラリ:WebResponseクラス(System.Net名前空間)
使用ライブラリ:NetworkCredentialクラス(System.Net名前空間)
使用ライブラリ:FtpWebRequestクラス(System.Net名前空間)
使用ライブラリ:WebRequestMethods.Ftpクラス(System.Net名前空間)
関連TIPS:WebClientクラスでFTPによりファイル転送を行うには?
関連TIPS:WebRequest/WebResponseクラスでWebページを取得するには?

この記事と関連性の高い別の.NET TIPS
WebClientクラスでFTPによりファイル転送を行うには?
FTPでエラーが発生した場合に生のメッセージを取得するには?
FTP時にディレクトリの存在を調べるには?
WebRequest/WebResponseクラスでWebページを取得するには?
WebClientクラスでWebページを取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間