Actionscript 3 使用Adobe Air打开未关联的文件

Actionscript 3 使用Adobe Air打开未关联的文件,actionscript-3,apache-flex,air,Actionscript 3,Apache Flex,Air,我知道可以使用file类的openWithDefaultApplication方法使用默认应用程序打开文件。但是,当您尝试使用此方法打开未关联的文件(可能是专有或自定义扩展名)时,会引发运行时错误 是否有任何方法可以提示用户使用特定应用程序打开文件,就像Windows使用“打开方式…”对话框一样 如果没有通过NativeProcessAPI使用AIR框架 解决方案-以下面的答案为基础: var processInfo:NativeProcessStartupInfo = new NativeP

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

是否有任何方法可以提示用户使用特定应用程序打开文件,就像Windows使用“打开方式…”对话框一样

如果没有通过NativeProcessAPI使用AIR框架


解决方案-以下面的答案为基础:

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();
    }
var processInfo:NativeProcessStartupInfo=new NativeProcessStartupInfo();
processInfo.workingDirectory=file.parent;
processInfo.executable=新文件(“C:\\WINDOWS\\system32\\cmd.exe”);
变量args:Vector.=新向量();
参数推送(“/c”);
args.push(文件名);
processInfo.arguments=args;
var进程:NativeProcess=new NativeProcess();
尝试
{
process.start(processInfo);
}
捕获(e:错误)
{
//放弃-打开文件夹
file.parent.openWithDefaultApplication();
}
当您尝试启动没有关联文件类型的应用程序时,Windows上的“打开时…”对话框将显示。使用NativeProcess.start()启动应用程序,Windows将负责使用正确的程序打开应用程序,或者在没有相关文件类型的情况下显示选择屏幕

或者,根据您尝试执行的操作,您可能会对将文件类型与AIR应用程序关联感兴趣。例如,您可以将PNG文件与AIR应用程序相关联,以便默认情况下它们将在AIR应用程序中打开(例如,双击PNG文件将启动您的应用程序,调用事件指定已打开的PNG文件)。有关详细信息,请参见“声明文件类型关联”下的

当然,您的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 imageEditorProgram:File=新文件(“C:/Path/To/Program.exe”);
变量args:Vector.=新向量();
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);

}
var file:file=file.userDirectory;
addEventListener(Event.SELECT,selectHandler);
file.browse();
私有函数selectHandler(e:事件):void{
removeEventListener(Event.SELECT,selectHandler);
var filePath:String=file.nativePath;
var imageEditorProgram:File=新文件(filePath);
变量args:Vector.=新向量。();
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),然后使用NativeProcess启动该程序


对于用户友好性,你应该考虑保存用户对文件类型的偏好(所以不要强迫他们每次打开PNG时都要通过文件浏览器,只要记住他们喜欢用AWEMEMIGEIGEEDTECT.EXE打开PNG).

您回答的前一部分是我正在尝试做的-传递任何文件,而不考虑扩展名(即,无法将其列为应用程序支持的类型),并让它提示用户选择要打开文件的应用程序。使用
NativeProcessStartupInfo
将我的文件分配给startupInfo,然后将其传递到
本机进程
实例的
start()
会导致错误:
错误:错误#3219:无法启动本机进程。“%1不是有效的Win32应用程序。
该应用程序在更新描述符
extendedDesktop
@James-Huh中具有适当的权限,这很有趣。你可以在空中运行文件,对吗?我能想到的唯一一件事是,你可能键入了错误的路径,它指向了错误的位置或类似的东西?用普通的FileStream读取文件有效吗?将同一个文件实例传递到FileStream可以正常工作,只是在尝试通过本机进程时不行。“我是不是错过了一些关于这个过程的论点?”詹姆斯你的论点刚刚触动了我的大脑。我忘了