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

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

ただいまの
回答率

90.35%

  • VB.NET

    1124questions

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

  • FTP

    396questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 12K+

ky_46

score 88

前提・実現したいこと

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

該当のソースコード

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追記

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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/28 13:49

    ありがとうございます。
    お返事に時間かかってしまい、申し訳ありません。

    本日、やっとためせました。
    質問内容に追記の通り、一度ファイル名を取得、そのファイル名でサイズや更新日時を再取得すれば、なんとか希望の動作にはなりました。

    ただ、時間がけっこうかかるのと、相手側負荷が気になっています。

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • VB.NET

    1124questions

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

  • FTP

    396questions

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