【问题标题】:Check or folders recursively, but skip a particular one递归检查或文件夹,但跳过特定的
【发布时间】:2016-11-08 06:30:17
【问题描述】:

好的,我有一个非常常用的功能来检查路径中的所有文件(包括子文件夹)。在给定的路径中,我有多个文件夹,例如 Folder1、Folder2、Folder3... Folder,例如,我想跳过 Folder2。最好的方法是什么?下面是我的功能。

public void loadFileRecursiv(String pathDir)
{
    File fisier = new File(pathDir);
    File[] listaFisiere = fisier.listFiles();

    for(int i = 0; i < listaFisiere.length; i++)
    {
        if(listaFisiere[i].isDirectory())
        {
            loadFileRecursiv(pathDir + File.separatorChar + listaFisiere[i].getName());
        }
        else
        {
            String cuExtensie = listaFisiere[i].getName();
            int pos = cuExtensie.lastIndexOf(".");
            String nume = cuExtensie.substring(0, pos);
            String acronimBanca = nume.split("_")[0];
            String tipAct = nume.split("_")[1];
            String dataActString = nume.split("_")[2];

            SimpleDateFormat old = new SimpleDateFormat("dd-MM-yyyy");
            SimpleDateFormat newPattern = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String dataFormatata = null;

            try
            {
                dataFormatata = newPattern.format(old.parse(dataActString));
            }
            catch(ParseException e)
            {
                e.printStackTrace();
            }
            //String denBanca = inlocuireAcronim(acronimBanca);

            processFolder(acronimBanca, acronimBanca); 
            insertData(listaFisiere[i], nume, acronimBanca, tipAct, dataFormatata);

            System.out.println("AICI =========== " + pathDir + File.separatorChar + listaFisiere[i].getName());
            moveFile(pathDir + File.separatorChar + listaFisiere[i].getName(), "/u02/ActeConstitutive/Mutate/");

        }
    }   
}

【问题讨论】:

  • 避免使用File - 这是一个过时的类,java.nio 中有更好的解决方案,并且已经存在很多年了。例如,尝试java.nio.file.Files 中的walkFileTree 方法之一。

标签: java recursion directory


【解决方案1】:

我建议您使用包含要跳过的文件夹的 Set。

// get the folders you want to avoid and add them to your set

File Folder2 = new File(pathName);
Set<File> folderToSkip = new HashSet<File>();
folderToSkip.add(Folder2);

// add as many other folders you want to avoid

然后在for循环中,你可以检查是否要进入这个文件夹

for(int i = 0; i < listaFisiere.length; i++){
   if(!folderToSkip.contains(listaFisiere[i]){
       // do your stuff...
   }
}

【讨论】:

    【解决方案2】:

    虽然您的方法是递归的,但递归部分仅适用于文件夹级别。您可以通过

    跳过循环操作
    continue
    

    关键字。如下:

    for(int i = 0;i<5;i++){
     if(i == 0){
      continue;
     }
     System.out.println(i);
    }
    

    会跳过第一个操作0,并输出以下内容

    1
    2
    3
    4
    

    Example here

    这允许您构建一个更加模块化的循环,在我看来它看起来

    更好
    for(int i = 0;i<5;i++){
     if(i != 0){
      System.out.println(i);
     }
    }
    

    尤其是在嵌套更多条件或循环时,如下所示:

    for(int i = 0;i<5;i++){
     if(i != 0){
      if(i != 0){
       if(i != 0){ 
        if(i != 0){
         if(i != 0){
           // stuff
         }
        }
       }
      }
     }
    }
    

    【讨论】:

      【解决方案3】:

      这样做:

      for(int i = 0; i < listaFisiere.length; i++)
      {
          if(listaFisiere[i].isDirectory())
          {
              if (!listaFisiere[i].getName().equalsIgnoreCase("Folder2"))
                  loadFileRecursiv(pathDir + File.separatorChar + listaFisiere[i].getName());
          }
          else
          {
      

      【讨论】:

        【解决方案4】:

        在方法的第一个添加 if 语句。

        public void loadFileRecursiv(String pathDir)
        {
            if(new File(pathDir).isDirectory() && skip(pathDir))
                  return;
        

        并制作skip 方法,该方法采用路径并检查您是否要跳过该文件夹;它返回一个布尔值。 true 表示跳过。

        【讨论】:

        • skip 方法可以扩展,因此您可以跳过多个文件夹,或文件夹列表。如果您需要有关其实现的任何详细信息。在这里发表评论。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-28
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 1970-01-01
        • 2015-03-04
        • 2012-08-22
        相关资源
        最近更新 更多