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

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

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

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

VB.NET

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

解決済

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

ky_46
ky_46

総合スコア0

FTP

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

VB.NET

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

1回答

0評価

0クリップ

22720閲覧

投稿2016/09/20 08:41

編集2022/01/12 10:58

###前提・実現したいこと
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)、別のメソッドを再設定できないためです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

FTP

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

VB.NET

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