【AutoIt】空っぽのフォルダーを検知して一括削除

アプリケーションをインストールしたりアンインストールしたり、ファイルを整理したりしているうちに、気づけば PC 内には中身が空っぽのフォルダーがたくさん溜まっていることがあります。

一つ一つは小さくても、数が増えると見た目も悪く、フォルダーを探す際の邪魔になります。

今回は、AutoItを使って指定した場所から空のフォルダーをすべて探し出し、一括で削除する便利なスクリプトを紹介します。

目次

実行するスクリプトの概要

このスクリプトは、最初に「掃除したい場所」のフォルダーを選択すると、その中にある全てのサブフォルダーをチェックします。

そして、中身が完全に空(ファイルもサブフォルダーも無い)のフォルダーだけをリストアップし、最後に確認メッセージを表示した上で一括で削除します。

Cドライブ直下など、一部の空のフォルダーはシステムにとって必要な場合があります。

Win11 「inetpub」フォルダーの復元方法と削除してはいけない理由

サンプルコード

#include <File.au3>
#include <MsgBoxConstants.au3>

; ### メイン処理 ###

; 1. 検索対象のルートフォルダーを選択
Local $sRootFolder = FileSelectFolder("空のフォルダーを検索したい場所を選択してください。", "")
If @error Then Exit

; 2. 指定されたフォルダー内にある、すべてのサブフォルダーのリストを取得する
Local $aFolderList = _FileListToArrayRec($sRootFolder, "*", $FLTAR_FOLDERS, $FLTAR_RECUR, $FLTAR_SORT, 2)

If @error Then
    MsgBox($MB_ICONINFORMATION, "情報", "サブフォルダーは見つかりませんでした。")
    Exit
EndIf

; 3. 空のフォルダーのパスを格納するための配列を準備する
Global $aEmptyFolders[1]
Local $iEmptyFolderCount = 0

; 4. Forループですべてのサブフォルダーをチェックする
For $i = 1 To $aFolderList[0]
    Local $sCurrentFolder = $aFolderList[$i]
    ; フォルダーの中身をチェックし、空っぽならTrueを返す自作関数を呼び出す
    If _IsEmptyFolder($sCurrentFolder) Then
        $iEmptyFolderCount += 1
        ReDim $aEmptyFolders[$iEmptyFolderCount + 1]
        $aEmptyFolders[$iEmptyFolderCount] = $sCurrentFolder
    EndIf
Next

; 5. 実行結果の確認と処理
If $iEmptyFolderCount = 0 Then
    MsgBox($MB_OK, "完了", "空のフォルダーは見つかりませんでした。")
Else
    Local $sConfirmMsg = $iEmptyFolderCount & "個の空のフォルダーが見つかりました。削除しますか?" & @CRLF & @CRLF
    ; 見つかったフォルダーのリストをメッセージに追加する (最大10件まで表示)
    For $i = 1 To $iEmptyFolderCount
        If $i > 10 Then
            $sConfirmMsg &= "..." & @CRLF
            ExitLoop
        EndIf
        $sConfirmMsg &= $aEmptyFolders[$i] & @CRLF
    Next

    Local $iResponse = MsgBox($MB_YESNO + $MB_ICONQUESTION, "確認", $sConfirmMsg)

    If $iResponse = $IDYES Then
        For $sFolderToDelete In $aEmptyFolders
;~             If $sFolderToDelete <> "" Then DirRemove($sFolderToDelete)
            If $sFolderToDelete <> "" Then ConsoleWrite($sFolderToDelete & @CRLF); 確認のため DirRemove をコメントアウトして ConsoleWrite に変更しています。
        Next
        MsgBox($MB_OK, "完了", $iEmptyFolderCount & "個の空のフォルダーを削除しました。")
    Else
        MsgBox($MB_OK, "キャンセル", "処理をキャンセルしました。")
    EndIf
EndIf

Exit


; ======================================================================
; Func _IsEmptyFolder($sFolder)
; 説明:         指定されたフォルダーが空かどうかをチェックします。
; パラメータ:   $sFolder - チェックするフォルダーのパス
; 戻り値:       空ならTrue、空でなければFalseを返します。
; ======================================================================
Func _IsEmptyFolder($sFolder)
    ; フォルダー内に、ファイルまたはサブフォルダーが1つでも存在するかチェック
    Local $aContents = _FileListToArray($sFolder, "*")

    ; @errorが1なら、何も見つからなかったということなので「空」
    If @error Then Return True

    ; 何か見つかった場合は「空ではない」
    Return False
