1

我知道可以使用openWithDefaultApplication文件类的方法使用默认应用程序打开文件。但是,当您尝试使用此方法打开未关联的文件(可能是专有或自定义扩展名)时,会引发运行时错误。

是否有提示用户使用特定应用程序打开文件,例如 Windows 使用“打开方式...”对话框?

如果不使用 AIR 框架,通过 NativeProcessAPI?


解决方案- 使用下面的 Pixel Elephants 答案作为基础:

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();
    }
4

1 回答 1

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 应用程序可能无法处理打开您尝试打开的任何文件,并且您需要其他程序来处理它,在这种情况下,您可以使用第一种方法,让操作系统负责启动具有正确程序的应用程序。

编辑 :

我对 Native Process 的实际作用感到困惑。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);

}

我没有测试上面的代码,但它应该打开一个文件浏览对话框,允许用户选择一个程序来打开文件(也许你应该添加一个 FileFilter 来限制用户只选择.exe),然后启动该程序使用 NativeProcess。

为了用户友好,您应该考虑保存用户对文件类型的首选项(因此,不要强迫他们每次想要打开 PNG 时都通过文件浏览器,只要记住他们喜欢用 AwesomeImageEditor.exe 打开 PNG)。

于 2012-08-08T14:06:23.727 回答