2

我喜欢使用 cygwin 的“文件”命令扫描一组文件。我喜欢在我自己的程序中调用这个命令。

该程序是用 REALbasic (RB) 编写的,它与 Visual Basic 类似(例如,具有类似的方式将 DLL API 与“declare”语句接口)。

RB 带有一个Shell 类,可以让我调用“DOS”命令类型的工具。我知道我可以使用它来调用 cygwin shell(例如 sh 或 bash,如此处所建议),然后我告诉它调用“文件”命令。这对我来说似乎相当低效,因为每次我想调用它的文件工具时它都会加载 bash shell。

但是,我想知道 cygwin 安装中是否有一个 dll 可以直接访问其命令 shell。通过这个,我希望加快速度,因为我希望加载它的 shell 一次,然后根据需要调用文件 cmd。

也许甚至有一个 VB 类已经这样做了,然后我可以将其移植到 RB?不过,我还找不到类似的东西。

4

1 回答 1

1

事实证明这很容易:

只需使用其完整路径调用该工具,例如“C:\cygwin\bin\file.exe”。

我被很多谷歌搜索的建议误导了,这些建议表明我需要调用 shell 才能使用我什至没有先尝试这种直接方法的文件命令。

唯一的(小)挑战是以 POSIX 格式将任何路径传递给该工具。REALbasic 只给了我 DOS 风格的路径格式(例如来自 FolderItem.AbsolutePath),而 cygwin 工具通常会用警告来抱怨这一点。我找到了解决方案:

在 cygwin 安装中禁用警告。这是通过设置环境变量选项“nodosfilewarning”来完成的。

另一种方法是提供正确的 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 回答