允许在MacOS上的Extendscript的File对象openDlg()方法中选择所有文件类型

时间:2014-08-25 19:11:26

标签: extendscript

我试图使用Extendscript使用File.openDlg()方法获取对File对象的引用,但是当我这样做时,它似乎只允许我选择特定的文件类型。我希望对话框允许我打开任何类型的文件。当我使用File.openDialog()时,我可以选择任何文件类型,但因为我在单击模式对话框按钮时启动操作系统特定文件选择器,它会导致打开文件选择器不断弹出 - 我不# 39;不知道为什么它会循环,但我怀疑它与" modalness"调用方法时当前启动的对话框因此,我只使用File.openDlg()方法,但我不了解如何通知MacOS允许用户选择任何文件类型。

在Adobe的文档中,.openDlg方法的签名如下:

fileObj.OpenDlg ([prompt][,filter][,multiSelect])

然后它指定[filter]参数是:

In Mac OS, a filter function that takes a File instance and returns true if the file
should be included in the display, false if it should not.

所以,因为我不想要任何文件类型掩码,所以我调用这样的方法:

newFootageSrc.openDlg("Select your file", function(file) {return true;}, false);

这不起作用,所以我找到了较旧的Adobe文档,其中指定了[filter] param:

In Mac OS, a string containing the name of a function defined in the current
JavaScript scope that takes a File object argument. The function is called
foreach file about to be displayed in the dialog, and the file is displayed
only whenthe function returns true

所以,我只是简单地创建了一个这样的命名函数

function allFileTypesOSX(file){ return true; }

然后在方法调用中引用allFileTypesOSX,如下所示:

 newFootageSrc.openDlg("Select your file", "allFileTypesOSX", false);

那不起作用,所以我想也许只是传递标识符本身而不是字符串可以解决问题:

newFootageSrc.openDlg("Select your file", allFileTypesOSX, false);

但是,唉,这不起作用。有没有人能够使用ExtendScript在MacOS对话框中成功控制文件类型?

1 个答案:

答案 0 :(得分:2)

我知道我在家里用脚本工作,所以我会仔细检查我回家后使用的语法,但我会按照这些方式做一些事情(我支持windows和mac用户)。

var fileMask;
if(isWindows()) fileMask = '*.psd';
if(isMac()) fileMask = function(file){file.name.match(/\.psd$/i) ? true:false;}
var files = File.openDialog ('prompt', fileMask, true);

它与原始尝试更相似 - 你应该传递实际的过滤功能,而不是它的名字。

ETA:如果您没有尝试实际限制可选文件 - 您是否尝试过传递null,或者完全不参数?它们都是可选的。

ETA:来自工作脚本的实际代码(适用于Photoshop,适用于CS3 +)。通过“工作”我的意思是mac上的用户能够选择他们需要的文件。我自己没有麦克风真正看到他们看到的东西。在另一个脚本中,我在isSupported函数上面发现了以下注释:'返回true或false,具体取决于file是否为png。 “过滤器”似乎无法在mac上运行,所以这是一次双重检查'。如果过滤器功能不符合文档,那么在使用该方法的openDlg版本时,这肯定是一个问题。

 var filter;
    if (isWindows()) {
        filter = ["PNG:*.png"];
    }
     else {     
        filter = isSupported;                   
    }                   

    win.btnAdd.onClick = function() {
        var f = File.openDialog("Open File", filter, false) ;
        if (f == undefined)
            return;
        if (isSupported(f)) {
            files = new Array();
            files[0]=f;

            win.lstImages.text = f.name;
            methodInvoker.EnableControls();
        } else {
            alert("'" + decodeURI(f.name) + "' is an unsupported file.");
        }
    };

isSupported = function(file) {
    try {
        //macs will send a file or a folder through here.  we need to respond true to folder to allow users to navigate through their directory structure
        if (file instanceof Folder)
            return true;
        else
            return file.name.match(/\.png$/i) != null;
    } catch (e) {
        alert("Error in isSupported method: " + e);
    }
}