どうも!リョクちゃです。
今回は、ファイルのタイムスタンプとして分類される更新日時に注目し、
ファイルの更新日時のタイムスタンプを取得する方法を例を交えて紹介していきます。
今回例として作成するアプリケーションは、
あるフォルダに複数のファイルが保存されています。
この中から最新の更新日時のファイルを見つけ、指定のボックスにファイル名を表示する
といったアプリケーションを作成していきます。
ちなみに前回はこちら、
目次
準備編:フォーム画面の作成
まず最初に下のようなフォーム画面を作成します。
ここで最新のファイル名の下のボックスはReadOnlyにしておきましょう。
ReadOnlyにするには、ボックスを選択後プロパティ欄のReadOnlyという項目を
Trueにすることで設定ができます。(下図ご参考)
ちなみに筆者の環境は、
- VisualStudio2019
- Windows 10 64bit
- .Net Framework 4.5.2
です。
フォルダのパスが入力されているか確認する
まず、ボタンを押したら動作させるにあたって先に調べたいフォルダのパスが
入力されているかチェックをするコードを書いていきます。
コードは下のようになります。
1 2 3 4 5 6 7 8 |
Public Class TestTimestamp Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 調べたいフォルダのパスが入力されていたら If Me.TextBox1.Text <> "" Then End If End Sub End Class |
Me.TextBox1.Text <> “” のとき、
つまり“”(空白)以外の時のみ処理を走らせるようにしています。
<>と書くことで右辺と左辺が等しくない時の条件文になります。
フォルダからすべてのファイルパスを取得する
次に指定のフォルダに保存されているすべてのファイルパスを取得します。
全てのファイルを取得するには、
と書くことですべてのファイルを配列型で受け取ることができます。
コードを書くと下のようになります。
1 2 3 4 5 6 7 8 9 10 11 |
Public Class TestTimestamp Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 調べたいフォルダのパスが入力されていたら If Me.TextBox1.Text <> "" Then ' フォルダのパスから全てのファイルを取得 Dim files As String() = System.IO.Directory.GetFiles(Me.TextBox1.Text) End If End Sub End Class |
更新日時を取得するための変数を作成
各ファイルごとにファイルの更新日時を取得する前に、取得した更新日時データを
一時的に保存しておく変数を作成してあげます。
今回は、Dictionary型の変数を作成してみようと思います。
Dictionary型は
の表記で表すことができます。
コードは下のようになります。
1 2 3 4 5 6 7 8 9 10 11 |
Public Class TestTimestamp Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 調べたいフォルダのパスが入力されていたら If Me.TextBox1.Text <> "" Then ' フォルダのパスから全てのファイルを取得 Dim files As String() = System.IO.Directory.GetFiles(Me.TextBox1.Text) ' ファイルの更新日時を格納する変数を作成 Dim dictTime As New Dictionary(Of DateTime, String) End If End Sub End Class |
Keyの型をDateTime、Valueの型をStringとそれぞれ設定しています。
ファイルの更新日時を取得する
それでは、いよいよファイルごとに更新日時を取得していきます。
ファイルの更新日時は、
と書くことで更新日時が取得できます。
コードは下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Public Class TestTimestamp Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 調べたいフォルダのパスが入力されていたら If Me.TextBox1.Text <> "" Then ' フォルダのパスから全てのファイルを取得 Dim files As String() = System.IO.Directory.GetFiles(Me.TextBox1.Text) ' ファイルの更新日時を格納する変数を作成 Dim dictTime As New Dictionary(Of DateTime, String) ' ファイル分処理を行う For Each file As String In files ' ファイルの更新日時をdictTime変数に格納 dictTime(System.IO.File.GetLastWriteTime(file)) = file Next file End If End Sub End Class |
keyには更新日時、Valueにはファイル名として、それぞれ格納しています。
最新の更新日時を持つファイルをボックスに表示
最後に最新の更新日時を持つファイル名をボックスに表示するコードを書いていきます。
最新の更新日時のファイルを取得するには、Dictionary変数のMaxメソッドを使用します。
これは、変数に格納されている値の中で最も大きいモノを返してくれるメソッドです。
したがって、dictTime内で更新日時が最も大きい(最新)値を表示することになります。
まず、最も大きい値の取得には、
これでKeyの中で最も大きい値を返します。
これだけではファイル名の取得ができないので、
と書くことで、KeyのValueを取得します。
したがって、更新日時に関連付けられるファイル名を取得します。
このまま表示してしまうとパスまで表示されてしまいますので、
ファイル名のみを抽出します。
これには
を使います。
これらを合わせたコードが下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Public Class TestTimestamp Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 調べたいフォルダのパスが入力されていたら If Me.TextBox1.Text <> "" Then ' フォルダのパスから全てのファイルを取得 Dim files As String() = System.IO.Directory.GetFiles(Me.TextBox1.Text) ' ファイルの更新日時を格納する変数を作成 Dim dictTime As New Dictionary(Of DateTime, String) ' ファイル分処理を行う For Each file As String In files ' ファイルの更新日時をdictTime変数に格納 dictTime(System.IO.File.GetLastWriteTime(file)) = file Next file ' ボックスに最新の更新日時を持つファイルを表示する Me.TextBox2.Text = System.IO.Path.GetFileName(dictTime(dictTime.Keys.Max)) End If End Sub End Class |
実行してみる
実行するにあたって、下のような環境を準備しました。
このフォルダ内のtest.txtが最新のファイルになります。
つまり、test.txtが表示されれば、問題なく動作していることになります。
いざ実行してみます。
フォルダのパスを入力
最新のファイル名を表示
動作自体は問題なくtest.txtを表示することができました。
まとめ
ファイルの更新日時を取得するには、
ご覧いただきありがとうございます。
・こちらの書籍を参考にVB.Net勉強しています。