hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
Module/修正版dirlist2 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

修正版dirlist2モジュール

hspextによるdirlist2と置き換えて使用する、 [hsp3]用のモジュールです。
ver3.1b7現在では

  • ファイルマスクにワイルドカード(*.*)以外を指定すると正しく動作しない
  • dirlist2の取得モードが正しく反映されない

不具合が判明しています。
このモジュールを使用すればその不具合を回避することができます。

上記の不具合はHSP3.1β10にて修正されました
このページは標準命令による実装方法および再帰のサンプルとして残しておきます。

モジュール

hspextと共用する場合は、必ずhspext.asを先にインクルードしてください。
タイムスタンプの取得はhspextとの共用時のみ利用できます。

filedirlist2.hsp
Everything is expanded.Everything is shortened.
  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
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
-
|
!
-
|
-
|
!
 
 
 
 
-
|
|
|
|
|
|
|
|
!
 
 
 
 
 
 
 
 
-
|
!
-
|
!
-
|
|
!
 
-
|
|
!
-
|
|
!
 
-
|
!
 
-
|
!
 
-
|
|
|
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
-
|
!
 
 
 
 
-
|
!
 
 
 
 
 
 
 
 
 
//  dirlist2代替モジュール "dirlist2.hsp"  for HSP3.1b10 2007/07/10
#ifdef dirlist2
#define global DL2FULL
#undef dirlist2h
#undef dirlist2
#undef dirlist2r
#endif
 
#module
#define global dirlist2h(%1=0, %2=0) _dirlist2h %1, %2
#define global dirlist2(%1, %2, %3=0, %4=0) _dirlist2 %1, %2, %3, %4
#define global dirlist2r(%1) _dirlist2r %1
 
#deffunc _dirlist2h int p1, int p2
    if p1 {
        PathMode = p1
    } else {
        PathMode = %10011111
    }
    if p2 {                         // 項目の区切り文字を設定(省略時は半角カンマ)
        Separation = strf("%c", p2)
    } else {
        Separation = ","
    }
    return 0
 
// 再帰検索命令(外部からは使用しません)
#deffunc _serchdir str Target, local List
    if SerchSubDir {                // ディレクトリを検索
        chdir Target
        notesel List
        dirlist List, "*", 5
        repeat notemax
            notesel List
            noteget stmp, cnt
            _serchdir Target+"\\"+stmp;"
        loop
    }
 
    chdir Target
    dirlist List, FileMask, GetMode
    notesel List
    Files += notemax
    repeat notemax
        noteget stmp, cnt
        NewLine = ""
        if PathMode & %1 {          // ファイルのパス+ファイル名
            NewLine += Target + "\\" + stmp + Separation;"
        }
        if PathMode & %10 {         // ファイル名
            NewLine += stmp + Separation
        }
        if PathMode & %100 {        // ファイルのサイズ(byte)
            exist stmp
            NewLine += str(strsize) + Separation
        }
#ifdef DL2FULL
        if PathMode & %1000 {       // 更新日(年月日)
            fxtget@ TimeStamp, stmp
            NewLine += str(TimeStamp(8)) + "/" + str(TimeStamp(9))+ "/" + str(TimeStamp(11)) + Separation
        }
        if PathMode & %10000 {      // 更新日(時分秒)
            if (PathMode & %1000) == 0 : fxtget@ TimeStamp, stmp
            NewLine += str(TimeStamp(12)) + ":" + str(TimeStamp(13))+ ":" + str(TimeStamp(14)) + Separation
        }
#endif
        if PathMode & %10000000 {   // ファイルのパス
            NewLine += Target + Separation
        }
 
        if PathMode {               // 最後の区切り文字を削除
            poke NewLine, strlen(NewLine) - strlen(Separation), 0
        }
 
        if DirSeparation != '\\' {  // フォルダ区切り文字を変更
            i = 0
            repeat
                tmp = instr(NewLine, i, "\\");"
                if tmp < 0 : break
                poke NewLine, tmp + i, DirSeparation
                i += tmp + 1
            loop
        }
        Note += NewLine + "\n"
    loop
    return
 
#deffunc _dirlist2 var p1, str s, int p2, int p3
#ifdef DL2FULL
    dim TimeStamp, 24               // タイムスタンプ取得用
#endif
    Note = ""                       // リスト格納用文字列変数
    StartDir = dir_cur              // 命令実行時のカレントフォルダ
 
    FileMask = s                    // ファイルマスク
    Files = 0                       // ファイルの数(statに代入)
 
    SerchSubDir = p2 & %1           // サブフォルダを検索するか否か
    GetMode =  3 - (p2 & %10)       // 隠しファイル・システムファイルを含めるか否か
 
    if p3 {                         // ディレクトリの区切り文字を設定(省略時は\)
        DirSeparation = p3
    } else {
        DirSeparation = '\\'
    }
 
    _serchdir StartDir              // カレントディレクトリを検索
    notesel Note
    p1 = strlen(Note)
    if Note != "" {                 // 最後の改行を削除
        poke Note, p1 - 2, 0
    }
 
    chdir StartDir
    return Files
 
