递归检查或文件夹,但跳过特定的一个

时间:2016-07-06 09:01:05

标签: java recursion directory

好的,我有一个非常常见的功能来检查路径中的所有文件(包括子文件夹)。在给定的路径中,我有多个文件夹,如Folder1,Folder2,Folder3 ... Foldern,我想跳过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/");

        }
    }   
}

4 个答案:

答案 0 :(得分:2)

我建议您使用包含要跳过的文件夹的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...
   }
}

答案 1 :(得分:1)

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

跳过循环操作
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
     }
    }
   }
  }
 }
}

答案 2 :(得分:0)

这样做:

foreach (object user in checkedListBoxUsersWhoSee.Items)
{
    // Privileged = if the user is checked he has privileges;
    alias = user.ToString().Substring(user.ToString().Length - 3);
    SelectUserID = new SqlCommand(Properties.Resources.SelectUserID + alias, TeamPWSecureBD);
    userIDAuth = (int)SelectUserID.ExecuteScalar();

    InsertAuths.Parameters.AddWithValue("@idPass", idPass);
    InsertAuths.Parameters.AddWithValue("@idUser", userIDAuth);
    InsertAuths.Parameters.AddWithValue("@Privileged", idPass);

    //Code not finished
}

答案 3 :(得分:0)

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

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

并使skip方法获取路径并检查是否要跳过该文件夹;返回一个布尔值。 true意味着跳过它。