Javascript 目录的递归处理无法正常工作

Javascript 目录的递归处理无法正常工作,javascript,image-processing,macros,imagej,Javascript,Image Processing,Macros,Imagej,我一直在梳理这个论坛,查看其他类似于我的代码示例,但我仍然无法解决这个问题 我正在使用宏代码处理斐济/imageJ中的图像。该代码旨在递归搜索给定目录中的图像文件(在本例中为.vsi文件),并使用内置的bioformats函数将其转换为.tiff 我从几个例子中拼凑了以下代码(我不是程序员,我有生物学学位),我返回了一个错误,指定的文件不存在,就在我准备实际处理一个文件时 我的所有图像都具有以下常规目录结构: ~/Brain\u 01/Slice\u 01/Slice\u 01\u 01.vsi

我一直在梳理这个论坛,查看其他类似于我的代码示例,但我仍然无法解决这个问题

我正在使用宏代码处理斐济/imageJ中的图像。该代码旨在递归搜索给定目录中的图像文件(在本例中为.vsi文件),并使用内置的bioformats函数将其转换为.tiff

我从几个例子中拼凑了以下代码(我不是程序员,我有生物学学位),我返回了一个错误,指定的文件不存在,就在我准备实际处理一个文件时

我的所有图像都具有以下常规目录结构:

~/Brain\u 01/Slice\u 01/Slice\u 01\u 01.vsi

对于该集合中的第二个图像,实际示例如下所示:

~/K259_tlx3cre/K259_1of3_02/K259_1of3_01_02.vsi

我真的非常感谢你们提供的帮助!我现在完全被卡住了,这时我的头撞到了键盘上。另外,我想我已经遵守了所有的发帖规则。如果不是,请指出我的错误

最后,这里是我到目前为止编写的宏代码:

Dialog.create("File type");
Dialog.addString("File suffix: ", ".vsi", 5);
Dialog.show();
suffix = Dialog.getString();

inDir = getDirectory("Choose Directory Containing " + suffix + " Files ");
outDir = getDirectory("Choose Directory for TIFF Output ");
setBatchMode(true);
processFiles(inDir, outDir, "");
print("Done!");

function processFiles(inBase, outBase, sub) {
  flattenFolders = false; // this flag controls output directory structure
  print("Processing folder: " + sub);
  list = getFileList(inBase + sub);
  if (!flattenFolders) File.makeDirectory(outBase + sub);
  for (i=0; i<list.length; i++) {
    path = sub + list[i];
    //upath = toUpperCase(path);
    upath = path; //the previous line cause some problems
    if (endsWith(path, "/")) {
      processFiles(inBase, outBase, path);

    }
    else if (endsWith(upath, suffix)) {
        print("Importing " + suffix + " = " + list[i]);

            run("Bio-Formats Windowless Importer", "open=path color_mode=Default view=Hyperstack stack_order=XYCZT");

            print("Blue...");
            selectImage(1);
            title1 = getTitle();
            run("Blue");

            print("Green...");
            selectImage(2);
            title2 = getTitle();
            run("Green");

            print("Red...");
            selectImage(3);
            title3 = getTitle();
            run("Red");

            print("Merging Channels...");
            run("Merge Channels...", "red=&title3 green=&title2 blue=&title1 gray=*None* cyan=*None* magenta=*None* yellow=*None* create keep");

            print("Converting to RGB");
            run("RGB Color");

            saveAs("Tiff", path);
            run("Close All");
    }
  }
}
Dialog.create(“文件类型”);
addString(“文件后缀:”,“.vsi”,5);
Dialog.show();
后缀=Dialog.getString();
inDir=getDirectory(“选择包含“+后缀+”文件的目录”);
outDir=getDirectory(“为TIFF输出选择目录”);
setBatchMode(真);
processFiles(inDir,outDir,“”);
打印(“完成!”);
函数进程文件(inBase、outBase、sub){
FlattFolders=false;//此标志控制输出目录结构
打印(“处理文件夹:“+sub”);
list=getFileList(inBase+sub);
如果(!flatteFolders)File.makeDirectory(outBase+sub);

对于(i=0;i,通过查看您收到的错误消息,您应该能够发现问题:当您的文件位于例如
inBase+sub+list[i]
时,您的
path
变量只包含
sub+list[i]
。因此,您应该使用以下内容:

run("Bio-Formats Windowless Importer", "open=[" + inBase + path + "] color_mode=Default view=Hyperstack stack_order=XYCZT");
用于打开文件,以及:

saveAs("Tiff", outBase + path);
用于保存输出文件

如果还希望在代码中使用
flattfolders
标志,则应根据
flattfolders
的状态构建输出路径,例如:

outputPath = outBase;
if (!flattenFolders) outputPath += sub;
outputPath += list[i];
顺便说一下,不需要使用
toUpperCase(path)
将路径转换为大写,除非您希望使用不区分大小写的文件后缀。在这种情况下,您可以编写:

if (endsWith(toUpperCase(path), toUpperCase(suffix))) {
    // process your file here
}
允许.vsi和.vsi同时作为输入


注意:ImageJ发行版提供了一种递归处理文件夹的方法,您可以通过编辑器中的模板>宏>处理文件夹打开它。

您似乎在我回答问题几天后就开始了讨论。(我将其链接到这里,以便其他有类似问题的用户可以找到讨论。)我还编辑了我的答案,包括使用方括号和包含空格的文件名。谢谢你,简!我将在这里发布我的工作宏代码,也供将来的用户使用。
if (endsWith(toUpperCase(path), toUpperCase(suffix))) {
    // process your file here
}