注意:ここで紹介している方法は、.NET Framework 2.0以降でのみ使用できます。
リジュームダウンロードとは、以前途中までダウンロードしたファイルがあるとき、その続きからダウンロードを再開することです。
「FtpWebRequest、FtpWebResponseクラスを使ってFTPサーバーにアクセスする」でFTPサーバーからファイルをダウンロードする方法を紹介しました。このようにFtpWebRequestクラスを使ってダウンロードする時、FtpWebRequest.ContentOffsetプロパティにダウンロードするファイルの開始位置を設定することで、ファイルの途中からのダウンロードが可能になります。
「FtpWebRequest、FtpWebResponseクラスを使ってFTPサーバーにアクセスする」で紹介したコードを改造して、リジュームダウンロードに対応した例を以下に示します。
'ダウンロードするファイルの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()
//ダウンロードするファイルの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サーバーにあるファイルが同じであるかは分かりませんので、注意が必要です。