从我的应用程序调用cygwin命令,避免使用DOS shell



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

该程序是用REALbasic (RB)编写的,它类似于Visual Basic(例如,有类似的方法将DLL api与"declare"语句连接起来)。

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

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

也许甚至有一个VB类已经做到了这一点,然后我可以移植到RB?但是我还没有找到这样的东西

事实证明这很简单:

只需调用带有完整路径的工具,例如:"C: cygwin bin file.exe"。

我被很多谷歌上的建议误导了,这些建议建议我需要调用shell才能使用file命令,所以我甚至没有先尝试这种直接的方法。

唯一的(小)挑战是以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

相关内容

  • 没有找到相关文章

最新更新