在 Extendscript 中使用文件类型数组

Using File Type Array in Extendscript

我正在尝试集成一个包含可在我的 Extendscript 中使用的图像文件类型列表的数组,这就是我所拥有的:

DFgroup.DFBtn.onClick = function(){    
     DFdefault = new Folder(DARKinputFolder); //stores the current folder in case of cancel.    
     DFdefault = Folder.selectDialog('****Please Select The Folder Where Your DARK FRAMES Are Located****',DARKinputFolder);
     if ( DFdefault != null ) {
                    DARKinputFolder = DFdefault.fsName.toString()
                       DFgroup.DFlabel.text = DARKinputFolder;

if(DFdefault){DARKinputFolder = DFdefault}; //if cancel is hit, this statement becomes false, and myFolder remains untouched.    
    //if it's true, then the selected folder from the holdFolder is transferred to myfolder.   

var FILE_TYPE, FTlen i;
FILE_TYPE = [".orf", ".tif", ".tiff", ".jpg", ".jpeg"];
FTlen = FILE_TYPE.length;
for (i = 0; i < FTlen; i++){
var SEARCH_MASK = "*" + FILE_TYPE[i];}
var DARKfileList = DARKinputFolder.getFiles(SEARCH_MASK) ;

//if (DARKfileList.length <= 0)
//{
//var FILE_TYPE = ".jpg"; // The type of files that this script works on -- you can change
//var SEARCH_MASK = "*" + FILE_TYPE; // Image file filter to find only those files
//var DARKfileList = DARKinputFolder.getFiles(SEARCH_MASK);
//}


 if (DARKfileList.length == 0)
{
    alert('The DARK FRAME folder you have chosen is either empty or does not contain image files of the correct type.\r\rPlease locate & select the correct image folder.','DARK FRAME folder error');
    DFgroup.DFlabel.text = 'No DARK FRAMES folder has been selected...';
    DFdefault = '';
    DFgroup.DFlabelQ.text = '';
    }
else{                      
                       DFgroup.DFlabelQ.text = '[' + DARKfileList.length + ']';
                       var DFCurrFolder = (new File(DARKinputFolder)).fsName;
                       DFgroup.DFlabel.helpTip = 'Location of files to process:\r' + DFCurrFolder;
                       FolderChecker()
     }}
     } //opens the folder browse UI using you main folder.

当用户点击 'DFBtn' 时,会出现一个打开的文件夹对话框,他们可以选择一个包含图像的文件夹。

此文件夹路径及其中包含的图像数量将被检索并作为文本标签输出到对话框中。

问题是,通过测试和选择一个确实包含图像且该图像属于允许类型的文件夹,脚本会直接转到 'Alert' 消息,指出 "folder you have chosen is either empty....." 等..

现在,如果我将一小部分代码更改为:

if (DARKfileList.length <= 0)
{
var FILE_TYPE, FTlen, i;
FILE_TYPE = [".orf", ".tif", ".tiff", ".jpg", ".jpeg"];
FTlen = FILE_TYPE.length;
for (i = 0; i < FTlen; i++){
var SEARCH_MASK = "*" + FILE_TYPE[i];}
var DARKfileList = DARKinputFolder.getFiles(SEARCH_MASK) ;} 

代码现在不再直接转到 'Alert' 消息,即使我故意选择一个空文件夹也是如此。


更新

为了帮助找出发生了什么,我添加了一行额外的代码:

var FILE_TYPE, FTlen i;
FILE_TYPE = [".orf", ".tif", ".tiff", ".jpg", ".jpeg"];
FTlen = FILE_TYPE.length;
for (i = 0; i < FTlen; i++){
var SEARCH_MASK = "*" + FILE_TYPE[i];}
var DARKfileList = DARKinputFolder.getFiles(SEARCH_MASK);
alert (SEARCH_MASK);

通过直接添加这一行 alert (SEARCH_MASK);,我了解了正在发生的事情。

