如何编写算法来查看目录是否包含 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。
我想看看某个目录是否包含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。