前提・実現したいこと
windows標準エクスプローラーのフォルダのソートプログラムについての質問です。
- フォルダ名のフォント文字幅を取得
- 文字幅順に連番を降る
これを実現したいです。
手軽にVBSで書いてみたのですが思うようにできず、方法が思いつきません。
失敗した結果
本来やりたかったこと
(手動で名前を変えた)求める結果
こう見た目が綺麗に並べたいです。
最初に試したアルゴリズムは、
1. フォルダ名を取得 2. フォルダ名の文字列の長さを取得 3. 長さを先頭に降る 4. 名前順にソートし、上から改めて連番を降る
という処理です。それでは半角英数字と漢字とで文字幅が違うことが分かりました。
そのため上記のアルゴリズム2と3を次のように修正しました。
1. フォルダ名を取得 2. フォルダ名をUTF-8からShiftJISに文字種変換の後、Byte数を取得する 3. Byte数を先頭に降る 4. 名前順にソートし、上から改めて連番を降る
この結果も失敗で、ここまでやって私がやりたかったのは「文字列の長さのソート」ではなく「文字列のフォント幅のソート」だと気づきました。
ということで
** エクスプローラー標準のフォントは何か。 **
** 文字列毎にそのフォント幅を取得する方法はあるのか。 **
この2点を特にお訊きしたいです。
該当のソースコード
長さを先頭に降る箇所のコード
VBS
1Function Proc(name) 2 3 num = LenByte(name)'Lennghを取ったり、ユーザー関数を試したりした 4 column_num =Right("0" & num, 2) 5 6 Proc = column_num & name 7 8End Function 9 10Function MyLen(ByVal a) 11 Dim c 12 c = 0 13 Dim i 14 For i = 0 To Len(a) - 1 15 Dim k 16 k = Mid(a, i + 1, 1) 17 If (Asc(k) And &HFF00) = 0 Then 18 c = c + 1 19 Else 20 c = c + 2 21 End If 22 Next 23 MyLen = c 24End Function 25 26Function LenByte(value) 27 Dim i, str 28 Dim bytes, code 29 LenByte = 0 30 31 If Trim(value) <> "" Then 32 For i = 1 To Len(value) 33 str = Mid(value, i, 1) 34 bytes = 1 35 code = AscW(str) 36 If (code And &HFF00) <> 0 Then 37 '半角カタカナ以外は、2バイト 38 If code < &HFF61 or code > &HFF9F Then bytes = 2 39 End If 40 LenByte = LenByte + bytes 41 Next 42 End If 43 44End Function
補足情報
サクッと作れるだろうと思ってVBSでコーディングしましたが、実現できるならどの言語でもバッチファイルでも良いです。
どんな方法があるのでしょうか、お教えください
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。