by NoWest » 2005年11月06日(日) 21:23
UNIX系のCに標準で入っているディレクトリ操作用の関数です。
Windows:VC++版と同等になるように設計したので問題は無いと思いますが
誤りがあった場合、書き込みして頂けると幸いです。
コードはこちら [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
Const DIRMAGIC = &HDDAA
Type DIR
_d_hdir As HANDLE
_d_dirname As *Char
_d_magic As DWord
_d_nfiles As DWord
_d_buf As WIN32_FIND_DATA
End Type
Function opendir(dirname As *Char) As *DIR
Dim name As *Char
Dim len As Long
Dim dir As *DIR
len = lstrlen(dirname)
name = malloc(len+5)
If name = NULL Then
Exit Function
End If
lstrcpy(name,dirname)
len=len-1
If len>0 and name[len]<>Asc(":") and name[len]<>Asc("\") and name[len]<>Asc("/") Then
lstrcat(name,"\*.*")
Else
lstrcat(name,"*.*")
End If
dir = malloc(SizeOf(DIR))
If dir = NULL Then
free(name)
Exit Function
End If
dir->_d_hdir = FindFirstFile(name,dir->_d_buf)
If dir->_d_hdir = INVALID_HANDLE_VALUE Then
free(name)
free(dir)
Exit Function
End If
dir->_d_dirname = name
dir->_d_magic = DIRMAGIC
dir->_d_nfiles = 1
opendir = dir
End Function
Sub rewinddir(dir As *DIR)
If dir = NULL Then
Exit Sub
Else
If dir->_d_magic <> DIRMAGIC Then
Exit Sub
End If
End If
FindClose(dir->_d_hdir)
dir->_d_hdir = FindFirstFile(name,dir->_d_buf)
If dir->_d_hdir = INVALID_HANDLE_VALUE Then
free(name)
free(dir)
Exit Sub
End If
dir->_d_nfiles = 1
End Sub
Function readdir(dir As *DIR) As String
If dir = NULL Then
Exit Function
Else
If dir->_d_magic <> DIRMAGIC Then
Exit Function
End If
End If
If dir->_d_nfiles = 0 Then
If FindNextFile(dir->_d_hdir,dir->_d_buf) = FALSE Then
Exit Function
End If
End If
dir->_d_nfiles = 0
readdir = MakeStr(dir->_d_buf.cFileName)
End Function
Function closedir(dir As *DIR) As Long
If dir = NULL Then
closedir = -1
Exit Function
Else
If dir->_d_magic <> DIRMAGIC Then
closedir = -1
Exit Function
End If
End If
FindClose(dir->_d_hdir)
free(dir->_d_dirname)
free(dir)
End Function
詳しい情報はこちら [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
DIRMAGIC(&HDDAA)
何の事だかさっぱり分かりませんがマジッククッキーなるものが
VCで調査した所、必ずこの値だったのでそのまま使用。
コード: 全て選択
Const DIRMAGIC = &HDDAA
DIR構造体
全ての関数がこの構造体を介してディレクトリ内を列挙します。
_d_hdir ファイル検索ハンドル。
_d_dirname 現在検索中のディレクトリ名。
_d_magic ディレクトリのマジッククッキーらしいが何なのか不明。
_d_nfiles VCだとreaddirを呼ばない状態は1、呼んだ後は0。
_d_buf 本当はChar型の配列だったけど面倒なので移植時に仕様変更。
コード: 全て選択
Type DIR
_d_hdir As HANDLE
_d_dirname As *Char
_d_magic As DWord
_d_nfiles As DWord
_d_buf As WIN32_FIND_DATA
End Type
opendir関数
引数に指定したディレクトリを開いて列挙の準備をする。
戻り値はDIR構造体へのポインタ、関数が失敗すると0が返る。
ディレクトリの列挙が必要なくなった場合、必ず
closedir関数を呼んで検索ハンドルを破棄すること。
コード: 全て選択
Function opendir(dirname As *Char) As *DIR
rewinddir関数
ディレクトリの列挙を最初からやり直す。
引数には
opendir関数の戻り値であるDIR構造体へのポインタを渡します。
この関数に戻り値はありません。
コード: 全て選択
Sub rewinddir(dir As *DIR)
readdir関数
ディレクトリ内で列挙されたファイル名及びフォルダ名を取得します。
VCではdirent構造体へのポインタが返りますが、メモリの開放なんぞが面倒なので移植時にString型に仕様変更しました。
取得したファイル及びフォルダの追加情報がほしい場合はDIR構造体の
_d_bufメンバの
WIN32_FIND_DATA構造体にアクセスしてください。
コード: 全て選択
Function readdir(dir As *DIR) As String
closedir関数
ディレクトリの列挙を終了します。
無効なDIRへのポインタを渡した場合、関数は失敗して0以外(-1)を返します。
コード: 全て選択
Function closedir(dir As *DIR) As Long
使用法はこちら [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
ディレクトリ「C:\」内を列挙する場合は次のようにします。
コード: 全て選択
#N88BASIC
/* ディレクトリを開く */
Dim dir As *DIR
dir=opendir("C:\")
/* ディレクトリの列挙をする */
Dim s As String
s=readdir(dir)
While s<>"" /* 列挙が終了すると空の文字列が返る */
Print s
s=readdir(dir)
Wend
/* ディレクトリを閉じる */
closedir(dir)
UNIX系のCに標準で入っているディレクトリ操作用の関数です。
Windows:VC++版と同等になるように設計したので問題は無いと思いますが
誤りがあった場合、書き込みして頂けると幸いです。
[hide=コードはこちら]
[code]Const DIRMAGIC = &HDDAA
Type DIR
_d_hdir As HANDLE
_d_dirname As *Char
_d_magic As DWord
_d_nfiles As DWord
_d_buf As WIN32_FIND_DATA
End Type
Function opendir(dirname As *Char) As *DIR
Dim name As *Char
Dim len As Long
Dim dir As *DIR
len = lstrlen(dirname)
name = malloc(len+5)
If name = NULL Then
Exit Function
End If
lstrcpy(name,dirname)
len=len-1
If len>0 and name[len]<>Asc(":") and name[len]<>Asc("\") and name[len]<>Asc("/") Then
lstrcat(name,"\*.*")
Else
lstrcat(name,"*.*")
End If
dir = malloc(SizeOf(DIR))
If dir = NULL Then
free(name)
Exit Function
End If
dir->_d_hdir = FindFirstFile(name,dir->_d_buf)
If dir->_d_hdir = INVALID_HANDLE_VALUE Then
free(name)
free(dir)
Exit Function
End If
dir->_d_dirname = name
dir->_d_magic = DIRMAGIC
dir->_d_nfiles = 1
opendir = dir
End Function
Sub rewinddir(dir As *DIR)
If dir = NULL Then
Exit Sub
Else
If dir->_d_magic <> DIRMAGIC Then
Exit Sub
End If
End If
FindClose(dir->_d_hdir)
dir->_d_hdir = FindFirstFile(name,dir->_d_buf)
If dir->_d_hdir = INVALID_HANDLE_VALUE Then
free(name)
free(dir)
Exit Sub
End If
dir->_d_nfiles = 1
End Sub
Function readdir(dir As *DIR) As String
If dir = NULL Then
Exit Function
Else
If dir->_d_magic <> DIRMAGIC Then
Exit Function
End If
End If
If dir->_d_nfiles = 0 Then
If FindNextFile(dir->_d_hdir,dir->_d_buf) = FALSE Then
Exit Function
End If
End If
dir->_d_nfiles = 0
readdir = MakeStr(dir->_d_buf.cFileName)
End Function
Function closedir(dir As *DIR) As Long
If dir = NULL Then
closedir = -1
Exit Function
Else
If dir->_d_magic <> DIRMAGIC Then
closedir = -1
Exit Function
End If
End If
FindClose(dir->_d_hdir)
free(dir->_d_dirname)
free(dir)
End Function[/code]
[/hide]
[hide=詳しい情報はこちら]
[b]DIRMAGIC(&HDDAA)[/b]
何の事だかさっぱり分かりませんがマジッククッキーなるものが
VCで調査した所、必ずこの値だったのでそのまま使用。
[code]Const DIRMAGIC = &HDDAA[/code]
[b]DIR構造体[/b]
全ての関数がこの構造体を介してディレクトリ内を列挙します。
[b]_d_hdir[/b] ファイル検索ハンドル。
[b]_d_dirname[/b] 現在検索中のディレクトリ名。
[b]_d_magic[/b] ディレクトリのマジッククッキーらしいが何なのか不明。
[b]_d_nfiles[/b] VCだとreaddirを呼ばない状態は1、呼んだ後は0。
[b]_d_buf[/b] 本当はChar型の配列だったけど面倒なので移植時に仕様変更。
[code]Type DIR
_d_hdir As HANDLE
_d_dirname As *Char
_d_magic As DWord
_d_nfiles As DWord
_d_buf As WIN32_FIND_DATA
End Type[/code]
[b]opendir関数[/b]
引数に指定したディレクトリを開いて列挙の準備をする。
戻り値はDIR構造体へのポインタ、関数が失敗すると0が返る。
ディレクトリの列挙が必要なくなった場合、必ず[b]closedir関数[/b]を呼んで検索ハンドルを破棄すること。
[code]Function opendir(dirname As *Char) As *DIR[/code]
[b]rewinddir関数[/b]
ディレクトリの列挙を最初からやり直す。
引数には[b]opendir関数[/b]の戻り値であるDIR構造体へのポインタを渡します。
この関数に戻り値はありません。
[code]Sub rewinddir(dir As *DIR)[/code]
[b]readdir関数[/b]
ディレクトリ内で列挙されたファイル名及びフォルダ名を取得します。
VCではdirent構造体へのポインタが返りますが、メモリの開放なんぞが面倒なので移植時にString型に仕様変更しました。
取得したファイル及びフォルダの追加情報がほしい場合はDIR構造体の[b]_d_bufメンバ[/b]の[b]WIN32_FIND_DATA構造体[/b]にアクセスしてください。
[code]Function readdir(dir As *DIR) As String[/code]
[b]closedir関数[/b]
ディレクトリの列挙を終了します。
無効なDIRへのポインタを渡した場合、関数は失敗して0以外(-1)を返します。
[code]Function closedir(dir As *DIR) As Long[/code]
[/hide]
[hide=使用法はこちら]
ディレクトリ「C:\」内を列挙する場合は次のようにします。
[code]#N88BASIC
/* ディレクトリを開く */
Dim dir As *DIR
dir=opendir("C:\")
/* ディレクトリの列挙をする */
Dim s As String
s=readdir(dir)
While s<>"" /* 列挙が終了すると空の文字列が返る */
Print s
s=readdir(dir)
Wend
/* ディレクトリを閉じる */
closedir(dir)[/code]
[/hide]