質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

31503閲覧

FTPからファイル名、最終更新日時、サイズを得たい

ky_46

総合スコア92

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/09/20 08:41

編集2016/09/28 04:50

###前提・実現したいこと
FTPのチェックを自動化したいと考えています。
新しいファイルや、同名のファイルが更新されたとき、サイズや最終更新日時が変わっているのをFTPクライアンとで人力で探し、ダウンロードしていますので、それを自動化したいと考えています。
そこで、このようなコードを組みました。

###該当のソースコード

VB.NET

1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 2 Call ftp_fileList("ftp:/hoge.co.jp/hogeftp/DownLoad") 3 End Sub 4 5↓以下、Moduleに記述 6 7 Sub ftp_fileList(ByVal listUrl As String) 8 'FTPのファイル一覧を取得 9 Dim u As New Uri(listUrl) 10 11 'FtpWebRequestの作成 12 Dim ftpReq As System.Net.FtpWebRequest = 13 CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest) 14 'ログインユーザー名とパスワードを設定 15 ftpReq.Credentials = New System.Net.NetworkCredential(Form1.TextBox1.Text, Form1.TextBox2.Text) 16 'MethodにWebRequestMethods.Ftp.ListDirectoryDetails("LIST")を設定 17 ftpReq.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails 18 '要求の完了後に接続を閉じる 19 ftpReq.KeepAlive = False 20 'PASSIVEモードを無効にする 21 ftpReq.UsePassive = False 22 ''ASCIIモード 23 ftpReq.UseBinary = False 24 25 'FtpWebResponseを取得 26 Dim ftpRes As System.Net.FtpWebResponse = 27 CType(ftpReq.GetResponse(), System.Net.FtpWebResponse) 28 'FTPサーバーから送信されたデータを取得 29 Dim sr As New System.IO.StreamReader(ftpRes.GetResponseStream(), System.Text.Encoding.Default) 30 While (sr.Peek() >= 0) 31 ' ファイルを 1 行ずつ読み込み、パース作業 32 Call ftp_ishParse(sr.ReadLine()) 33 34 End While 35 36 '閉じる 37 ftpRes.Close() 38 End Sub 39 40Sub ftp_ishParse(ByVal tx1 As String) 41 System.Diagnostics.Debug.WriteLine(tx1) 42End 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

1 Sub bu1() 2 'FTPのファイル一覧を取得 3 Dim u As New Uri("ftp://" & Form1.TextBox3.Text & "/hogehoge/") 4 5 'FtpWebRequestの作成 6 ftpReq = CType(System.Net.WebRequest.Create(u), System.Net.FtpWebRequest) 7 8 'ログインユーザー名とパスワードを設定 9 ftpReq.Credentials = New System.Net.NetworkCredential(Form1.TextBox1.Text, Form1.TextBox2.Text) 10 11 'MethodにWebRequestMethods.Ftp.ListDirectoryDetails("NLIST")を設定 12 ftpReq.Method = System.Net.WebRequestMethods.Ftp.ListDirectory 13 '要求の完了後に接続を閉じない 14 ftpReq.KeepAlive = True 15 'PASSIVEモードを無効にする 16 ftpReq.UsePassive = False 17 ''ASCIIモード 18 ftpReq.UseBinary = False 19 20 'FtpWebResponseを取得 21 Dim ftpRes As System.Net.FtpWebResponse = 22 CType(ftpReq.GetResponse(), System.Net.FtpWebResponse) 23 'FTPサーバーから送信されたデータを取得 24 Dim sr As New System.IO.StreamReader(ftpRes.GetResponseStream(), System.Text.Encoding.Default) 25 26 27 28 While (sr.Peek() >= 0) 29 'ファイルサイズ 30 Dim u2 As New Uri("ftp://" & Form1.TextBox3.Text & "/hogehoge/" & sr.ReadLine()) 31 32 Dim ftpReq2 As System.Net.FtpWebRequest = CType(System.Net.WebRequest.Create(u2), System.Net.FtpWebRequest) 33 ftpReq2.Credentials = New System.Net.NetworkCredential(Form1.TextBox1.Text, Form1.TextBox2.Text) 34 ftpReq2.Method = System.Net.WebRequestMethods.Ftp.GetFileSize 35 36 Dim ftpRes2 As System.Net.FtpWebResponse = CType(ftpReq2.GetResponse(), System.Net.FtpWebResponse) 37 Console.WriteLine(ftpRes2.ContentLength) 38 39 ftpRes2.Close() 40 41 '更新日時 42 Dim ftpReq3 As System.Net.FtpWebRequest = CType(System.Net.WebRequest.Create(u2), System.Net.FtpWebRequest) 43 ftpReq3.Credentials = New System.Net.NetworkCredential(Form1.TextBox1.Text, Form1.TextBox2.Text) 44 ftpReq3.Method = System.Net.WebRequestMethods.Ftp.GetDateTimestamp 45 46 Dim ftpRes3 As System.Net.FtpWebResponse = CType(ftpReq3.GetResponse(), System.Net.FtpWebResponse) 47 Console.WriteLine(ftpRes3.LastModified) 48 49 ftpRes3.Close() 50 End While 51 sr.Close() 52 53 '閉じる 54 ftpRes.Close()

まず、ファイルの一覧リストを取得し、それを回しながら、サイズと日付を取得できました。
ただ、この方法だとけっこう時間がかかります。
また、FTP側に必要以上の負荷がかかっていないかも心配です。

FtpWebRequestが複数になっているのは、
.Method = System.Net.WebRequestMethods.
で何か設定すると(例:ファイル一覧の.Ftp.ListDirectory)、別のメソッドを再設定できないためです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

更新日時はFtpWebRequestクラスにあるLastModifiedプロパティで取得できそうです。
環境がないので試していないですが、下記の記事を参考にしてみてください。
http://dobon.net/vb/dotnet/internet/ftpwebrequest.html
見た感じ、1ファイルずつ取得しないといけない感じでしょうかね。

投稿2016/09/23 05:51

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ky_46

2016/09/28 04:49

ありがとうございます。 お返事に時間かかってしまい、申し訳ありません。 本日、やっとためせました。 質問内容に追記の通り、一度ファイル名を取得、そのファイル名でサイズや更新日時を再取得すれば、なんとか希望の動作にはなりました。 ただ、時間がけっこうかかるのと、相手側負荷が気になっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問