是的,FILE_TYPE 数组正在迭代,但是 SEARCH_MASK 仅使用数组中的最后一个 FILE_TYPE 形成,因此在 [=18= 以上的情况下] 始终创建为:

*.jpeg

因此它只会在所选文件夹中查找该类型的文件。

这不是我要达到的目标。

我想知道所选文件夹是否包含数组中列出的任何类型的任何文件。

例如,所选文件夹可以包含所有 *.tif 个文件,甚至可以包含每种文件类型之一。

我怎样才能实现我需要代码做的事情?

问候..,


更新 2 简化脚本

这是根据要求简化的脚本:

var DARKfileList = '';

var AllowedFileTypes = Array( "orf", "tif", "tiff", "jpg", "jpeg" );



var dlgM = new Window('dialog','***###***###',undefined,{closeButton:false});
dlgM.center();
var DARKinputFolder = new Folder('/C/'); //create a folder to have the dialog start on. 
var DFdefault = new Folder(); //create a holding folder for canceling.

DFg = dlgM.add('panel {text:"DARK FRAMES",preferredSize:[450,15]}');
DFg.margins = [5,10,5,10];
DFg.alignChildren = 'left';
DFgroup = DFg.add('group');
DFgroup.DFBtn = DFgroup.add('button{text:"Select Folder...",preferredSize:[100,25]}');
DFgroup.DFBtn.helpTip = 'Please select your DARK FRAMES folder.';
DFgroup.DFlabel = DFgroup.add( 'statictext', undefined, DARKinputFolder, { truncate:'middle' } );
DFgroup.DFlabel.helpTip = 'Location of files to process';
DFgroup.DFlabel.preferredSize.width = '275';
DFgroup.DFlabel.text = 'No DARK FRAMES folder has been selected...';
DFgroup.DFlabelQ = DFgroup.add( 'statictext', undefined, '');
DFgroup.DFlabelQ.helpTip = 'Number of DARK FRAMES to process';
DFgroup.DFlabelQ.preferredSize.width = '40';
DFgroup.DFlabelQ.text = '';

BTNg = dlgM.add('group {alignment: "center"}');
BTNg.ExitBtn = BTNg.add('button{text:"Exit",preferredSize:[105,25]}');
BTNg.ProcessBtn = BTNg.add('button{text:"Process",preferredSize:[105,25]}');
BTNg.ProcessBtn.enabled = false;

DFgroup.DFBtn.onClick = function(){    
     DFdefault = new Folder(DARKinputFolder); //stores the current folder in case of cancel.    
     DFdefault = Folder.selectDialog('****Please Select The Folder Where Your DARK FRAMES Are Located****',DARKinputFolder);
     if ( DFdefault != null ) {
                    DARKinputFolder = DFdefault.fsName.toString()
                       DFgroup.DFlabel.text = DARKinputFolder;

if(DFdefault){DARKinputFolder = DFdefault}; //if cancel is hit, this statement becomes false, and myFolder remains untouched.    
    //if it's true, then the selected folder from the holdFolder is transferred to myfolder.   

var FTlen, i;
FTlen = AllowedFileTypes.length;
for (i = 0; i < FTlen; i++){
var SEARCH_MASK = "*." + AllowedFileTypes[i]};
var DARKfileList = DARKinputFolder.getFiles(SEARCH_MASK) ;




 if (DARKfileList.length == 0)
{
    alert('The DARK FRAME folder you have chosen is either empty or does not contain image files of the correct type.\r\rPlease locate & select the correct image folder.','DARK FRAME folder error');
    DFgroup.DFlabel.text = 'No DARK FRAMES folder has been selected...';
    DFdefault = '';
    DFgroup.DFlabelQ.text = '';
    }
else{                      
                       DFgroup.DFlabelQ.text = '[' + DARKfileList.length + ']';
                       var DFCurrFolder = (new File(DARKinputFolder)).fsName;
                       DFgroup.DFlabel.helpTip = 'Location of files to process:\r' + DFCurrFolder;
                       FolderChecker()
     }}
     } //opens the folder browse UI using you main folder.

