今回は「フォルダに関する命令・関数、システム変数について」紹介します。 以前にカレントフォルダを示すdir_curや、実行ファイルの場所を示すdir_exeマクロを紹介しました。 マクロでは他に、デスクトップのパスを取得するdir_desktopや、 マイドキュメントを示すdir_mydoc、Windowsフォルダを示すdir_win、 システムフォルダを示すdir_sys、コマンドライン文字列を示すdir_cmdlineが用意されています。 HSP2以前はマクロではなく、システム変数として用意されており、 取得できるものも上記のうちの一部だけでした。 HSP3からは、これらのマクロの実体が標準関数として用意されているのです。
| 取得パス = dirinfo(取得タイプ) | |||
| 取得パス | 取得タイプで指定したパス、またはコマンド文字列が返る。 | ||
| 取得タイプ |
0:カレントフォルダ(dir_curと同じ) 1:実行ファイルのあるフォルダ(dir_exeと同じ) 2:Windowsフォルダ(dir_winと同じ) 3:システムフォルダ(dir_sysと同じ) 4:コマンドライン文字列(dir_cmdlineと同じ) 0x10000(65536)以上はCSIDLとして、システムが管理するパスを取得する | ||
| 10進数 | CSIDL | ID値 | 取得パス | 備考 |
| 65536 | CSIDL_DESKTOP | 0x0000 | デスクトップ | |
| --- | CSIDL_INTERNET | 0x0001 | Internet Explorer | 取得不可 |
| 65538 | CSIDL_PROGRAMS | 0x0002 | スタートメニューのプログラム | |
| --- | CSIDL_CONTROLS | 0x0003 | コントロールパネル | 取得不可 |
| --- | CSIDL_PRINTERS | 0x0004 | プリンター | 取得不可 |
| 65541 | CSIDL_PERSONAL | 0x0005 | マイドキュメント(All Users) | |
| 65542 | CSIDL_FAVORITES | 0x0006 | お気に入り | |
| 65543 | CSIDL_STARTUP | 0x0007 | スタートメニューのスタートアップ | |
| 65544 | CSIDL_RECENT | 0x0008 | 最近使ったファイル | |
| 65545 | CSIDL_SENDTO | 0x0009 | SendTo | |
| --- | CSIDL_BITBUCKET | 0x000A | ごみ箱 | 取得不可 |
| 65547 | CSIDL_STARTMENU | 0x000B | スタートメニュー | |
| --- | CSIDL_MYDOCUMENTS | 0x000C | マイドキュメント | XP〜? |
| 65549 | CSIDL_MYMUSIC | 0x000D | マイミュージック | XP〜 |
| 65550 | CSIDL_MYVIDEO | 0x000E | マイビデオ | XP〜 |
| --- | --- | 0x000F | 参考資料が見つからない | 取得不可? |
| 65552 | CSIDL_DESKTOPDIRECTORY | 0x0010 | デスクトップ | |
| --- | CSIDL_DRIVES | 0x0011 | マイコンピュータ | 取得不可 |
| --- | CSIDL_NETWORK | 0x0012 | ネットワークコンピュータ | 取得不可 |
| 65555 | CSIDL_NETHOOD | 0x0013 | NetHood | |
| 65556 | CSIDL_FONTS | 0x0014 | フォント | |
| 65557 | CSIDL_TEMPLATES | 0x0015 | Templates | |
| 65558 | CSIDL_COMMON_STARTMENU | 0x0016 | スタートメニュー(All Users) | NT4〜? |
| 65559 | CSIDL_COMMON_PROGRAMS | 0x0017 | スタートメニューのプログラム(All Users) | NT4〜? |
| 65560 | CSIDL_COMMON_STARTUP | 0x0018 | スタートメニューのスタートアップ(All Users) | ME〜 |
| 65561 | CSIDL_COMMON_DESKTOPDIRECTORY | 0x0019 | デスクトップ(All Users) | ME〜 |
| 65562 | CSIDL_APPDATA | 0x001A | Application Data | IE4.71〜 |
| 65563 | CSIDL_PRINTHOOD | 0x001B | PrintHood | 98〜 |
| 65564 | CSIDL_LOCAL_APPDATA | 0x001C | Application Data | ME〜 (NT4は×) |
| 65565 | CSIDL_ALTSTARTUP | 0x001D | スタートアップ | Vista〜 |
| 65566 | CSIDL_COMMON_ALTSTARTUP | 0x001E | スタートアップ | Vista〜 |
| 65567 | CSIDL_COMMON_FAVORITES | 0x001F | お気に入り(All Users) | 2000〜 |
| 65568 | CSIDL_INTERNET_CACHE | 0x0020 | Temporary Internet Files | |
| 65569 | CSIDL_COOKIES | 0x0021 | Cookies | |
| 65570 | CSIDL_HISTORY | 0x0022 | 履歴 | |
| 65571 | CSIDL_COMMON_APPDATA | 0x0023 | Application Data(All Users) | ME〜 (NT4は×) |
| 65572 | CSIDL_WINDOWS | 0x0024 | Windows | ME〜 (NT4は×) |
| 65573 | CSIDL_SYSTEM | 0x0025 | System32 | ME〜 (NT4は×) |
| 65574 | CSIDL_PROGRAM_FILES | 0x0026 | Program Files | ME〜 (NT4は×) |
| 65575 | CSIDL_MYPICTURES | 0x0027 | マイピクチャー(All Users) | ME〜 (NT4は×) |
| 65576 | CSIDL_PROFILE | 0x0028 | Profiles | 2000〜 |
| 65577 | CSIDL_SYSTEMX86 | 0x0029 | System32 | ME〜 (NT4は×) |
| 65578 | CSIDL_PROGRAM_FILESX86 | 0x002A | Program Files | Vista〜 |
| 65579 | CSIDL_PROGRAM_FILES_COMMON | 0x002B | Common | ME〜 (NT4は×) |
| 65580 | CSIDL_PROGRAM_FILES_COMMONX86 | 0x002C | Common | Vista〜 |
| 65581 | CSIDL_COMMON_TEMPLATES | 0x002D | Templates(All Users) | 2000〜 |
| 65582 | CSIDL_COMMON_DOCUMENTS | 0x002E | マイドキュメント(All Users) | ME〜 (NT4は×) |
| 65583 | CSIDL_COMMON_ADMINTOOLS | 0x002F | スタートメニューのプログラムの管理ツール(All Users) | 2000〜 |
| 65584 | CSIDL_ADMINTOOLS | 0x0030 | スタートメニューのプログラムの管理ツール | XP〜 |
| --- | CSIDL_CONNECTIONS | 0x0031 | Network and Dial-up Connections | 取得不可 |
| --- | --- | 0x0032 | 参考資料が見つからない | 取得不可? |
| --- | --- | 0x0033 | 参考資料が見つからない | 取得不可? |
| --- | --- | 0x0034 | 参考資料が見つからない | 取得不可? |
| 65589 | CSIDL_COMMON_MUSIC | 0x0035 | マイミュージック(All Users) | XP〜 |
| 65590 | CSIDL_COMMON_PICTURES | 0x0036 | マイピクチャー(All Users) | XP〜 |
| 65591 | CSIDL_COMMON_VIDEO | 0x0037 | マイビデオ(All Users) | XP〜 |
| 65592 | CSIDL_RESOURCES | 0x0038 | Resources | XP〜 |
| --- | CSIDL_RESOURCES_LOCALIZED | 0x0039 | Localized Resource | 取得不可 |
| --- | CSIDL_COMMON_OEM_LINKS | 0x003A | OEM specific apps | 取得不可 |
| 65595 | CSIDL_CDBURN_AREA | 0x003B | CD Burning | XP〜 |
| --- | CSIDL_COMPUTERSNEARME | 0x003D | Workgroup membership | 取得不可 |
1 2 3 4 5 6 7 8 |
skip = 1, 3, 4, 10, 12, 15, 17, 18, 29, 30, 42, 44, 49, 50, 51, 52, 57, 58 sdim buf,3200 repeat 60 if check < length(skip) : if cnt = skip.check : check++ : continue if buf ! "" : buf += "\n" buf += strf("strf(0x%5x) ",0x10000 + cnt) + dirinfo( 0x10000 + cnt) // 特殊フォルダ一覧 loop mesbox buf, ginfo_winx, ginfo_winy |
| dirlist 受取先変数, ファイルマスク, モード | |||
| 受取先変数 | メモリノートパッド形式で取得した結果を格納する文字列型変数を指定する。 | ||
| ファイルマスク | ファイル名の一部、拡張子の限定を行う際に指定する。 | ||
| モード | 取得するファイルタイプを指定する。 0:全て 1:フォルダ以外 2:隠し属性・システム属性以外 3:隠し属性・システム属性・フォルダ以外 5:フォルダのみ 6:隠し属性・システム属性のみ 7:隠し属性・システム属性・フォルダのみ | ||
1 2 3 4 5 6 7 8 9 10 |
sdim buf, 1000 notesel buf dirlist buf, "*", 5 // フォルダを取得する mes "「" + dir_cur + "」には下記のフォルダが存在します。" mes buf mes "全てを絶対パスに置き換えると次のようになります。" repeat notemax noteget foldername, cnt mes "「" + dir_cur + "\\" + foldername + "」" loop |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
sdim buf, 512 fsize = 15 font msmincho, fsize : objmode 2 : objsize fsize * 5, fsize + 5 pos 10, 50 : mes "名称" pos 90, 50 : mes dir_cur + "\\" pos strlen(dir_cur) * (fsize + 1) / 2 + 100, 50 : input buf, 150 pos 10, 80 : mes "確認" pos 90, 80 : button "実行する", *check stop *check if buf = "" : stop color 255, 255, 255 : boxf , 100 : color dirlist getname, buf pos 10, 120 // 存在する場合、statは1、getnameはファイル名 // 存在しない場合、statは0、getnameは"" if stat { mes dir_cur + "\\" + buf + "は存在します。" } else { mes dir_cur + "\\" + buf + "は存在しません。" } pos 10, 150 : mes "ちなみにexistでのチェックは次の通り。" exist buf if strsize ! -1 { mes dir_cur + "\\" + buf + "は存在します。" } else { mes dir_cur + "\\" + buf + "は存在しません?" } |
| mkdir フォルダ名 | |||
| フォルダ名 | 作成するフォルダ名を指定する。 | ||
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
sdim folder, 128 sdim ngcode, 2, 10 ngcode = "\n", "\t", "\\", "/", ":", "*", "?", "\"", "<", ">", "|" pos 10, 10 : mes "「" + dir_cur + "」に新しくフォルダを作成します。名称を決定してください。" pos 10, 40 : input folder, 150 pos 10, 70 : button gosub "作成する", *make stop *make // 未入力チェック if folder = "" : return //ピリオドチェック chk = 1 repeat strlen(folder) if strmid(folder, cnt, 1) ! "." { chk = 0 break } loop if chk { dialog "フォルダ名にピリオドを含めることはできますが、\nピリオドのみは作成できません。", 1 return } // 禁則文字チェック foreach ngcode chk = instr(folder, , ngcode.cnt) if chk ! -1 { chk = cnt // ダイアログ表示用に指定した禁則文字を控えておく break } loop if chk ! -1 { dialog "フォルダ名に「" + ngcode.chk + "」を含めることはできません。", 1 } else { mkdir folder dialog "作成しました。" } return |
| chdir フォルダパス | |||
| フォルダパス | 変更先のカレントフォルダを指定する。 | ||
CHangeDIRectoryの略であるchdir命令を使用すると、 パラメータで指定したフォルダにカレントフォルダを移動させますが、 指定したフォルダが存在しない場合は、mkdir命令の時と同様にエラー12でアベンドします。 利用者に移動先フォルダを入力させる場合は、移動先フォルダが存在するかチェックをかけましょう。 尚、DOSコマンド等の移動コマンドとは違って、異なるドライブ間でも変更することが出来ます。 また「..」で1つ上の階層に移動することも出来ますので覚えておくと役に立つことでしょう。 下記は、フォルダ一覧を表示し、任意のフォルダに移動するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
sdim list, 3200 notesel list objsize 100, 20 current = dir_cur pos 0, 0 : input current, ginfo_winx - 100 pos ginfo_winx - 100, 0 : button gosub "移動する", *movechk objsize 100, ginfo_winy - 20 pos 0, 20 : button gosub "移動する", *move2 objsize ginfo_winx - 100, ginfo_winy - 20 pos 100, 20 : listbox index, , "" gosub *move1 stop *disp // ルートを除く存在するフォルダならば1つ上へ戻る「..」を付加 dirlist foldername, current if foldername ! "" : noteadd "..", 0 objprm 3, list return *movechk // 末端が「¥」だと、「¥」を外す if strmid(current, strlen(current) - 1, 1) = "\\" { current = strmid(current, 0, strlen(current) - 1) } dirlist list, current if list ! "" : gosub *move1 return *move1 // ルートの場合は「¥」を付ける if strlen(current) <= 2 { current += "\\" } chdir current dirlist list, "*", 5 gosub *disp return *move2 noteget foldername, index current += "\\" + foldername gosub *move1 objprm 0, dir_cur return |