2012-08-08 3 views
1

파일 클래스의 openWithDefaultApplication 메서드를 사용하여 기본 응용 프로그램으로 파일을 열 수 있다는 것을 알고 있습니다. 그러나이 메서드를 사용하여 연관되지 않은 파일 (아마도 독점적 또는 사용자 지정 확장명)을 열려고하면 런타임 오류가 발생합니다.Adobe Air에서 관련없는 파일 열기

"Open with ..."대화 상자에서 Windows와 같은 특정 응용 프로그램으로 파일을 열 것인지 묻는 메시지가 있습니까?

프레임 워크를 사용하지 않는 경우 NativeProcessAPI?


해결 - 기초로 아래 픽셀 코끼리 대답을 사용하여 :

var processInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();      
    processInfo.workingDirectory = file.parent;    
    processInfo.executable = new File("C:\\WINDOWS\\system32\\cmd.exe"); 

    var args:Vector.<String> = new Vector.<String>();  
    args.push("/c"); 
    args.push(file.name); 

    processInfo.arguments = args; 

    var process:NativeProcess = new NativeProcess(); 

    try 
    { 
     process.start(processInfo); 
    } 
    catch(e:Error) 
    { 
     //give up - open the folder 
     file.parent.openWithDefaultApplication(); 
    } 

답변

0

"열기와 함께 ..."당신이하지 않는 응용 프로그램을 시작하려고 할 때마다 Windows에서 대화 상자가 표시됩니다 연관 파일 유형이 있습니다. NativeProcess.start()를 사용하여 응용 프로그램을 시작하면 Windows에서 올바른 프로그램으로 파일을 열거 나 연결된 파일 유형이없는 경우 선택 화면을 표시합니다.

또는 수행하려는 작업에 따라 파일 유형을 AIR 응용 프로그램과 연관시킬 수 있습니다. 예를 들어 PNG 파일을 AIR 응용 프로그램과 연결하여 AIR 응용 프로그램에서 기본적으로 열리도록 할 수 있습니다 (예 : PNG 파일을 두 번 클릭하면 열린 PNG 파일을 지정하는 INVOKE 이벤트로 앱이 시작됨). 자세한 정보는 "파일 유형 연관 선언"에서 http://livedocs.adobe.com/flex/3/html/help.html?content=File_formats_1.html을 참조하십시오.

물론 AIR 응용 프로그램에는 열려고하는 파일을 열고 다른 프로그램에서 처리하도록하려는 기능이 없을 수 있습니다.이 경우 운영 체제에서 사용할 수있는 첫 번째 방법을 사용할 수 있습니다 올바른 프로그램으로 애플리케이션을 시작하십시오.

편집 :

가 나는 실제로 수행하는 원주민 어떤 프로세스로 혼동되었다. NativeProcess는 파일이 아닌 실행 파일을 시작하므로 위의 메서드는 작동하지 않습니다.

NativeProcess로 파일을 직접 열지 않고 파일을 열려고하는 프로그램을 열어 파일을 인수로 전달하십시오. 당신이 특별한 이미지 프로그램으로 PNG 파일을 열려면 예를 들어, 당신은 같은 것을 할 것입니다 :

var imageEditorProgram:File = new File("C:/Path/To/Program.exe"); 

var args:Vector.<String> = new Vector.<String>(); 
args.push("C:/Path/To/Image.png"); 

var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); 
nativeProcessStartupInfo.executable = imageEditorProgram; 
nativeProcessStartupInfo.arguments = args; 

var nativeProcess:NativeProcess = new NativeProcess(); 
nativeProcess.start(nativeProcessStartupInfo); 

이 전달 된 이미지 파일과 이미지 편집 프로그램을 열어야합니다

을하지만. ,이 방법의 단점은 운영 체제가 파일을 열 프로그램을 결정하도록 허용 할 수 없다는 것입니다. 파일 찾아보기 대화 상자를 열고 사용자가 파일을 열 수있는 프로그램을 선택할 수 있어야합니다 (운영 체제와 유사). 당신은 아마도 (

var file:File = File.userDirectory; 
file.addEventListener(Event.SELECT, selectHandler); 
file.browse(); 

private function selectHandler(e:Event):void{ 
    file.removeEventListener(Event.SELECT, selectHandler); 
    var filePath:String= file.nativePath; 
    var imageEditorProgram:File = new File(filePath); 

    var args:Vector.<String> = new Vector.<String>(); 
    args.push("C:/Path/To/Image.png"); 

    var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); 
    nativeProcessStartupInfo.executable = imageEditorProgram; 
    nativeProcessStartupInfo.arguments = args; 

    var nativeProcess:NativeProcess = new NativeProcess(); 
    nativeProcess.start(nativeProcessStartupInfo); 

} 

내가 위의 코드를 테스트하지 않은,하지만 사용하여 파일을 열 프로그램을 선택하도록 허용하는 파일 찾아보기 대화 상자를 열어야합니다 : 그래서, 잘하면 다음은 당신이 원하는 것을 할 것 사용자에게 .exe 만 선택하도록 제한하는 FileFilter를 추가 한 다음 NativeProcess를 사용하여 해당 프로그램을 시작해야합니다.

사용자 편의를 위해 파일 형식에 대한 사용자 기본 설정 저장을 고려해야합니다 (PNG를 열 때마다 파일 브라우저를 통과하도록 강요하는 대신 AwesomeImageEditor.exe로 PNG를 열 것을 기억하십시오) .

+0

답변의 이전 부분은 확장을 막론하고 모든 파일을 전달합니다 (예 : 응용 프로그램에서 지원되는 유형으로 나열하는 것이 불가능 함). 사용자에게 응용 프로그램을 선택하게하십시오. 파일을 열려면. 'NativeProcessStartupInfo' 파일을 startupInfo에 할당하고'Native Process' 인스턴스의'start()'에 전달하면 에러가 발생합니다 :'Error : Error # 3219 : NativeProcess를 시작할 수 없습니다. '% 1은 (는) 유효한 Win32 응용 프로그램이 아닙니다.'응용 프로그램은 업데이트 설명자 'extendedDesktop'에서 적절한 권한을 가지고 있습니다. – James

+0

@James Huh, interesting. AIR 외부에서 파일을 실행할 수 있습니까? 내가 생각할 수있는 유일한 것은 경로를 잘못 입력했거나 잘못된 위치를 가리키고 있다는 것입니다. 일반 FileStream으로 파일을 읽는 것이 효과가 있습니까? –

+0

동일한 파일 인스턴스를 fileStream에 전달하면 네이티브 프로세스를 통해 시도 할 때와는 달리 잘 작동합니다. 아마 그 과정에 대한 몇 가지 주장을 놓쳤을까요? – James

관련 문제