BTNg.ExitBtn.onClick = function(){
dlgM.close();
} 

function FolderChecker(){
   if (DFdefault.exists){
    BTNg.ProcessBtn.enabled = true;
    }
}


BTNg.ProcessBtn.onClick = function(){

// THIS IS WHERE IMAGE PROCESSING STARTS -- REMOVED THIS HUGE SECTION FOR BREVITY

}


dlgM.show();

更新 3 最后一期

根据我关于需要检查非法文件类型等的评论,这是我目前的情况:

if (DARKfileList.length == 0)
{
    alert('empty folder!','DARK FRAME folder error');
    DFgroup.DFlabel.text = 'No DARK FRAMES folder has been selected...';
    DFdefault = '';
    DFgroup.DFlabelQ.text = '';
    }

else if (DARKfileList.length > 1)
{
    alert('too many file types!','DARK FRAME folder error');
    DFgroup.DFlabel.text = 'No DARK FRAMES folder has been selected...';
    DFdefault = '';
    DFgroup.DFlabelQ.text = '';
    }

else{                      
                       DFgroup.DFlabelQ.text = '[' + DARKfileList.length + ']';
                       var DFCurrFolder = (new File(DARKinputFolder)).fsName;
                       DFgroup.DFlabel.helpTip = 'Location of files to process:\r' + DFCurrFolder;
                       FolderChecker()
     }

现在,如果所选文件夹仅包含一个文件并且该文件不在 FILE_TYPE 数组中,则此操作完美无缺,因为 DARKfileList.length returns 为零。 根据需要

同样,如果文件夹包含多个文件,无论是何种类型,检查都会失败。 根据需要

但是,如果所选文件夹包含一个允许的 FILE_TYPE 和一个不在 FILE_TYPE 数组中的文件类型,则检查失败。 需要整理

我需要以下内容:

if (DARKfileList != FILE_LIST)
{
        alert('Illegal file type!);
        DFgroup.DFlabel.text = 'No DARK FRAMES folder has been selected...';
        DFdefault = '';
        DFgroup.DFlabelQ.text = '';
} 

问题是每次迭代都会覆盖生成的搜索掩码。

您需要将所有结果合并到一个数组中,然后检查您的数组是否为空:

var DARKfileList = [], FILE_TYPE, FTlen, i, SEARCH_MASK;
FILE_TYPE = ["orf", "tif", "tiff", "jpg", "jpeg"];
FTlen = FILE_TYPE.length;
for (i = 0; i < FTlen; i++) {
    SEARCH_MASK = "*." + FILE_TYPE[i];
    DARKfileList = DARKfileList.concat(DARKinputFolder.getFiles(SEARCH_MASK));
}
alert('found: ' + DARKfileList.length + ' files');

备选方案:getFiles 可以获得正则表达式作为参数,因此如果您熟悉正则表达式,则可以简单地使用以下正则表达式:

/.+\.(?:jpe?g|tiff?|orf)$/i

正则表达式解释:匹配文件名中的任何字符,然后是点字符,然后是扩展选项之一,然后是用于忽略区分大小写的 i 标志。 在您的示例中,您只会得到扩展名为小写的文件

要向正则表达式添加其他扩展名,只需在 orf 之后添加竖线 (|),然后添加您的扩展名。例如:添加 pdf 扩展名:

/.+\.(?:jpe?g|tiff?|orf|pdf)$/i

在您的代码中使用正则表达式:

DARKfileList = DARKinputFolder.getFiles(/.+\.(?:jpe?g|tiff?|orf|pdf)$/i);

您还可以使用数组来存储所有扩展并像这样使用它:

var regex = new RegExp('.+\.(?:' + FILE_TYPE.join('|')+ ')$','i');
DARKfileList = DARKinputFolder.getFiles(regex);