我试图使用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对话框中成功控制文件类型?
答案 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);
}
}