フォルダサイズの大きい順に並べ替えについて

【環境】Windows10 Enterprise 2016 LTSB 【状況】 Windows10には、フォルダのサイズ...

Prome_Lin さんからの 回答

  • 2019-02-10 09:02:40
  • 回答No.3
Prome_Lin

ベストアンサー率 42% (201/469)

プログラムファイル(「~.vbs」ファイル)の存在する直下のフォルダから以下のすべてのフォルダを調べます。

プログラムファイルの存在するフォルダは調べていません。

プログラムファイルが存在する同じフォルダ内に「FolderSize.txt」という結果ファイルを作成し、「Finished!」と表示しますので、「OK」を押して、終了してください。

「FolderSize.txt」の内容は、「フルパス」<Tab>「フォルダサイズ」です。

もちろん、大きい順にソートしてあります。

なぜか、サイズが「0」のフォルダを書き出そうとすると、エラーが出たので、サイズが「0」のフォルダ(空白フォルダ)は、書き出していません(必要もないでしょうから)。

Option Explicit
Public c, f, gf, i, j, n(), s(), so, tx, x, y
Set so = CreateObject("Scripting.FileSystemObject")
Set gf = so.GetFolder(so.GetParentFolderName(WScript.ScriptFullName))
Set tx = so.OpenTextFile(gf & "\FolderSize.txt", 2, True)
c = - 1
Call z
Set gf = Nothing
For i = 0 to c - 1
For j = i + 1 to c
If s(i) < s(j) Then
x = s(i)
s(i) = s(j)
s(j) = x
y = n(i)
n(i) = n(j)
n(j) = y
End If
Next
Next
For i = 0 to c
If s(i) > 0 Then
tx.WriteLine n(i) & vbTab & s(i)
End If
Next
tx.Close
Set tx = Nothing
Set so = Nothing
MsgBox("Finished!")

Sub z
For Each f In gf.SubFolders
c = c + 1
ReDim Preserve n(c)
ReDim Preserve s(c)
n(c) = f
s(c) = f.Size
Set gf = Nothing
Set gf = so.GetFolder(f)
Call z
Next
End Sub

簡単な説明です。

Option Explicit

「厳密に」というような意味で、このオプションを設定すると、変数は、その使用の前に、必ず、「Dim」等によって、宣言しておかなければなりません。

Public c, f, gf, i, j, n(), s(), so, tx, x, y

今回はサブプロシージャと変数を共通で使いたかったので、「Dim」ではなく、「Public」を使っています。

Set so = CreateObject("Scripting.FileSystemObject")

ファイルやフォルダ、テキストファイルを扱えるようにしています。

Set gf = so.GetFolder(so.GetParentFolderName(WScript.ScriptFullName))

プログラムファイル自身が存在するフォルダを取得しています。

Set tx = so.OpenTextFile(gf & "\FolderSize.txt", 2, True)

そのフォルダ内に「FolderSize.txt」というファイルを「書き込み専用」で新規作成しています。

c = - 1

カウント用変数の初期化。

Call z

「z」サブプロシージャを呼び出しています。

For i = 0 to c - 1
For j = i + 1 to c
If s(i) < s(j) Then
x = s(i)
s(i) = s(j)
s(j) = x
y = n(i)
n(i) = n(j)
n(j) = y
End If
Next
Next

フォルダサイズの大きい順にソートしています(もちろん、そのとき、フルパスも入れ替えています)。

For i = 0 to c
If s(i) > 0 Then
tx.WriteLine n(i) & vbTab & s(i)
End If
Next

フォルダサイズが「0」より大きいものだけをテキストファイルに書き出しています。

tx.Close
Set tx = Nothing
Set so = Nothing
MsgBox("Finished!")

テキストファイルを閉じ、終了処理のあと、「Finished!」と表示しています。

Sub z

「z」サブプロシージャの始まり。

For Each f In gf.SubFolders

最初は、プログラムファイルの存在するフォルダ直下のすべてのサブフォルダを調べます。

c = c + 1
ReDim Preserve n(c)
ReDim Preserve s(c)
n(c) = f
s(c) = f.Size

配列変数を用意し、サブフォルダのフルパスを「n」に、フォルダサイズを「s」に格納しています。

Set gf = Nothing
Set gf = so.GetFolder(f)
Call z

見つかったサブフォルダをゲット(取得)し、自分自身(「z」サブプロシージャ)を呼び出しています。

こうして、すべてのサブフォルダを調べています。

Next

を、すべてのサブフォルダで繰り返しています。
補足コメント
Engineer480907

お礼率 72% (566/777)

ありがとうございます。

検証機で動作確認してみました。

ローカルディスクであるEドライブで動作はしました。
個人利用として割り当てをしているネットワークドライブであるDドライブとLドライブでも動作はしました。

ネットワークドライブとしてメンバー共有で使用するOドライブの場合、以下の結果でした。

Oドライブ直下:フォルダサイズを出力するファイルは作成されるがファイルの中身になにも書き込まれない。
Oドライブから1階層目のフォルダ:フォルダサイズを出力するファイルは作成されるがファイルの中身になにも書き込まれない。

Oドライブ1階層目に新規でフォルダを作成した場合は、フォルダサイズを出力するファイルは作成され、ファイルの中身に書き込まれる。

Oドライブにある既存で存在しているフォルダは業務で使用しており、既存で存在しているフォルダを別の場所に移動して
フォルダだけ同じように作成して、その既存フォルダにあるデータだけ移した後に検証してみることを考えましたが、
検証の準備中、ファイルが見当たらないとなって業務に影響がある可能性があったため、それはできませんでした。

恐らく、EドライブとDドライブとLドライブは実際のユーザーの環境でもうまくいくと思っています。
部署で使用しているネットワークドライブは、直下では動作せず、フォルダ数が少なければ、動作するのではと思っています。
投稿日時 - 2019-02-12 21:55:15
お礼コメント
Engineer480907

お礼率 72% (566/777)

ありがとうございます。

ご教示いただいきましたプログラムをCドライブ直下において、実行したところ、「 Set tx = so.OpenTextFile(gf & "\FolderSize.txt", 2, True)」
の箇所で下記のエラーになりました。

外付HDDを接続して、外付HDDがDドライブとして認識されたので、ご教示いただきましたプログラムをDドライブ直下において実行しましたが、
下記のエラーになりました。

デスクトップ上で実行してみたところ、「FolderSize.txt」は作成されましたが、ファイルの中身は空でした。
Cドライブ、Dドライブ内のフォルダに置いた場合は、「FolderSize.txt」が作成されて中身にフォルダサイズが記載されていました。


行:5 文字:2 エラー:書き込みできません。コード:800A0046
投稿日時 - 2019-02-10 14:12:15
この回答にこう思った!同じようなことあった!感想や体験を書こう!
この回答にはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A
ページ先頭へ