检查文件是否在目录中的正确方法是什么?

时间:2014-12-23 10:45:56

标签: java android

我不是问如何检查文件是否存在或如何检查文件是否在特定目录级别。相反,我想知道如何检查现有文件是否在指定目录下的任何位置。

显然,如果文件是易于检查的目录的直接子项。但我希望能够有效地检查现有文件是否在包含任何可能子目录的目录中。我在Android项目中使用它,我对缓存保持细粒度控制,我想要一个实用工具方法来检查我可能正在操作的文件是否在我的缓存文件夹中。

示例:

   cache dir
     / \
   dir  file1  
    / \  
file2  file3  

isCacheFile(file2)应该返回true

目前我有一个像这样的方法

private static final File cacheDir = AssetManager.getInstance().getCacheDir(); // Not android.content.res.AssetManager
private static final String cacheDirName = cacheDir.getAbsolutePath();

public static boolean isCacheFile(File f) {
    if (!f.exists()) return false;
    return f.getAbsolutePath().startsWith(cacheDirName);
}

但是,我倾向于相信有更好的方法可以做到这一点。有没有人有任何建议?

4 个答案:

答案 0 :(得分:0)

如果您有一个已知路径(以File f的形式),并且您想知道它是否在特定文件夹中(以File cacheDir的形式),您可以简单地遍历您文件的父文件夹链,看看您是否符合您要查找的文件夹。

像这样:

public static boolean isCacheFile(File f) {
    while (f.getParentDir()!=null) {
       f = f.getParentDir();
       if (f.equals(cacheDir)) {
           return true;
       }
    }
    return false;
}

答案 1 :(得分:0)

boolean isContains(File directory){
File[] contents = directory.listFiles();
if (contents != null) {
    for(int i = 0; i < contents.length; i++){
        if(contents[i].isDirectory())
            isContains(contents[i]);
        else if(contents[i].getName().equals(*your_file_name*))
            return true;
    }
}
return false;
}

答案 2 :(得分:0)

如果文件存在于每个子目录中,可以通过递归来完成。

首先检查文件是否存在于根目录中。

boolean exist = new File(rootDirectory, temp).exists();

然后如果文件不在根目录中,则列出所有文件并在sub-directoy文件中再次以递归方式调用该方法,直到找到该文件或者没有其他子目录。

答案 3 :(得分:0)

public String getPathFromFileName(String dirToStart,Sring fileName){

File f = new File(dirToStart);

File[] list = f.listFiles();

String s="null";

for(int i=0;i<list.length;i++){
    if(list[i].isFile()){
        //is a file

        if(fileName.equals(list[i])){
            s=dirToStart+"/"+fileName;
            break;
        }
    }else{
        //is a directory search further.
        getPathFromFileName(dirToStart+list[i]);
    }
  }

 return s;

}

通过传递父目录名和文件名来在子目录中搜索来调用此方法。

如果返回值不等于“null”,则检查返回值,然后返回文件路径。