2

cygwin の「file」コマンドを使用して一連のファイルをスキャンするのが好きです。私は自分のプログラム内からこのコマンドを呼び出すのが好きです。

このプログラムは、Visual Basic に似た REALbasic (RB) で書かれています (たとえば、DLL API と "declare" ステートメントをインターフェースする方法が似ています)。

RB には、「DOS」コマンド タイプのツールを起動できるシェル クラスが付属しています。それを使用して cygwin シェル (たとえば、ここで提案されているように sh または bash) を呼び出すことができることを理解しています。次に、「file」コマンドを呼び出すように指示します。ファイルツールを呼び出すたびにbashシェルをロードするため、これはかなり非効率的です。

ただし、コマンド シェルへの直接アクセスを提供する cygwin インストールに付属する dll があるかどうかは疑問です。これにより、シェルを一度ロードしてから、必要に応じてファイル cmd を呼び出すだけで済むので、速度が向上することを願っています。

たぶん、これを既に実行している VB クラスさえあり、それを RB に移植できますか? しかし、私はまだそのようなものを見つけることができませんでした.

4

1 に答える 1

1

これは非常に簡単です。

「C:\cygwin\bin\file.exe」などのフル パスを使用してツールを起動するだけです。

file コマンドを使用するにはシェルを呼び出す必要があることを示唆する非常に多くのグーグルの提案に惑わされたので、最初にこの直接的なアプローチを試すことさえしませんでした。

唯一の (小さな) 課題は、パスをツールに POSIX 形式で渡すことです。REALbasic は DOS スタイルのパス形式 (FolderItem.AbsolutePath など) のみを提供し、cygwin ツールは通常これについて警告を発します。私はこれに対する解決策を見つけました:

cygwin のインストールで警告を無効にします。これは、環境変数オプション「nodosfilewarning」を設定することで完了します。

もう 1 つの方法は、適切な POSIX パスを提供することです。cygwin1.dll はこのための関数 (''cygwin_conv_path'') を提供しますが、これを RB で動作させることができませんでした。代わりに、すべてのケースをカバーすることを願って、私は自分自身を書きました:

dim objPath as String = f.AbsolutePath
if objPath.Mid(2,2) = ":\" then
  objPath = "/cygdrive/"+objPath.Mid(1,1).Lowercase+objPath.Mid(3).ReplaceAll("\","/")
end if
于 2013-05-16T11:44:00.993 に答える