###前提・実現したいこと
FTPのチェックを自動化したいと考えています。
新しいファイルや、同名のファイルが更新されたとき、サイズや最終更新日時が変わっているのをFTPクライアンとで人力で探し、ダウンロードしていますので、それを自動化したいと考えています。
そこで、このようなコードを組みました。
###該当のソースコード
VB.NET
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Call ftp_fileList("ftp:/hoge.co.jp/hogeftp/DownLoad") End Sub ↓以下、Moduleに記述 Sub ftp_fileList(ByVal listUrl As String) 'FTPのファイル一覧を取得 Dim u As New Uri(listUrl) 'FtpWebRequestの作成 Dim ftpReq As System.Net.FtpWebRequest = CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest) 'ログインユーザー名とパスワードを設定 ftpReq.Credentials = New System.Net.NetworkCredential(Form1.TextBox1.Text, Form1.TextBox2.Text) 'MethodにWebRequestMethods.Ftp.ListDirectoryDetails("LIST")を設定 ftpReq.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails '要求の完了後に接続を閉じる ftpReq.KeepAlive = False 'PASSIVEモードを無効にする ftpReq.UsePassive = False ''ASCIIモード ftpReq.UseBinary = False 'FtpWebResponseを取得 Dim ftpRes As System.Net.FtpWebResponse = CType(ftpReq.GetResponse(), System.Net.FtpWebResponse) 'FTPサーバーから送信されたデータを取得 Dim sr As New System.IO.StreamReader(ftpRes.GetResponseStream(), System.Text.Encoding.Default) While (sr.Peek() >= 0) ' ファイルを 1 行ずつ読み込み、パース作業 Call ftp_ishParse(sr.ReadLine()) End While '閉じる ftpRes.Close() End Sub Sub ftp_ishParse(ByVal tx1 As String) System.Diagnostics.Debug.WriteLine(tx1) End Sub
ボタン1をクリックすると、対象のFTPに接続します(アカウントとパスワードは、form1のテキストボックスに入っています)
###上記の結果
出力に対し、
-rw-rw---- 1 owner group 63 Apr 05 15:47 out1.csv
-rw-rw---- 1 owner group 5220 Jan 04 2016 inp_20160104.csv
など、形式が一定でない結果が返ります。
out1.csvでは、日付と時刻が入っていますが、年と秒がありません。
一方、inp_20160104.csvでは、年があるのに時刻がありません。
しかし、FileZillaなどFTPクライアントでみますと、両方のファイルとも、年月日時分秒が揃っています。
という事は、データとしては、年月日時分秒の日付データは持っているかと思います。
この結果を安定させて、ファイル名、サイズ、年月日時分秒の日付データを取得する方法はありますでしょうか?
取得出来れば、データベースに登録しておき、見つからないファイル名や、ファイル名でSELECTしたときに、サイズが違ったり、日付が違う(比較で新しい事は確認します)で選び出し、ダウンロードなどを自動で行えるようにしたいと思っています。
よろしくお願いいたします。
2016/09/28追記
VB.NET
Sub bu1() 'FTPのファイル一覧を取得 Dim u As New Uri("ftp://" & Form1.TextBox3.Text & "/hogehoge/") 'FtpWebRequestの作成 ftpReq = CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest) 'ログインユーザー名とパスワードを設定 ftpReq.Credentials = New System.Net.NetworkCredential(Form1.TextBox1.Text, Form1.TextBox2.Text) 'MethodにWebRequestMethods.Ftp.ListDirectoryDetails("NLIST")を設定 ftpReq.Method = System.Net.WebRequestMethods.Ftp.ListDirectory '要求の完了後に接続を閉じない ftpReq.KeepAlive = True 'PASSIVEモードを無効にする ftpReq.UsePassive = False ''ASCIIモード ftpReq.UseBinary = False 'FtpWebResponseを取得 Dim ftpRes As System.Net.FtpWebResponse = CType(ftpReq.GetResponse(), System.Net.FtpWebResponse) 'FTPサーバーから送信されたデータを取得 Dim sr As New System.IO.StreamReader(ftpRes.GetResponseStream(), System.Text.Encoding.Default) While (sr.Peek() >= 0) 'ファイルサイズ Dim u2 As New Uri("ftp://" & Form1.TextBox3.Text & "/hogehoge/" & sr.ReadLine()) Dim ftpReq2 As System.Net.FtpWebRequest = CType(System.Net.WebRequest.Create(u2), System.Net.FtpWebRequest) ftpReq2.Credentials = New System.Net.NetworkCredential(Form1.TextBox1.Text, Form1.TextBox2.Text) ftpReq2.Method = System.Net.WebRequestMethods.Ftp.GetFileSize Dim ftpRes2 As System.Net.FtpWebResponse = CType(ftpReq2.GetResponse(), System.Net.FtpWebResponse) Console.WriteLine(ftpRes2.ContentLength) ftpRes2.Close() '更新日時 Dim ftpReq3 As System.Net.FtpWebRequest = CType(System.Net.WebRequest.Create(u2), System.Net.FtpWebRequest) ftpReq3.Credentials = New System.Net.NetworkCredential(Form1.TextBox1.Text, Form1.TextBox2.Text) ftpReq3.Method = System.Net.WebRequestMethods.Ftp.GetDateTimestamp Dim ftpRes3 As System.Net.FtpWebResponse = CType(ftpReq3.GetResponse(), System.Net.FtpWebResponse) Console.WriteLine(ftpRes3.LastModified) ftpRes3.Close() End While sr.Close() '閉じる ftpRes.Close()
まず、ファイルの一覧リストを取得し、それを回しながら、サイズと日付を取得できました。
ただ、この方法だとけっこう時間がかかります。
また、FTP側に必要以上の負荷がかかっていないかも心配です。
FtpWebRequestが複数になっているのは、
.Method = System.Net.WebRequestMethods.
で何か設定すると(例:ファイル一覧の.Ftp.ListDirectory)、別のメソッドを再設定できないためです。
まだ回答がついていません
会員登録して回答してみよう