by 淡幻星 » 2006年5月19日(金) 21:11
> 指定したフォルダの中に入っているファイル名を取得するにはどのような関数を使えばいいのでしょうか教えてください。
N88BASICモードでサンプルを書きます。
流れは分かりますでしょうか?
なお、エラー処理などは一部抜け落ちてます。
ファイル名のみの抽出には_splitpath()などを使う方法もあります。
コード: 全て選択
#N88BASIC
Dim strPath As String
Dim lpFindFildData As WIN32_FIND_DATA
Dim hFind As HANDLE
Dim pMark As BytePtr
Dim strBuf As String
strPath = "フォルダのパス。" '例:「C:\ActiveBasic\Test」
'以下、フォルダ内のファイル名(フォルダは除く)をフルパスで取得。
strPath = strPath + "\*" '[*]は「あらゆるもの」の意味。ワイルドカード。
hFind = FindFirstFile( StrPtr(strPath), lpFindFildData ) '検索を開始。
If( INVALID_HANDLE_VALUE=hFind )Then
End '取得に失敗。
EndIf
Do
'ディレクトリでないときの処理。
If( lpFindFildData.dwFileAttributes<>FILE_ATTRIBUTE_DIRECTORY )Then
strBuf = lpFindFildData.cFileName '検索されたファイルのフルパスをstrBufに代入
Print strBuf '検索成功を確認。
'ファイル名のみを抽出
pMark = lstrrchr( lpFindFildData.cFileName, 92 ) '92=[\]
strBuf = pMark
Print strBuf '検索成功を確認。
EndIf
Loop While( TRUE=FindNextFile( hFind, lpFindFildData ) )'次を検索。失敗したらループを抜ける。
FindClose( hFind ) '検索の終了処理(ハンドルをクローズ)。
Sleep( 5000 )
End
もし、子フォルダの中のファイル名も取得する場合は、
上記のファイル取得の部分を関数化して、再帰処理すれば良いと思います。
なお、もし「lstrrchr」でエラーと言われたら
この宣言 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Declare Function _lstrrchr Lib "shlwapi" Alias "StrRChrIA" _
( pBufStart As BytePtr, _
pBufEnd As BytePtr, _
bSearch2 As Byte ) As BytePtr
Function lstrrchr( pBuffer1 As BytePtr, bSearch2 As Byte ) As BytePtr
lstrrchr = _lstrrchr( pBuffer1, _
pBuffer1 + lstrlen(pBuffer1), _
bSearch2 )
EndFunction
をトップ(#N88BASICの後にでも)に付け足してみて下さい。(試してないんです^^;)
(・・・lstrrchrで[\]を探す、なんてしなくても直にファイル名を返すAPIがshlwapi.dllの中にあったかも。)
追記:
また前後したか(^^;)
[quote]> 指定したフォルダの中に入っているファイル名を取得するにはどのような関数を使えばいいのでしょうか教えてください。[/quote]
N88BASICモードでサンプルを書きます。
流れは分かりますでしょうか?
なお、エラー処理などは一部抜け落ちてます。
ファイル名のみの抽出には_splitpath()などを使う方法もあります。
[code]#N88BASIC
Dim strPath As String
Dim lpFindFildData As WIN32_FIND_DATA
Dim hFind As HANDLE
Dim pMark As BytePtr
Dim strBuf As String
strPath = "フォルダのパス。" '例:「C:\ActiveBasic\Test」
'以下、フォルダ内のファイル名(フォルダは除く)をフルパスで取得。
strPath = strPath + "\*" '[*]は「あらゆるもの」の意味。ワイルドカード。
hFind = FindFirstFile( StrPtr(strPath), lpFindFildData ) '検索を開始。
If( INVALID_HANDLE_VALUE=hFind )Then
End '取得に失敗。
EndIf
Do
'ディレクトリでないときの処理。
If( lpFindFildData.dwFileAttributes<>FILE_ATTRIBUTE_DIRECTORY )Then
strBuf = lpFindFildData.cFileName '検索されたファイルのフルパスをstrBufに代入
Print strBuf '検索成功を確認。
'ファイル名のみを抽出
pMark = lstrrchr( lpFindFildData.cFileName, 92 ) '92=[\]
strBuf = pMark
Print strBuf '検索成功を確認。
EndIf
Loop While( TRUE=FindNextFile( hFind, lpFindFildData ) )'次を検索。失敗したらループを抜ける。
FindClose( hFind ) '検索の終了処理(ハンドルをクローズ)。
Sleep( 5000 )
End[/code]
もし、子フォルダの中のファイル名も取得する場合は、
上記のファイル取得の部分を関数化して、再帰処理すれば良いと思います。
なお、もし「lstrrchr」でエラーと言われたら
[hide=この宣言][code]Declare Function _lstrrchr Lib "shlwapi" Alias "StrRChrIA" _
( pBufStart As BytePtr, _
pBufEnd As BytePtr, _
bSearch2 As Byte ) As BytePtr
Function lstrrchr( pBuffer1 As BytePtr, bSearch2 As Byte ) As BytePtr
lstrrchr = _lstrrchr( pBuffer1, _
pBuffer1 + lstrlen(pBuffer1), _
bSearch2 )
EndFunction[/code][/hide]をトップ(#N88BASICの後にでも)に付け足してみて下さい。(試してないんです^^;)
[color=#777777](・・・lstrrchrで[\]を探す、なんてしなくても直にファイル名を返すAPIがshlwapi.dllの中にあったかも。)[/color]
追記:
また前後したか(^^;)