2

以前のインストールから新しいパス名を持つ新しいインストールにすべてのデータベースファイルをコピーしようとしています。問題は、インストーラーがデータベースファイルの名前を認識しないため、ワイルドカード文字を使用しようとしていることです。

TFileStream.Create()を使用しようとしましたが、これは「* .mdb」などの単一のファイルを検索していて、そのファイルが見つからないというエラーが表示され続けました。FileCopy()も使ってみましたが、失敗して先に進んでいるようです。コマンドラインから実行しようとしExec()ましたが、インストールがフリーズするだけでした。

私は長い間オンラインで答えを探し、多くのドキュメントを読みました。ワイルドカード文字を使用して不明な名前のファイルをコピーする方法を知る必要があります。以下は私が試したことの例です。

TFileStream.Create()

    OldDBs := 'C:\Users\seang\Desktop\Old\*.mdb';
    NewDBs := 'C:\Users\seang\Desktop\New\*.mdb';
    SourceDB:= TFileStream.Create(OldDBs, fmOpenRead);
    DestDB:= TFileStream.Create(NewDBs, fmCreate);
    DestDB.CopyFrom(SourceDB, SourceDB.Size);
    SourceDB.Free;
    DestDB.Free;

FileCopy()

    FileCopy('C:\Users\seang\Desktop\Old\*.mdb', 'C:\Users\seang\Desktop\New\*.mdb', True);

コマンドライン

    Exec('cmd.exe', 'COPY "C:\Users\seang\Desktop\Old\*.mdb" "C:\Users\seang\Desktop\New\*.mdb"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
4

2 に答える 2

5

FindFirst、、を使用してFindNextFindCloseフォルダーを反復処理する必要があります。各データベース名を取得し、それを個別にコピーします。Pascal(Delphi)でそれを行う例は、ここにあります。Support Functions ReferenceInnoSetupヘルプファイルの次のセクションでそれらを使用する例もありますFile System Functions

// This example counts all of the files (not folders) in the System directory.
var
  FilesFound: Integer;
  FindRec: TFindRec;
begin
  FilesFound := 0;
  if FindFirst(ExpandConstant('{sys}\*'), FindRec) then begin
    try
      repeat
        // Don't count directories
        if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
          FilesFound := FilesFound + 1;
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end;
  MsgBox(IntToStr(FilesFound) + ' files found in the System directory.',
    mbInformation, MB_OK);
end;

上記のループを変更して、*.mdbFindFirst呼び出し内の)それぞれの適切な古いフォルダーを検索し、新しいフォルダーに見つかった各ファイルをコピーするブロックにカウントされる行を変更できます(FileCopyまたはのいずれかを使用しますTFileStream)。

于 2012-12-03T18:01:44.977 に答える
2

コマンドラインの試行は、少し変更すれば機能します。

Exec('cmd.exe', '/c COPY "C:\Users\seang\Desktop\Old\*.mdb" "C:\Users\seang\Desktop\New"', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
于 2013-08-06T06:48:46.813 に答える