DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

FTPのリジュームダウンロード(途中からのダウンロード)を行う

注意:ここで紹介している方法は、.NET Framework 2.0以降でのみ使用できます。

リジュームダウンロードとは、以前途中までダウンロードしたファイルがあるとき、その続きからダウンロードを再開することです。

FtpWebRequest、FtpWebResponseクラスを使ってFTPサーバーにアクセスする」でFTPサーバーからファイルをダウンロードする方法を紹介しました。このようにFtpWebRequestクラスを使ってダウンロードする時、FtpWebRequest.ContentOffsetプロパティにダウンロードするファイルの開始位置を設定することで、ファイルの途中からのダウンロードが可能になります。

FtpWebRequest、FtpWebResponseクラスを使ってFTPサーバーにアクセスする」で紹介したコードを改造して、リジュームダウンロードに対応した例を以下に示します。

VB.NET
コードを隠すコードを選択
'ダウンロードするファイルのURI
Dim u As New Uri("ftp://localhost/test.txt")
'ダウンロードしたファイルの保存先
Dim downFile As String = "C:\test.txt"

'FtpWebRequestの作成
Dim ftpReq As System.Net.FtpWebRequest = _
    CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest)
'ログインユーザー名とパスワードを設定
ftpReq.Credentials = New System.Net.NetworkCredential("username", "password")
'MethodにWebRequestMethods.Ftp.DownloadFile("RETR")を設定
ftpReq.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
'要求の完了後に接続を閉じる
ftpReq.KeepAlive = False
'ASCIIモードで転送する
ftpReq.UseBinary = False
'PASSIVEモードを無効にする
ftpReq.UsePassive = False

'リジュームダウンロードを行うか判断する
'ダウンロードしたファイルを書き込むためのFileStream
Dim fs As System.IO.FileStream
If System.IO.File.Exists(downFile) Then
    'リジュームダウンロードを行う
    ftpReq.ContentOffset = New System.IO.FileInfo(downFile).Length
    fs = New System.IO.FileStream( _
        downFile, System.IO.FileMode.Append, System.IO.FileAccess.Write)
Else
    '普通のダウンロードを行う
    fs = New System.IO.FileStream( _
        downFile, System.IO.FileMode.Create, System.IO.FileAccess.Write)
End If

'FtpWebResponseを取得
Dim ftpRes As System.Net.FtpWebResponse = _
    CType(ftpReq.GetResponse(), System.Net.FtpWebResponse)
'ファイルをダウンロードするためのStreamを取得
Dim resStrm As System.IO.Stream = ftpRes.GetResponseStream()
'ダウンロードしたデータを書き込む
Dim buffer(1024) As Byte
While True
    Dim readSize As Integer = resStrm.Read(buffer, 0, buffer.Length)
    If readSize = 0 Then
        Exit While
    End If
    fs.Write(buffer, 0, readSize)
End While
fs.Close()
resStrm.Close()

'FTPサーバーから送信されたステータスを表示
Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription)
'閉じる
ftpRes.Close()
C#
コードを隠すコードを選択
//ダウンロードするファイルのURI
Uri u = new Uri("ftp://localhost/test.txt");
//ダウンロードしたファイルの保存先
string downFile = "C:\\test.txt";

//FtpWebRequestの作成
System.Net.FtpWebRequest ftpReq = (System.Net.FtpWebRequest)
    System.Net.WebRequest.Create(u);
//ログインユーザー名とパスワードを設定
ftpReq.Credentials = new System.Net.NetworkCredential("username", "password");
//MethodにWebRequestMethods.Ftp.DownloadFile("RETR")を設定
ftpReq.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
//要求の完了後に接続を閉じる
ftpReq.KeepAlive = false;
//ASCIIモードで転送する
ftpReq.UseBinary = false;
//PASSIVEモードを無効にする
ftpReq.UsePassive = false;

//リジュームダウンロードを行うか判断する
//ダウンロードしたファイルを書き込むためのFileStream
System.IO.FileStream fs;
if (System.IO.File.Exists(downFile))
{
    //リジュームダウンロードを行う
    ftpReq.ContentOffset = (new System.IO.FileInfo(downFile)).Length;
    fs = new System.IO.FileStream(
        downFile, System.IO.FileMode.Append, System.IO.FileAccess.Write);
}
else
{
    //普通のダウンロードを行う
    fs = new System.IO.FileStream(
        downFile, System.IO.FileMode.Create, System.IO.FileAccess.Write);
}

//FtpWebResponseを取得
System.Net.FtpWebResponse ftpRes =
    (System.Net.FtpWebResponse)ftpReq.GetResponse();
//ファイルをダウンロードするためのStreamを取得
System.IO.Stream resStrm = ftpRes.GetResponseStream();
//ダウンロードしたデータを書き込む
byte[] buffer = new byte[1024];
while (true)
{
    int readSize = resStrm.Read(buffer, 0, buffer.Length);
    if (readSize == 0)
        break;
    fs.Write(buffer, 0, readSize);
}
fs.Close();
resStrm.Close();

//FTPサーバーから送信されたステータスを表示
Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription);
//閉じる
ftpRes.Close();

リジュームダウンロードするときは、すでにダウンロードしているファイルのサイズをFtpWebRequestクラスのContentOffsetプロパティに設定して、保存するファイルを追加書き込みで開いています。それ以外は、通常のダウンロードと同じです。

ただし、すでに途中までダウンロードしているファイルと、FTPサーバーにあるファイルが同じであるかは分かりませんので、注意が必要です。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。