2013-05-11 48 views
2

我喜欢使用cygwin的“file”命令扫描一组文件。我喜欢从我自己的程序中调用这个命令。该程序使用与Visual Basic类似的REALbasic(RB)编写(例如,使用“declare”语句接口DLL API的方法类似)。从我的应用程序调用cygwin命令,避免DOS shell

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

但是,我不知道是否有一个与cygwin安装,提供了一个直接访问其命令外壳的DLL。通过这个,我希望能够加快速度,因为我希望可以加载一次shell,然后根据需要调用文件cmd。

也许甚至有一个VB类已经这样做,然后我可以移植到RB?尽管如此,我还找不到那样的东西。

回答

1

原来,这是很容易的:

只需使用它的完整路径,如调用工具“C:\ cygwin的\斌\ file.exe程式”。

我被这么多的Google搜索建议误导了,这些建议表明我需要调用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