3

フォルダ内のサウンド ファイルを検索していますが、そのサウンド ファイルが存在するかどうか (.mp3、.mp4 など) を知りたいのですが、ファイル名 (拡張子なし) が存在することを確認したいだけです。

例.ファイル検索 /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");
}

短所:質問で意図していなかったファイルが見つかった場合でも、検索を続行します。提案は大歓迎です

4

7 に答える 7

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

このコードは、パスのすべてのファイルをチェックします。すべてのファイル名を拡張子から分割します。最後に、定義されたファイル名と一致すると、そのファイル名を出力します。

于 2013-07-17T11:01:39.070 に答える
3

"a"接尾辞に関係なく名前を持つファイルを探している場合、探しているグロブa{,.*}. globは、シェルと Java API がファイル名を照合するために使用する正規表現言語の一種です。Java 7 以降、Java はグロブをサポートしています。

このグロブは説明した

  • {}代替案を紹介します。選択肢は で区切られてい,ます。例:
    • {foo,bar}ファイル名foobar.
    • foo{1,2,3}ファイル名foo1foo2およびに一致しますfoo3
    • foo{,bar}はファイル名に一致しfoofoobar- 代替は空にすることができます。
    • foo{,.txt}ファイル名foofoo.txt.
  • *ゼロ文字を含む、任意の種類の任意の数の文字を表します。例:
    • f*fは、ファイル名, fa, faa, fb, ,fbbfab一致しますfoo.txt- 名前が で始まるすべてのファイルf
  • 組み合わせは可能です。はanda{,.*}の代替であるため、ファイル名だけでなく、 で始まるすべてのファイル名と一致します。aa.*aa.a.txt

接尾辞に関係なく、現在のディレクトリにあるすべてのファイルを"a"名前としてリストする Java プログラムは、次のようになります。

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);
            }
        }
    }
}

または 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{,.*}")) {
            stream.forEach(System.out::println);
        }
    }
}

変数にファイル名があり、それが特定のグロブに一致するかどうかを確認したい場合は、メソッドを使用して、次のようにグロブに一致するFileSystem.getPathMatcher()a を取得できます。PathMatcher

final FileSystem fileSystem = FileSystems.getDefault();
final PathMatcher pathMatcher = fileSystem.getPathMatcher("glob:a{,.*}");
final boolean matches = pathMatcher.matches(new File("a.txt").toPath());
于 2014-12-19T20:53:38.473 に答える
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!
            }
        }
于 2013-07-17T11:13:25.200 に答える
0

DirectoryStreamSE 7クラスを利用できます。

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);
    }

}

これは、ベースファイル名が指定された File と一致し、同じディレクトリにある限り、任意の拡張子を持つファイルを返します。拡張子なしのファイルも返します。

FileNameFilter クラスは、ストリームが関心のある一致のみを返すようにします。

于 2013-07-17T11:26:31.820 に答える
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));
}
}
于 2013-07-17T10:46:59.567 に答える
-2

これを試してみてください

FileLocationWithExtension = "nameofFile"+ ".*"
于 2013-07-17T10:49:11.583 に答える