如何编写算法来查看目录是否包含 jpg 文件(子文件夹)

How to write an Algorithm to see if directory contains a jpg file (subfolders)

我想看看某个目录是否包含jpg文件。执行此操作的最佳方法(一种方法)是什么?如果该目录没有任何子文件夹,那将很容易,但现在我想在目录中移动以查找 jpg。例如:

public static boolean dirHasJpg(File[] files){
    //files is the first directory
    for(File file : files){
        if(file.getName().toLowerCase().endsWith("jpg")){
            return true;
        }else if(file.isDirectory()){
            //move in to a subdirectory.
            for (File f2 : file.listFiles()){
                if(f2.getName().toLowerCase().endsWith("jpg")) {
                    return true;
                }else if(f2.isDirectory()){
                    and so on....
                }
            }
        }
    }
    return false;
}

我知道这应该是某个地方的 while 循环,但我只是想不出如何实现它,类似于。

    for(File file : files){
        while (file.isDirectory()){
            //check that directory and all subdirectories
        }
    }

以下代码片段可能会有所帮助:

    public void CheckFile(String directoryName) {
    File directory = new File(directoryName);

    // get all the files from a directory
    File[] fList = directory.listFiles();
    for (File file : fList) {
        if (file.isFile() && getFileExt(file.getName()) == "jpg") {
          //file is your jpg :)
        } else if (file.isDirectory()) {
            CheckFile(file.getAbsolutePath());
        }
    }
}



public static String getFileExt(String FileName){
     return FileName.substring((FileName.lastIndexOf(".") + 1), FileName.length());
    }

我制作了一个应用程序,可以列出 USB 记忆棒中的图像文件,为此,我列出了与特定扩展名对应的所有文件,在您的情况下,您只想列出 "jpg" 个文件...

您可能需要 Apache FileUtils(org.apache.commons.io.FileUtils 和依赖项)...

这是我的代码的摘录:

        File directory  = new File("/storage/UsbDriveA/");
        if (directory != null) {
            if (directory.canRead()) {
                ArrayList<File> = images = new ArrayList<File>();
                String[] imageExtensions = {"jpg","jpeg","JPG","JPEG"};
                Iterator<File> iterateImages = FileUtils.iterateFiles(directory, imageExtensions, true); // put this latest argument to false if you do not want to iterate recursively
                while (iterateImages.hasNext()) {
                    File theImage = iterateImages.next();
                    if (!theImage.getName().startsWith(".", 0))
                        images.add(theImage);

                }

                if (images.size() > 0)
                {
                    // ok you have at least 1 jpg file
                }
            }
        }

你就快完成了!您已经掌握了基本结构,但缺少的是对已定义方法的递归调用。这是一个示例:

public static boolean dirHasJpg(File[] files){
    // Iterate over the contents of the given file list
    for(File file : files){
        if (file.isFile()) {
            // If you were given a file, return true if it's a jpg
            if (file.getName().toLowerCase().endsWith("jpg")) {
                return true;
            }
        } else if (file.isDirectory()){
            // If it is a directory, check its contents recursively
            if (dirHasJpg(file.listFiles())) {
                return true;
            }
        }
    }
    // If none of the files were jpgs, and none of the directories contained jpgs, return false
    return false;
}

虽然在这种情况下,最好将方法重命名为 containsJpg() 或者甚至通过将方法定义为 boolean containsFileType(String fileExtension)boolean containsFileType(String[] fileExtensions)[=16 使其更易于重用=]


编辑:

您在评论中询问了 if 语句是否必要,因此我将使用一个示例。假设您具有以下目录结构:

文件0-1.txt
文件夹 1
---- 文件1-1.txt
---- 文件1-2.txt
文件夹 2
---- file2-1.txt
---- file2-2.jpg

如果我们简单地使用 return file.getName().toLowerCase().endsWith("jpg") 而没有 if 语句,它会发现 File0-1.txt 和 return 为假。因此,因为它 returned 而没有继续检查 files/directories 的其余部分,它会错过 file2-2.jpg。关于 return dirHasJpg(file.listfiles()) 也可以这样说:对于 Folder1,它会 return 错误,并且不会到达包含 jpg 文件的 Folder2。