Javaのディレクトリで最後に変更されたファイルを見つけるにはどうすればよいですか?
9 に答える
private File getLatestFilefromDir(String dirPath){
File dir = new File(dirPath);
File[] files = dir.listFiles();
if (files == null || files.length == 0) {
return null;
}
File lastModifiedFile = files[0];
for (int i = 1; i < files.length; i++) {
if (lastModifiedFile.lastModified() < files[i].lastModified()) {
lastModifiedFile = files[i];
}
}
return lastModifiedFile;
}
これら2つを組み合わせます。
- を使用して、ファイルの最終変更時刻を取得できます
File.lastModified()
。 - ディレクトリ内のすべてのファイルを一覧表示するには、を使用します
File.listFiles()
。
Javaでは、java.io.File
オブジェクトはディレクトリとファイルの両方に使用されることに注意してください。
import org.apache.commons.io.comparator.LastModifiedFileComparator;
import org.apache.commons.io.filefilter.WildcardFileFilter;
...
...
/* Get the newest file for a specific extension */
public File getTheNewestFile(String filePath, String ext) {
File theNewestFile = null;
File dir = new File(filePath);
FileFilter fileFilter = new WildcardFileFilter("*." + ext);
File[] files = dir.listFiles(fileFilter);
if (files.length > 0) {
/** The newest file comes first **/
Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
theNewestFile = files[0]
}
return theNewestFile;
}
これは私にとってとてもうまくいきます
File.lastModified() メソッドを使用して、最終変更時刻を取得できます。私の提案する解決策は、lastModified() 順でソートするカスタム Comparator を実装し、このコンパレータを使用してソートする TreeSet 内のディレクトリ内のすべてのファイルを挿入することです。
テストされていない例:
SortedSet<File> modificationOrder = new TreeSet<File>(new Comparator<File>() {
public int compare(File a, File b) {
return (int) (a.lastModified() - b.lastModified());
}
});
for (File file : myDir.listFiles()) {
modificationOrder.add(file);
}
File last = modificationOrder.last();
最後のファイルのみが必要な場合は、Bozho が提案するソリューションの方がおそらく高速です。一方、これは、より複雑なことを行う必要がある場合に役立つ場合があります。
あなたの問題は次のようになります:Javaを使用してディレクトリから最後に変更されたファイルを10個だけ取得するにはどうすればよいですか?
フィルタコードを変更してファイルを1つだけにするだけで、acceptメソッドは2つのタイムスタンプを単純に比較する必要があります。
テストされていないコード:
class TopFileFilter implements FileFilter {
File topFile;
public boolean accept(File newF) {
if(topFile == null)
topFile = newF;
else if(newF.lastModified()>topFile.lastModified())
topFile = newF;
return false;
}
}
ここで、このフィルターのインスタンスを引数としてdir.listFilesを呼び出します。最後に、filter.topFileは最後に変更されたファイルです。
thePath
変数に検索するディレクトリが含まれていると仮定しましょう。次のスニペットは、その中の最後に変更されたファイルを返します。
Files.walk(thePath)
.sorted((f1, f2) -> -(int)(f1.toFile().lastModified() - f2.toFile().lastModified()))
.skip(1)
.findFirst()
それがすることは次のとおりです。
- 最初にファイルを最終変更時刻で逆順に並べ替えます。
- 次に、ディレクトリ自体をスキップし、
- 最後に、ストリームの最初の要素 (最後に変更された要素) を取得します。
Emilのソリューションのコンパレータは、この方法でよりクリーンになります
public int compare(File a, File b) {
if ((a.lastModified() < b.lastModified())) {
return 1;
} else if ((a.lastModified() > b.lastModified())) {
return -1;
}
return 0;
}
にキャスト(a.lastModified() - b.lastModified())
するとint
、予期しない結果が生じる可能性があります。