我在文件夹中搜索声音文件并想知道声音文件是否存在,可能是.mp3,.mp4等。我只想确保文件名(不带扩展名)存在。
例如.File search / home / user / desktop / sound / a
如果存在任何a.mp3或a.mp4或a.txt等,则返回。
我试过了:
File f=new File(fileLocationWithExtension);
if(f.exist())
return true;
else return false;
但是我必须传递扩展名,否则返回false总是
对于任何来到这里的人来说,这是我想出的最佳方式
public static void main(String[] args) {
File directory=new File(your directory location);//here /home/user/desktop/sound/
final String name=yourFileName; //here a;
String[] myFiles = directory.list(new FilenameFilter() {
public boolean accept(File directory, String fileName) {
if(fileName.lastIndexOf(".")==-1) return false;
if((fileName.substring(0, fileName.lastIndexOf("."))).equals(name))
return true;
else return false;
}
});
if(myFiles.length()>0)
System.Out.println("the file Exist");
}
缺点:即使找到了我在我的问题中从未想过的文件,它仍将继续搜索。欢迎提出任何建议
答案 0 :(得分:6)
这段代码可以解决问题..
public static void listFiles() {
File f = new File("C:/"); // use here your file directory path
String[] allFiles = f.list(new MyFilter ());
for (String filez:allFiles ) {
System.out.println(filez);
}
}
}
class MyFilter implements FilenameFilter {
@Override
//return true if find a file named "a",change this name according to your file name
public boolean accept(final File dir, final String name) {
return ((name.startsWith("a") && name.endsWith(".jpg"))|(name.startsWith("a") && name.endsWith(".txt"))|(name.startsWith("a") && name.endsWith(".mp3")|(name.startsWith("a") && name.endsWith(".mp4"))));
}
}
上面的代码会找到名称为 a 的文件列表
我在这里使用了4个扩展来测试( .jpg,.mp3,.mp4,.txt )。如果您需要更多,只需在boolean accept()
方法中添加它们。
编辑:
这是OP想要的最简化版本。
public static void filelist()
{
File folder = new File("C:/");
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles)
{
if (file.isFile())
{
String[] filename = file.getName().split("\\.(?=[^\\.]+$)"); //split filename from it's extension
if(filename[0].equalsIgnoreCase("a")) //matching defined filename
System.out.println("File exist: "+filename[0]+"."+filename[1]); // match occures.Apply any condition what you need
}
}
}
输出:
File exist: a.jpg //These files are in my C drive
File exist: a.png
File exist: a.rtf
File exist: a.txt
File exist: a.mp3
File exist: a.mp4
此代码会检查路径中的所有文件。它会将所有文件名从其扩展名中拆分。最后,如果匹配发生在已定义的文件名,那么它将会打印文件名。
答案 1 :(得分:1)
如果您要查找名称为"a"
的任何文件而不考虑后缀,那么您要查找的 glob 是a{,.*}
。 glob 是shell使用的正则表达式语言的类型,Java API用于匹配文件名。从Java 7开始,Java就支持globs。
{}
介绍了另一种选择。替代方案用,
分隔。例子:
{foo,bar}
与文件名foo
和bar
匹配。foo{1,2,3}
匹配文件名foo1
,foo2
和foo3
。foo{,bar}
与文件名foo
和foobar
匹配 - 替代方案可以为空。foo{,.txt}
与文件名foo
和foo.txt
匹配。*
代表任意数量的任意字符,包括零字符。例子:
f*
匹配文件名f
,fa
,faa
,fb
,fbb
,fab
,{{1 - 每个名称以foo.txt
开头的文件。f
是替代a{,.*}
和a
,因此它匹配文件名a.*
以及以a
开头的每个文件名,例如a.
一个Java程序,它列出了当前目录中以a.txt
为名的所有文件,无论后缀如何,如下所示:
"a"
或Java 8:
import java.io.*;
import java.nio.file.*;
public class FileMatch {
public static void main(final String... args) throws IOException {
try (final DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get("."), "a{,.*}")) {
for (final Path entry : stream) {
System.out.println(entry);
}
}
}
}
如果您在变量中有文件名,并且想要查看它是否与给定的glob匹配,则可以使用import java.io.*;
import java.nio.file.*;
public class FileMatch {
public static void main(final String... args) throws IOException {
try (final DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get("."), "a{,.*}")) {
stream.forEach(System.out::println);
}
}
}
方法获取与glob匹配的FileSystem.getPathMatcher()
,如下所示:< / p>
PathMatcher
答案 2 :(得分:0)
您可以尝试这样的事情
File folder = new File("D:\\DestFile");
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
if (file.isFile()) {
System.out.println("found ."+file.getName().substring(file.getName().lastIndexOf('.')+1));
}
}
答案 3 :(得分:0)
试试这个:
File parentDirToSearchIn = new File("D:\\DestFile");
String fileNameToSearch = "a";
if (parentDirToSearchIn != null && parentDirToSearchIn.isDirectory()) {
String[] childFileNames = parentDirToSearchIn.list();
for (int i = 0; i < childFileNames.length; i++) {
String childFileName = childFileNames[i];
//Get actual file name i.e without any extensions..
final int lastIndexOfDot = childFileName.lastIndexOf(".");
if(lastIndexOfDot>0){
childFileName = childFileName.substring(0,lastIndexOfDot );
if(fileNameToSearch.equalsIgnoreCase(childFileName)){
System.out.println(childFileName);
}
}//otherwise it could be a directory or file without any extension!
}
}
答案 4 :(得分:0)
您可以使用SE 7 DirectoryStream
类:
public List<File> scan(File file) throws IOException {
Path path = file.toPath();
try (DirectoryStream<Path> paths = Files.newDirectoryStream(path.getParent(), new FileNameFilter(path))) {
return collectFilesWithName(paths);
}
}
private List<File> collectFilesWithName(DirectoryStream<Path>paths) {
List<File> results = new ArrayList<>();
for (Path candidate : paths) {
results.add(candidate.toFile());
}
return results;
}
private class FileNameFilter implements DirectoryStream.Filter<Path> {
final String fileName;
public FileNameFilter(Path path) {
fileName = path.getFileName().toString();
}
@Override
public boolean accept(Path entry) throws IOException {
return Files.isRegularFile(entry) && fileName.equals(fileNameWithoutExtension(entry));
}
private String fileNameWithoutExtension(Path candidate) {
String name = candidate.getFileName().toString();
int extensionIndex = name.lastIndexOf('.');
return extensionIndex < 0 ? name : name.substring(0, extensionIndex);
}
}
只要基本文件名与给定的文件匹配,并且位于同一目录中,这将返回带有任何扩展名的文件,甚至没有扩展名。
FileNameFilter类使流只返回您感兴趣的匹配项。
答案 5 :(得分:0)
public static boolean everExisted() {
File directory=new File(your directory location);//here /home/user/desktop/sound/
final String name=yourFileName; //here a;
String[] myFiles = directory.list(new FilenameFilter() {
public boolean accept(File directory, String fileName) {
if(fileName.lastIndexOf(".")==-1) return false;
if((fileName.substring(0, fileName.lastIndexOf("."))).equals(name))
return true;
else return false;
}
});
if(myFiles.length()>0)
return true;
}
}
当它返回时,它将停止该方法。
答案 6 :(得分:-1)
试试这个
FileLocationWithExtension = "nameofFile"+ ".*"