AutoIt ディレクトリ内のファイルを検索

autoit ファイル検索 AutoIT

業務自動化は人の作業をロボットに代行してもらいます。各社使っているシステムからExcel(csv含)形式やPDFをダウンロードすることもあるかと思います。
今回はダウンロードボタンを押して(ダウンロードアクションしたなど)ファイルがローカルにダウンロードされ始めてから、そのファイルを探す関数を紹介します。

スポンサーリンク

1. ファイル検索の流れ

エクスプローラを使うのと一緒です

  1. ファイルをダウンロード開始した時間を取得
  2. FileChangeDir($dirpath)でディレクトリ移動
  3. FileFindFirstFile(検索するファイル名)でファイルリストのハンドル取得
  4. FileFindNextFile(↑のハンドル)で検索結果のファイルを1つずつ取得
  5. FileGetTime()などでファイルの更新日時を取得すれば、ダウンロードアクション以降のファイルを取得できる
  6. ダウンロードしたファイルを特定したので、印刷しても開いてもよし

2. 実装してみる

1.まずはファイルをダウンロードした時間を取得。一応、Number($dltime)にしている。20200116142130 (2020/01/16 14:21:30)になる。
これよりもダウンロードされたファイルは後になるので、数値の比較をすれば良い。

Local $dltime = _NowCalc()
$dltime = StringRegExpReplace($dltime, "[/: ]","")
$dltime = Number($dltime)
;ConsoleWrite($dltime)

2. ダウンロードディレクトリが決まっていると仮定して(というか、ロボットに作業させるならダウンロードディレクトリは固定にしてって話ですね)

Local $dldir = @HomeDrive & @HomePath & "\Downloads"
FileChangeDir($dldir)

3.ダウンロードされるファイル名には規則があると思うので、その規則に従ったファイルを検索する。規則がないならワイルドカード*にしてそのディレクトリ内全部のファイルを検索するようにすればいい。経験からダウンロードに最大20秒かかるとすると、5秒毎にファイルを検索しあったら次、なければ終了的なことをする。
ファイルのハンドル($hsearch)は使い終わったらFileClose()しましょう。

Local $skey = "*.pdf"  ;とか、"2020-*-10.xlsx"とか書き方自由にやってみるのが良いです
Local $hsearch = ""
Local $cnts = 0
While 1
  Sleep(5000)
  $hsearch = FileFindFirstFile($skey)
  If $hsearch = -1 Or @error Then 
    $cnts += 5
    If $cnts >= 20 Then 
      FileClose($hsearch)
      Return SetError(1,0,"err: couldnt find file")
    EndIf
  Else 
   ExitLoop
  EndIf
WEnd

4と5 ファイルがあるので、1つずつ更新日時を比較しあったらそこでストップ

While 1 
  Local $dlfilename = FileFindNextFile($hsearch)
  If @error Then
  EndIF
  
  ;FIleGetTimeではYYYYMMDDHHIISSで返してくれる
  Local $modtime = FileGetTime($dlfilename, $FT_MODIFIED, $FT_STRING)
  $modtime = Number($modtime)

  ;時間を比較して新しければダウンロードしたファイルと見なす
  If $modtime >= $dltime Then 
   ;;見つかりました。
  EndIf
WEnd

3. 関数化するといろいろ使えますね

今回は各関数を呼んでいましたが、これ自体を関数にするといろいろ使えるかと思います。


$dldir = @HomeDir & ..."\Downloads"
$skey = "レポート*.xlsx"
$filename = _get_dlfile($dldir, $skey)
If @error Then 
  ;; ダメでしたーー
EndIf

;; $dldir & "\" & $filename がダウンロードしたファイル

Func _get_dlfile($dldir, $skey)
  Local $dlfilename = ""
  ;今の時間取得・・・上記ソースを組み合わせてエラー処理しっかりやればOK

  Return SetError(0,0,$dlfilename)
EndFunc

サンプルをGithubに置きました。

autoit/_get_dlfile.au3 at master · cfautog/autoit
sample code. Contribute to cfautog/autoit development by creating an account on GitHub.

9. 参考リンク

Function FileChangeDir
Function FileFindFirstFile
Function FileFindNextFile
Function FileClose
Function StringRegExpReplace
Function FileGetTime

コメント

タイトルとURLをコピーしました