アプリケーションをインストールしたりアンインストールしたり、ファイルを整理したりしているうちに、気づけば PC 内には中身が空っぽのフォルダーがたくさん溜まっていることがあります。
一つ一つは小さくても、数が増えると見た目も悪く、フォルダーを探す際の邪魔になります。
今回は、AutoItを使って指定した場所から空のフォルダーをすべて探し出し、一括で削除する便利なスクリプトを紹介します。
実行するスクリプトの概要
このスクリプトは、最初に「掃除したい場所」のフォルダーを選択すると、その中にある全てのサブフォルダーをチェックします。
そして、中身が完全に空(ファイルもサブフォルダーも無い)のフォルダーだけをリストアップし、最後に確認メッセージを表示した上で一括で削除します。
Cドライブ直下など、一部の空のフォルダーはシステムにとって必要な場合があります。
サンプルコード
#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に渡して空かどうかを判定します。
もし_IsEmptyFolderがTrue(空である)を返した場合、見つかった空フォルダーの数をカウントし、そのパスを$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にセットします。- つまり、
@errorが1であるということは、そのフォルダーが正真正銘の「空」であることを意味します。そのため、True(空です)を返します。
Return False:@errorがセットされなかった場合は、何かしらのアイテムが見つかったということなので、False(空ではありません)を返します。
まとめ
普段あまり意識することのない空フォルダーですが、このスクリプトで定期的に掃除することで、PCのファイル構造をスッキリと保つことができます。
自作関数_IsEmptyFolderの部分は、他のスクリプトでも「フォルダーが空かどうか」を判定したい時に応用できる便利な部品なので、ぜひ活用してみてください。
コメント