アプリの設定ファイルを検索して、その内容を読み出す方法

解決


らと  2006-09-21 03:10:48  No: 133333

開発環境: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


ヤマ@文系  2006-09-21 04:47:00  No: 133334

長くてちゃんとみてないですけど、
filelistboxかなにか使ってパターン設定してやったらどうですか?
エラーがどこででているのか書いておいた方がいいと思います。


GOD  2006-09-21 06:13:28  No: 133335

上のプログラムでは nodefile に名前を入れているだけ見たいなので、nodefile を動的配列にして Redimするとか。


らと  2006-09-21 20:23:25  No: 133336

ヤマ@文系さん、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と動的配列をちょっと試してみます。


らと  2006-09-22 00:05:08  No: 133337

動的配列を試してみて、解決できました。
Select Case分の所を、

           flg = flg + 1
           ReDim Preserve nodefile(1 To flg)
           nodefile(flg) = strFile

Fornextの指定を
For i = 1 To UBound(nodefile)

という形でうまく動作するようになりました。
アドバイスありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加