2011-07-28 227 views
0

我有这部分代码:递归删除目录

public static void delete(File f) throws IOException 
    { 
     if (f.isDirectory()) 
     { 
      for (File c : f.listFiles()) 
      { 
       delete(c); 
      } 
     } 
     else if (!f.delete()) 
     { 
      throw new FileNotFoundException("Failed to delete file: " + f); 
     } 
    } 



public static void traverseDelete(File directory) throws FileNotFoundException, InterruptedException 
    { 
     //Get all files in directory 
     File[] files = directory.listFiles(); 
     for (File file : files) 
     { 
      if (file.getName().equalsIgnoreCase("word")) 
      { 
       boolean containsMedia = false; 

       File[] filesInWordFolder = file.listFiles(); 

       for (File file2 : filesInWordFolder) 
       { 
        if (file2.getName().contains("media")) 
        { 
         containsMedia = true; 
         break; 
        } 
       } 

       if (containsMedia == false) 
       { 
        try 
        { 
         delete(file.getParentFile()); 
        } 
        catch (IOException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      } 
      else if (file.isDirectory()) 
      { 
       traverseDelete(file); 
      } 
     } 
    } 

对不起,我没有评论的,但它是不言自明的,我想。本质上,代码应该做的是遍历给定目录中的一组文件,如果它遇到一个名为“word”的目录,那么它应该列出word的内容,然后如果名为“media”的目录没有存在,递归地删除“word”的父目录下的所有内容。

我主要关心来源于此条件:

if(!filesInWordFolder.toString().contains("media")) 

是正确的方式说,如果该数组在文件中不包含“图像”的实例,继续和删除?

回答

1

这是行不通的。

File[] filesInWordFolder = file.listFiles(); 

if(!filesInWordFolder.toString().contains("media")) 

会给你一个File数组的字符串表示 - 它通常会有一个引用。

你必须迭代文件以确定是否有任何内容包含单词媒体。

boolean containsMedia = false; 

for (File file : filesInWordFolder) { 

if (file.getName().contains("media")){ 
containsMedia = true; 
break; 
} 

// now check your boolean 
if (!containsMedia) { 
+0

我编辑了我原来的帖子,并按照您的示例包含了我的新traverseDelete方法,但它仍然没有正确删除文件夹。有任何想法吗? –

+0

你是否收到任何错误? – Kal

+0

不,没有错误。 :/ –

0

那么使用toString()会给你一个字符串表示的文件(在这里是文件)。字符串表示应该包含文件名。如果您设定的目的是检查目录中包含单词“media”的文件的任何实例,则表示您没有问题。

在此示例中,您正在打印File数组的字符串表示形式。相反,你应该通过文件阵列迭代并检查每个单独的文件的字符串表示像这样:

for (int i = 0; i < file_array.length; i++) { 
    if ((File)file_array[i]).toString().equals("your_search_term")) { 
    // The file contains your search term 
    } else { 
    // Doesn't contain the search term. 
    } 
} 
+0

只是做的print语句'的System.out.println(filesInWordFolder.toString());'和它简单地返回存储位置:/。 即'[Ljava.io.File; @ 1cd8669 [Ljava.io.File; @ 337838 [Ljava.io.File; @ 119cca4' –

+0

@this一个程序员我appologize,我误解你的代码的东西。我会更新答案以反映这一点。 –