2013-05-11 3 views
2

cygwin의 "file"명령을 사용하여 파일 세트를 스캔하는 것을 좋아합니다. 내 프로그램 내에서이 명령을 호출하고 싶다.내 응용 프로그램에서 cygwin 명령을 호출하여 DOS 셸을 피하십시오.

이 프로그램은 Visual Basic과 비슷한 REALbasic (RB)로 작성되었습니다 (예 : "declare"문과 DLL API를 인터페이스하는 유사한 방법이 있음).

RB에는 "DOS"명령 유형의 도구를 호출 할 수있는 Shell 클래스가 있습니다. Cygwin 쉘 (예 : sh 또는 bash, 제안 된 here)을 호출하는 데이 파일을 사용할 수 있다는 것을 이해하고 나서 "파일"명령을 호출하도록 알려줍니다. 이것은 필자가 파일 도구를 호출 할 때마다 bash 쉘을로드하기 때문에 나에게는 비효율적 인 것처럼 보입니다.

그러나 명령 셸에 직접 액세스 할 수있는 cygwin 설치와 함께 제공되는 DLL이 있는지 궁금합니다. 이것으로 필자는 껍데기를 한 번로드 한 다음 필요에 따라 cmd 파일을 호출하기 때문에 작업 속도가 향상되기를 바랍니다.

어쩌면 VB에서 이미이 작업을 수행하고 있는데, 그 작업을 RB로 포트 할 수 있습니까? 나는 그런 것을 아직 발견 할 수 없었다.

답변

1

매우 간단합니다.

공구를 전체 경로 (예 :)로 불러 오기만하면됩니다. "C : \ cygwin \ bin \ file.exe".

나는이 직접 접근법을 먼저 시도하지 않은 파일 명령을 사용하기 위해 쉘을 호출해야한다는 제안을 많이 받아 들였습니다.

유일한 어려움은 도구에 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