2007年11月29日木曜日

拡張子ごとの合計ファイルサイズを求める

任意のフォルダ内にあるファイルのサイズを取得し、拡張子ごとに分類・合計して出力します。
最もサイズの大きいファイルが調べられて、少し楽しいかも知れません。私の場合は素材として保存してあるBMPファイルが最大でした。HSPスクリプトは60MB、ちょっと少ないかも知れません。

// 参考
// ・日経ソフトウェア 2008年1月号
// ・HSP開発wiki COMDictionary
//      http://hspwiki.tm.land.to/?COMDictionary
// ・HSP-NEXT HSPサンプル蔵(COMオブジェクト編)
//      http://hspnext.com/hspkura/hspkura11.htm

#include "hspext.as"
    // Dictionaryの準備
    newcom dc, "Scripting.Dictionary"
    comres comret
    dc("compareMode") = 1   // 大文字・小文字を同一視

    sdim exts, 810        // 拡張子名を代入する配列変数
    ext_num = 0             // 拡張子の種類数

    // 処理開始
    gosub *select_folder    // 検索対象フォルダの指定
    gosub *get_data         // ファイルを検索しデータを作成
    gosub *make_graph       // Excelによるグラフの作成

    // Dicitonaryの破棄
    delcom dc
    end

*select_folder
    target_folder = ""
    selfolder target_folder, ""
    if stat == 1 {
        dialog "フォルダの選択がキャンセルされました。"
        end
    }
    return

*get_data
    mes "データを取得しています..."
    notesel file_list
    sdim file_list, 1024
    sdim folder_names, 25610
    sdim file_name, 256
    sdim folder_name, 256
    folder_names(0) = target_folder
    folder_num = 0

    // 選択したフォルダの中にあるファイルをすべて検索
    // 再帰を利用しない方法
    repeat
        chdir folder_names(folder_num)
        // ファイル一覧を取得
        dirlist file_list, "*"1
        repeat stat
            noteget file_name, cnt
            exist file_name
            if strsize > 0 {
                file_size = strsize
                ext = getpath(file_name, 2// 拡張子を取り出す
                dc -> "Exists" ext

                if comret {
                    // すでにデータが存在している場合
                    file_size += dc("Item", ext)
                    dc -> "Remove" ext      // Itemプロパティに対する上書きがうまくいかないので、いったん消去
                } else {
                    // まだデータが存在していない場合
                    exts(ext_num) = ext
                    ext_num++
                }
                dc -> "Add" ext, file_size
            }
        loop

        // フォルダー一覧を取得
        dirlist file_list, "*"5
        folder_num--
        repeat stat
            // カレントフォルダにあるフォルダの名前を
            // ひとつずつfolder_namesへ代入
            folder_num++
            noteget folder_name, cnt
            folder_names(folder_num) = dir_cur + "\\" + folder_name
        loop
        if folder_num < 0 : break
        await 1
    loop
    mes "データ取得が終了しました。"
    return

*make_graph
    mes "グラフを作成しています..."
    newcom xlApp, "Excel.Application"
    xlApp("Visible") = 1            // ウィンドウを表示
    xlApp("DisplayAlerts") = 0      // 警告メッセージを表示させない
    xlBooks = xlApp("Workbooks")    // Workbooks コレクション取得
    xlBook = xlBooks("Add")         // ワークブックを追加
    xlSheet = xlBook("Worksheets""sheet1")    // シート取得

    // データの書き込み(拡張子ごとのデータ)
    repeat ext_num
        xlRange = xlSheet("Range""A" + (cnt + 1))         // 代入先セルの指定
        xlRange("Value") = exts(cnt)                        // 値の代入
        xlRange = xlSheet("Range""B" + (cnt + 1))         // 代入先セルの指定
        xlRange("Value") = dc("Item", exts(cnt))            // 値の代入
    loop
    // データの書き込み(合計値の算出)
    xlRange = xlSheet("Range""A" + (ext_num + 1))     // 代入先セルの指定
    xlRange("Value") = "合計"                           // 値の代入
    xlRange = xlSheet("Range""B" + (ext_num + 1))     // 代入先セルの指定
    xlRange("Value") = "=SUM(A1:B" + ext_num + ")"      // 値の代入

    // グラフの作成
    xlCharts = xlApp("Charts")
    xlChart = xlCharts("Add")
    xlChart("ChartType") = 5                        // 円グラフ
    xlRange = xlSheet("Range""A1:B" + ext_num)    // データの範囲
    xlChart -> "SetSourceData" xlRange, 2           // グラフの元データを指定
    xlChart -> "Location" 2"sheet1"               // グラフの位置(既存のシートに貼り付け)

    // COMオブジェクト型変数の破棄
    delcom xlRange  : delcom xlChart
    delcom xlCharts : delcom xlSheet
    delcom xlBook   : delcom xlBooks
    delcom xlApp

    mes "グラフを作成しました。"
    return

0 件のコメント: