まりふのひと

フォルダ内のファイル情報を出力するフリーソフト Filistry を使ってみた

昨年、「Cドライブの空き容量が20%を切りました。今後どうすればいいのでしょうか?」という質問があった。この時使ってみた DriveAnalyzer は、確かに可視的に解るので面白いソフトであるが、何でもかんでもため込んだ人 に「何故そうなったか?」を解らせることは無理‥‥ と感じた。
今回使った Filistry はファイルをリストアップするソフトである。結果を csv で出力すると Excel で解析できる。更に、使ってみて解ったことであるが、USB にインストールできる ので、「何でもかんでもため込んだ人」のパソコンに差し込んで、データを取得すれば、持ち帰って解析できる利点がある...


 VBAの作成
やってみてわかったことであるが、フォルダごとの容量が得られない。そこで、パス名を任意の位置で切るVBAを作成、Excel の[集計]でフォルダごとの容量がわかるようにした。
VBA は 単独のテキストファイル(後述)とし、インポートで取り込む方式とした。


 Filistry ver.1.36 の設定
下記以外はデフォルトどおりとした。(たぶん)

  • 出力形式
  • 対象項目
    • ファイルサイズ: 8 B (バイト)
    • R 拡張子
    • R 作成日時
    • R 最終更新日時


 Filistry [実行]結果
マイドキュメントを指定して[実行]すると、次のような表ができる。

  • 5行目がタイトル行となる。(タイトル行の塗りつぶしは自分で行う)
  • 実際のデータは6行目以降となる。 (上記例では、6〜11,561行目)
  • G〜I 列は、後から追加したもの。


 Excel 上での編集

  1. VBA のインポート
    1. [ツール]メニュー ⇒[マクロ]⇒[Visual Basic Editor]([Alt]+[F11])
    2. [ファイル]メニュー ⇒[ファイルのインポート]
    3. 上記の FilistryVBA.bas を[開く]
    4. 閉じる
  2. タイトルの追加
    • セルG6: “DF” ‥‥ その行が、Directory情報か File情報かの区別
    • セルH6: “レベル” ‥‥ A列のパスを切る位置(“\”の数)
    • セルI6: “レベルパス” ‥‥ A列を「レベル」で切った後のパス
  3. セルG6(DF)の入力: “=getDF(C6,D6)”
     以下の行は、フィルハンドルでコピーする。
  4. セルH6(レベル)の入力: 適当に入力する。
     以下の行は、フィルハンドルでコピーするか、手入力する。
  5. セルI6(レベルパス)の入力: “=getLevelPath(A6,H6)”
     以下の行は、フィルハンドルでコピーする。
  6. 自動計算をオフにする。 ‥‥ 忘れると、以下の処理で固まったような状態になる。(止められない)
    1. [ツール]メニュー ⇒[オプション]⇒[計算方法]タブ
    2. 「計算方法」を 8 手動 にする。
  7. 「DF」が“1”(ファイルデータ)以外のレコードを削除し、
  8. 「レベルパス」で[集計]する。



 FilistryVBA.bas

Attribute VB_Name = "FilistryVBA"
Option Explicit

'概要:argパス から argレベル 数番目の"\"の前までのパスを返す。
'履歴:H23.10.30    初版
Public Function getLevelPath(argパス As String, argレベル As Variant) As String
On Error GoTo Err_getLevelPath
Dim mbTitle As String
Dim lngLevel As Long
Dim i As Long, s As Long, ss As Long
Dim strLevelPath As String

    mbTitle = "FilistryVBA/getLevelPath"
    If argレベル = "" Then
        strLevelPath = ""
        GoTo Exit_getLevelPath
    End If
    lngLevel = Val(argレベル)
    ss = 0
    For i = 1 To lngLevel
        s = InStr(ss + 1, argパス, "\", vbBinaryCompare)
        If s = 0 Then
            Exit For
        Else
            ss = s
        End If
    Next
    If ss = 0 Then
        strLevelPath = argパス
    Else
        strLevelPath = Left(argパス, ss)
    End If
    
Exit_getLevelPath:
    If Right(strLevelPath, 1) = "\" Then
        getLevelPath = Left(strLevelPath, Len(strLevelPath) - 1)
    Else
        getLevelPath = strLevelPath
    End If
    Exit Function
    
Err_getLevelPath:
    MsgBox Err.Number & "/" & Err.Description, vbCritical, mbTitle
    Resume Exit_getLevelPath
End Function

'概要:ファイルであれば 1、ファルダであれば 2、それ以外は 99 を返す。
'履歴:H23.10.30    初版
Public Function getDF(argサイズ As String, arg拡張子 As String) As Long
    
    If Left(argサイズ, 3) = "DIR" Then
        getDF = 2
    ElseIf arg拡張子 <> "" Then
        getDF = 1
    Else
        getDF = 99
    End If

End Function