開発環境:VB6 SP5
検索対象の設定ファイルの拡張子:.CNC
あるアプリケーションの設定ファイルを読み出して、その設定内容をテキストに書き出すというプログラムを作ってています。そのアプリの設定ファイルは、ユーザー自身でいくつか作成できる為、ファイル名・設定ファイルの数が一定ではありません。一応、FindFirstFileとFindNextFile関数を使って、ワイルドカードを利用することで、設定ファイルを検索し、得られた検索結果(ファイル名)を定数に当てはめて、それを元にForNEXT文で各設定ファイルの内容を読み込んでいるのですが、この場合、設定ファイルの数が予めわかっていればいいのですが、そうでない場合、うまくいきません。
何かいい方法はないでしょうか?
検索は下のような感じでやってます。
Option Explicit
'■■ API宣言 ■■
Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
'■■ 定数 ■■
Public Const INVALID_HANDLE_VALUE = -1 'エラー
Public Const MAX_PATH = 260 '文字列長さ
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20 'アーカイブ
Public Const FILE_ATTRIBUTE_READONLY = &H1 '読み取り専用
Public Const FILE_ATTRIBUTE_HIDDEN = &H2 '隠れファイル
Public Const FILE_ATTRIBUTE_SYSTEM = &H4 'システムファイル
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10 'ディレクトリ
Public Const FILE_ATTRIBUTE_NORMAL = &H80 'ノーマル
Public Const FILE_ATTRIBUTE_TEMPORARY = &H100 '一時ファイル
Public Const FILE_ATTRIBUTE_COMPRESSED = &H800 '圧縮ファイル
'■■ 構造体 ■■
Type FILETIME
dwLowDateTime As Long 'ファイル時間最低値
dwHighDateTime As Long 'ファイル時間最高値
End Type
Type WIN32_FIND_DATA
dwFileAttributes As Long 'ファイル属性(定数参照)
ftCreationTime As FILETIME '作成日
ftLastAccessTime As FILETIME 'アクセス日
ftLastWriteTime As FILETIME '更新日
nFileSizeHigh As Long 'ファイルサイズ(Byte)
nFileSizeLow As Long 'ファイルサイズ(Byte)
cFileName As String * MAX_PATH 'ファイル名
cAlternate As String * 14 'ファイル名フォーマット名
End Type
Public nodefile1 As String
Public nodefile2 As String
Public nodefile3 As String
'■■ 検索開始 ■■
Public Sub kensaku()
'******** 以下検索ロジック ********
Dim ret As Long 'API戻り値
Dim hFile As Long '検索ハンドル
Dim bNext As Long '
Dim strFile As String '検索抽出ファイル名
Dim tWFD As WIN32_FIND_DATA '構造体
Dim txt1 As String
Dim txt2 As String
Dim flg As Integer
txt1 = "C:\Program Files\Hitachi\CNICA\*.CNC"
'ファイル検索開始
hFile = FindFirstFile(txt1, tWFD)
'検索対象なし
If hFile = INVALID_HANDLE_VALUE Then
MsgBox "検索対象ありませんでした。"
Exit Sub
End If
flg = 0
'検索ループ
Do
'ファイル名取得
strFile = Left$(tWFD.cFileName, InStr(tWFD.cFileName, Chr$(0)) - 1)
If FILE_ATTRIBUTE_NORMAL Or FILE_ATTRIBUTE_ARCHIVE And GetFileAttributes("C:\Program Files\Hitachi\CNICA\" & strFile) Then
flg = flg + 1
Select Case flg
Case 1
nodefile1 = strFile
Case 2
nodefile2 = strFile
Case 3
nodefile3 = strFile
End Select
End If
'次検索
bNext = FindNextFile(hFile, tWFD)
Loop Until bNext = 0
'検索クローズ
ret = FindClose(hFile)
'*******************************
End Sub
長くてちゃんとみてないですけど、
filelistboxかなにか使ってパターン設定してやったらどうですか?
エラーがどこででているのか書いておいた方がいいと思います。
上のプログラムでは nodefile に名前を入れているだけ見たいなので、nodefile を動的配列にして Redimするとか。
ヤマ@文系さん、GODさん、お返事ありがとうございます。
長文書き込みですみませんでした。
エラーが出ている部分は、検索自体ではなくて、検索結果からファイルの内容を読み出す部分ですね。
Open "C:\Program Files\(アプリのフォルダ)" & "\" & nodefile(i) For Input As #f_num1
Do While Not EOF(f_num1)
DoEvents
Line Input #f_num1, buff1
lange = InStr(buff1, "=")
If InStr(buff1, "ServerName") <> 0 Then
If flg = 0 Then
servername = Mid(buff1, lange + 1, Len(buff1))
End If
上のような形で、検索でヒットした設定ファイルを読み込んで、各情報を読み出しています。設定ファイルの数が予め分かっていれば、fornextでその回数分だけループさせるだけですむのですが、設定しておいた定数(nodefile)と
ファイル数に差異があるとエラーになってしまうので、よい方法はないかなと探してました。
とりあえず、教えていただいたFilelistboxと動的配列をちょっと試してみます。
動的配列を試してみて、解決できました。
Select Case分の所を、
flg = flg + 1
ReDim Preserve nodefile(1 To flg)
nodefile(flg) = strFile
Fornextの指定を
For i = 1 To UBound(nodefile)
という形でうまく動作するようになりました。
アドバイスありがとうございました。
ツイート | ![]() |