#deffunc _dirlist2r var v
    v = Note
    sdim Note, 4
    return 0
#global

サンプル

マイドキュメント以下に保存されているテキストファイルを調べます。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 
 
 
 
 
 
 
 
 
 
#include "hspext.as"
#addition "dirlist2.hsp"
 
    chdir dir_mydoc
    dirlist2h %00001101
    dirlist2 size, "*.txt", 3
    title str(stat) + "個のファイルを検索しました"
    sdim s, size + 1
    dirlist2r s
    mesbox s, ginfo_winx, ginfo_winy

コメント

  • hspext.asと一緒にincludeするとエラーになってしまいますが、私では回避方法がわかりませんでした。わかる方は、よろしければ追記・補足をお願いします。(;-; -- eller 2006-12-31 (日) 14:33:29
  • 全て検索しきれない不具合を修正しました。 -- eller 2006-12-31 (日) 20:38:11
  • #funcってglobal指定がなくてもグローバル扱いになるのはやっぱり不具合ですかね?ヘルプには「globalを指定することで...(略)」と書かれていますし...。モジュール内で先に#funcで定義されるとモジュール空間に留まりますが、hspextで定義されるほかの命令を使わないのなら、モジュール内でincludeするのをやめて「hspext.asを先にincludeすること」にして、モジュール内ではundef・再定義だけにしてもいいと思います。 -- kz3 2006-12-31 (日) 20:54:42
  • kz3さん、ありがとうございます。モジュール内でのincludeはfxtget命令を使うために必要なので、今はこのままにしておきたいと思います。#funcの動作については良く分からないのが正直な所ですので、少し調べてみます…。 -- eller 2006-12-31 (日) 22:33:54
  • 依存モジュールにしてしまえばいいということです。hsp2.61でも「llmod.asをインクルードすること」というllmod.asに依存したモジュールがあるように...。HSP3でも標準であるmod_menu.asなんかもモジュール内部でWin32APIをglobalで定義しちゃっているのでuser32.asとかがインクルードできないんですが、あれも本当ならWinAPI32Win32 APIを使っている時点でuser32.as依存モジュールとかにするべき...なんてちょっと愚痴ってしまいました^^;まったく同名なのは現状では回避できないので、HSPTV掲示板でhspinetとpcbnetの共存スレッドで提案したように、globalを定義しないでモジュール名を明示するという方法もあります。 -- kz3 2006-12-31 (日) 23:14:43
  • 明けましておめでとうございますm(_ _)m
    依存モジュールは今までモジュール内から拡張命令(fxtget)を使う方法がわからず実装できなかったのですが、命令名の後に@を書けば良いということが分かったので、今回実装してみました。これで問題はすべて解決できたと思います。助言ありがとうございました。 -- eller 2007-01-01 (月) 07:53:34
  • 単純に命令が定義されているかどうかを調べるなら #ifdef/#ifndef でできると思います。ただ、同名でありながら違う定義の場合、正常に動作しなくなるのが怖いですが。 -- Irisawa 2007-01-01 (月) 08:21:07
+  サンプル
  • Irisawaさんはじめまして。ご指摘は「#ifdefでfxtgetが定義されているかいないかを調べることで、機能削減版も同じプログラム(ソース)で表せる」ということでよろしいでしょうか?それは確かに盲点でした……。少し目的(hspextの代替)とそれた形になりますが、近いうちにやってみたいと思います。ありがとうございましたm(_ _)m -- eller 2007-01-01 (月) 09:02:23
  • dirlist2命令実行時にファイル数がstatに反映されないバグを修正しました。DLL不要版と通常版を一体化させました。 -- eller 2007-02-11 (日) 20:49:21
  • ディレクトリ区切り記号が正しく反映されない不具合を修正。 -- eller 2007-03-06 (火) 06:40:00
  • hsp3.1b10で実行してみましたが、モジュール内の'\'を'\\'に変更しないとエラーが出ます。 -- 2007-06-09 (土) 23:02:41
    • 確かにそのようですね。'\'ではアポストロフィの文字コードが返ってしまうようです。特に仕様が変更になったとは聞いていないのですが…。とりあえず3.1β10以降では使わないように書いておきます。 -- eller 2007-06-10 (日) 05:25:54
    • BTにておにたまさんから「3.0以降の仕様である」との回答をいただきました。β7以前でも動作していたように思ったのですが、記憶違いだったのか見落としだったのか……謎です。3.1β10にて正常に動作するスクリプトに置き換えました。 -- eller 2007-07-10 (火) 06:00:00
  • 今思うとメモリノートパッド命令や+=代入命令を使っているのでファイル数が非常に多くなると動作が極端に遅くなるはずです。やはり今後は標準のdirlist2の使用をお勧めします。 -- eller 2007-06-10 (日) 05:53:30

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル:
filedirlist2.hsp
486件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-07-10 (火) 06:03:26 (2343d)