[[20150420153458]] 『API関数でFTP接続しファイル情報を取得したい』(KUKI) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『API関数でFTP接続しファイル情報を取得したい』(KUKI)

 こんにちは。
 VBAでFTP接続をしてファイルをダウンロードする方法をネット探して
 出来るようになったのですが、最終更新日が取得出来なくて困っています。
 別のPCでBASP21というのを使ったら日付を取得できたのですが、自分のPCは
 エクセル64ビット版なので無料のは使えないと書いてありました。
 最終更新日の取得方法をご存じの方がいらっしゃいましたら、
 ご教示願えますでしょうか?よろしくお願い致します。

 コードは以下になります。
 配列に格納するまでのコードになります。
 (APIの宣言の部分は省略しています。)

 Sub ファイル一覧取得()
    hOpen = 0
    hConnection = 0

    'IME を off (半角英数) にする
    If IMEStatus <> vbIMEModeOff Then
        SendKeys "{kanji}"
    End If

    cnt = 0
    'インターネットサービスのハンドル取得 - hOpen
    hOpen = InternetOpen("FTPSample", INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
    If (hOpen <> 0) Then 'ハンドル取得成功

        'インターネットセッションのハンドル取得(FTPサーバへ接続) - hConnection
        hConnection = InternetConnect(hOpen, サーバ名, INTERNET_INVALID_PORT_NUMBER, _
        ユーザ名, パスワード, INTERNET_SERVICE_FTP, 0, 0)
        If (hConnection <> 0) Then '接続成功

            'FTPサーバのカレントディレクトリを変更
            result = FtpSetCurrentDirectory(hConnection, ディレクトリ)
            If (result <> 0) Then 'ディレクトリ変更成功
                'ファイルリストを取得
                hFind = FtpFindFirstFile(hConnection, "*.*", w32FindData, INTERNET_FLAG_RELOAD, 0)
                If (hFind = 0) Then
                    MsgBox "ファイル名を取得できませんでした。"
                Else
                    Do
                    strFile = Left(w32FindData.cFileName, InStr(w32FindData.cFileName, vbNullChar) - 1)
                    strFile = Mid(strFile, InStrRev(strFile, " ") + 1) 'ファイル名にゴミが付く場合は、排除。
                    If ((w32FindData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = &H10) Then
                    	ReDim Preserve FileList(cnt)
                        FileList(cnt) = strFile 'ファイル名(ディレクトリ名)をファイル名リストに追加
                        cnt = cnt + 1
                    End If
                    Loop Until InternetFindNextFile(hFind, w32FindData) = 0 '次のファイル名を取得
                End If
            Else          
                MsgBox "ディレクトリの移動に失敗しました。"
            End If
        Else
            MsgBox "FTPサーバへ接続できませんでした。"
        End If
    Else
        MsgBox "FTPサーバへ接続できませんでした。"
    End If
  'インターネットセッションを閉じる
  If (hConnection <> 0) Then InternetCloseHandle hConnection
  'インターネットサービスを閉じる
  If (hOpen <> 0) Then InternetCloseHandle hOpen
End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 回答が付かないので、コメントまで。

 GUI の FTP クライアントは FTPZILLA や FFFTP などを使うのが手っ取り早いと
 思いますが、VBA でないと困ることはあるでしょうか。

 VBS であれば、ネット検索すると32ビットコマンドなどを経由して使用すれば64 ビット
 コマンドでも使用できたというような話は見かけたので、どうしても VBA ということで
 あれば、参考にされたらと思います。

 EXCCEL 64 から、CScript 32 を呼び出して、該当部分をVBS でやるというような、面倒な
 対応になると思いますが。

(Mook) 2015/04/21(火) 07:11


 Mookさん

 コメントありがとうございます。
 FFFTPに接続して、そこに50個ほどフォルダがあるのですが、1週間の間にそれぞれの
 フォルダにアップロードされたファイル名を調べて報告するという作業をしているのですが、
 フォルダ内をひとつひとつ確認するのが面倒なので、日付を指定して、その日付
 より後にアップされたファイル名を取得してエクセルに記載するというような
 ことがVBAでできないかと思い質問しました。
(KUKI) 2015/04/22(水) 09:30

windows付属の、FTP.EXEを利用するのはいかがでしょうか。

 Sub test()
    Dim vList As Variant
    Dim cPath As String
    Dim i As Long

    cPath = ThisWorkbook.Path & "\"

    vList = Split(CreateObject("WScript.Shell").Exec("CMD /C FTP -s:""" & cPath & "ftptest.scr""").StdOut().ReadAll(), vbNewLine)
    For i = 1 To UBound(vList) - 1
        If vList(i) = "" Then
            Exit For
        End If
        Cells(i, "A").Value = Mid(vList(i), 57)
        Cells(i, "B").Value = CDate(Mid(vList(i), 44, 12))
    Next i
 End Sub

(以下の内容で、ブックと同じフォルダにftptest.scrを作成しておくこと)
open 接続先名またはIPアドレス
ログイン名
パスワード
ls -l
quit
(???) 2015/04/22(水) 12:02


 ???さん

 ありがとうございます。
 すみません、教えていただきたいのですが、
 ftptest.scrを作成とはどのようにすればいいのでしょうか

 テキストに以下の

 open 接続先名またはIPアドレス 
 ログイン名 
 パスワード 
 ls -l 
 quit

 を記入してftptest.scrという名前で同じフォルダに保存するということでしょうか?

(KUKI) 2015/04/22(水) 16:33


その通りです。メモ帳等のエディタを使ってください。
何も結果が得られない場合は、DOSプロンプトを立ち上げ、FTP -s:ftptest.scr を実行してみてください。

FTP.EXEには、コマンドをスクリプトファイルとして用意しておき、これを指定することで自動実行できる機能があるので、これを利用しています。
64bitでも32bitでも、DOSプロンプト上のコマンドは同じに動くと思います。
(???) 2015/04/22(水) 16:43


 ???さん

 返事が遅くなってすみません。
 言われた通りにしたら出来ました!ありがとうございますm(__)m

 すみません、また教えていただきたいのですが、コードを実行して
 vListの配列に格納されたデータが2つ上のフォルダでして、
 2つ下のフォルダの中のファイルの日時を取得したいのですが、
 フォルダを指定したりとかはできるのでしょうか?

(KUKI) 2015/04/24(金) 10:37


はい、別途作成したftptest.scrの中で、パスワードを指定した次の行に、cd aaa/bbb とか入れてください。
(???) 2015/04/24(金) 10:56

???さん

 ありがとうございます!
 無事に日付を取得することができましたm(__)m

(KUKI) 2015/04/24(金) 15:03


 すみません、もうひとつ質問お願いします。

 上のコードでデータを取得できたのですが、データの末尾にスペースみたいなのが
 入っていて、Trimで削除しようとしたのですが、消えませんでした。
 If Right(vList(i),1) = " " then で確認したところFalseだったのですが、
 半角スペースではないのでようか?

 vList(i) = Left(vlist(i),len(vlist(i))-1) でスペースは消えたのですが、
 このスペースみたいなのの正体ってなんなのでしょうか?

(KUKI) 2015/04/24(金) 15:34


改行コードvbNewLine(&H0D)が1バイトくっついてますね。

lsの結果を画面表示する場合は改行コードは1つなのですが、リダイレクションすると、ファイル名の後に、改行がだぶるようです。
見た目には判らないので、気づきませんでした。

かといって、2つの改行コードでSplitはできない(他の文字列は改行が1回なので、繋がってしまう)ので、
現状のように末尾1文字切り捨ててご使用ください。
(???) 2015/04/24(金) 16:08


 ???さん

 教えていただきありがとうございましたm(__)m
 おかげで思った通りの動きになりました。
 本当にありがとうございました。 
(KUKI) 2015/04/24(金) 16:47

 ???さん

 おはようございます。
 先日はありがとうございました。
 すみません、もう一つ質問お願いします。
 処理中に黒い画面が出てくるのを非表示にすることってできるのでしょうか?

(KUKI) 2015/04/27(月) 10:57


現状、vListを1行で作成している部分をやめて、Shell関数でDOSプロンプトを起動するようにして、この引数にvbHideを指定すれば隠れます。
が、複数行に分かれてしまうし、変数宣言も増えるし、Shellの完了を調べるような処理が必要になるし、改悪になるので、ちょっと…。

更には、もし処理が中断してプロセスが残ってしまった場合に、ウィンドウが見えないので、問題に気づきにくくなってしまいます。
(???) 2015/04/27(月) 11:07


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.