我知道可以使用文件类的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();
}
答案 0 :(得分: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启动可执行文件 - NOT文件,因此上述方法不起作用。
尝试使用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)。