EndFunc   ;==>_IsEmptyFolder

コードの詳しい解説

① 検索ルートの選択

Local $sRootFolder = FileSelectFolder("空のフォルダーを検索したい場所を選択してください。", "")
If @error Then Exit

スクリプトが実行されると、まずこのFileSelectFolder関数によって、ユーザーが空フォルダーを探したい場所(ルートフォルダー)を選択するダイアログが表示されます。

もしユーザーがキャンセルボタンを押した場合、@errorがセットされるため、Exitでスクリプトは終了します。

② 全サブフォルダーのリストアップ

Local $aFolderList = _FileListToArrayRec($sRootFolder, "*", $FLTAR_FOLDERS, $FLTAR_RECUR, $FLTAR_SORT, 2)

ここが、このスクリプトの重要な部分です。

  • _FileListToArrayRec: 指定したフォルダー内を再帰的(サブフォルダーの奥深くまで)に検索します。
  • $FLTAR_FOLDERS: 検索対象をフォルダーのみに限定します。
  • $FLTAR_SORT: 取得したリストを降順(深い階層から順)で並べ替えます。これにより、子フォルダーを先に削除し、その後に親フォルダーをチェックするという安全な順序が保証されます。
  • 6番目の引数である「2」が重要です。このオプションを指定することで、関数が返すパスは常にフルパス(絶対パス)になります。

③ 空フォルダーの判定ループ

For $i = 1 To $aFolderList[0]
    Local $sCurrentFolder = $aFolderList[$i]

    If _IsEmptyFolder($sCurrentFolder) Then
        $iEmptyFolderCount += 1
        ReDim $aEmptyFolders[$iEmptyFolderCount + 1]
        $aEmptyFolders[$iEmptyFolderCount] = $sCurrentFolder
    EndIf
Next

②で取得したフォルダーリストを、Forループを使って一つずつ取り出し、自作関数である_IsEmptyFolderに渡して空かどうかを判定します。

もし_IsEmptyFolderTrue(空である)を返した場合、見つかった空フォルダーの数をカウントし、そのパスを$aEmptyFoldersという専用の配列に格納していきます。

④ 確認と削除の実行

ループが完了した後、見つかった空フォルダーの数($iEmptyFolderCount)に応じて処理を分岐します。

  • 0個の場合: 「見つかりませんでした」というメッセージを表示して終了します。
  • 1個以上の場合:
    • MsgBoxを使って、見つかったフォルダーのリスト(最大10件)をユーザーに提示し、「削除しますか?」と最終確認を求めます。
    • ユーザーが「はい」を選択した場合のみ、For...Inループで$aEmptyFolders配列の中身を一つずつ取り出し、DirRemove関数でフォルダーを削除します。

自作関数 _IsEmptyFolder の解説

Func _IsEmptyFolder($sFolder)
    Local $aContents = _FileListToArray($sFolder, "*")

    If @error Then Return True
    Return False
EndFunc

この関数は、指定された$sFolderが本当に空かどうかを判定する、シンプルかつ確実な方法です。

  • _FileListToArray($sFolder, "*"):
    • 指定されたフォルダーの中身をリストアップします。
    • 第3引数は何も指定しません。(ファイル、フォルダーが検索対象になります)
  • If @error Then Return True:
    • _FileListToArray関数は、対象フォルダーの中にいかなるアイテムも一つも見つけられなかった場合に@errorフラグを1にセットします。
    • つまり、@error1であるということは、そのフォルダーが正真正銘の「空」であることを意味します。そのため、True(空です)を返します。
  • Return False:
    • @errorがセットされなかった場合は、何かしらのアイテムが見つかったということなので、False(空ではありません)を返します。

まとめ

普段あまり意識することのない空フォルダーですが、このスクリプトで定期的に掃除することで、PCのファイル構造をスッキリと保つことができます。

自作関数_IsEmptyFolderの部分は、他のスクリプトでも「フォルダーが空かどうか」を判定したい時に応用できる便利な部品なので、ぜひ活用してみてください。

  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次