Erhalten Sie die neuesten Datei-Verzeichnis weisen in java

Habe ich einen Pfad abc in diesem Pfad gibt es Verzeichnisse/Unterverzeichnisse und Dateien. Nun, für z.B. wenn es ein Verzeichnis ‚A‘ & ‚B‘, in denen gibt es einige Dateien, und es gibt Unterverzeichnis, in dem die Dateien sind da. Gleich in ‚B‘ – Verzeichnis. Jetzt die Ausgabe von ‚A‘ – Verzeichnis, das wir bekommen sollte zuletzt geänderte Datei, und dasselbe in ‚B‘ – Verzeichnis.

Ich dies getan habe viel.

 public class GetLastModifiedFile {

    static TreeMap<String, String> map = null;
    static Entry<String, String> lastfile;

    public static void main(String[] args) throws IOException {
        File currentDir = new File("D:\\myfiles"); //current directory
        map = new TreeMap<String, String>();
        displayDirectoryContents(currentDir);
        printFileList();

    }

    public static void printFileList() {
        for (Entry<String, String> entry : map.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + "      " + value);
        }
        lastfile = map.lastEntry();
        System.out.println("last file is" + " " + lastfile);
    }

    public static void displayDirectoryContents(File dir) throws IOException {

        String dateTime = "0000-00-00 00:00:00";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {

                displayDirectoryContents(file);

            } else {

                dateTime = sdf.format(new Date(file.lastModified()));
                map.put(dateTime, file.toString());
            }

        }

    }

}

Ausgabe – ich bin nur immer zuletzt geänderte Datei von allen Verzeichnis und Unterverzeichnis. ich möchte die Ausgabe so, wie wenn ich mich in „Einem“ Verzeichnis als es sollte, überprüfen Sie zuerst, dass es ein Unterverzeichnis oder Dateien sollte es dann Holen Sie sich die zuletzt geänderten Datei aus, bevor die Traversierung anderen Verzeichnis.

  • haben Sie versucht, alles, was von Ihrer Seite, es zu tun?
  • ja, ich habe versucht. ich habe es geschafft, alle Dateien aus der Liste der Verzeichnisse, sondern ich die Liste Datei-Verzeichnis klug und Holen Sie sich last-modified-Datei nach Verzeichnis wise
  • Posten, was Sie bisher getan haben. Eingang, Stromausgang und erwartete Ausgabe. Dies wird helfen, alle zu verstehen, die Frage.
  • Ich teilen, was ich getan habe, bitte haben Sie einen Blick
InformationsquelleAutor Ansh Sethi | 2016-01-05



One Reply
  1. 1

    Unten finden Sie einen kleinen Schnipsel, die tut, was Sie erreichen wollen.

    Zur demonstration Zweck es erzeugt auch einige Beispiel-Verzeichnisse und-Dateien.

    import java.io.File;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.Date;
    import java.util.Optional;
    import static java.util.concurrent.TimeUnit.MINUTES;
    
    public class FindRecentFileRecursively {
    
        public static void main(String[] args) throws IOException {
            //create some dummy directories/files
            Path root = Paths.get("/tmp/foobar");
            for (char c = 'A'; c <= 'C'; c++) {
                Path dir = root.resolve("dir_" + c);
                System.out.println("create sample directory " + dir.toString());
                Files.createDirectories(dir);
                long now = System.currentTimeMillis();
                for (int i = 1; i <= 3; i++) {
                    File file = dir.resolve("file" + i).toFile();
                    file.createNewFile();
                    file.setLastModified(now + MINUTES.toMillis(i));
                    printFileInfo(file);
                }
            }
    
            System.out.println("list the most recent file per directory");
            //find all directories below /tmp/foobar
            Files.find(root, Integer.MAX_VALUE, (path, attrs) -> attrs.isDirectory())
                    //for each directory
                    .forEach((dir) -> {
                        try {
                            //find all contained files
                            Optional<Path> recentFile = Files.find(dir, 1, 
                                      (path, attrs) -> attrs.isRegularFile())
                                    //return the file with the recent last
                                    //modification time
                                    .max((p1, p2)
                                            -> Long.compare(
                                        p1.toFile().lastModified(),
                                        p2.toFile().lastModified()));
                            //if a file was found
                            if (recentFile.isPresent()) {
                                //print modification time and file name
                                printFileInfo(recentFile.get().toFile());
                            }
                        } catch (IOException ex) {
                            ex.printStackTrace(System.err);
                        }
                    });
        }
    
        private static void printFileInfo(File file) {
            System.out.printf("  mtime: %td.%<tm.%<tY  %<tH:%<tM:%<tS  file: %s%n",
                    new Date(file.lastModified()),
                    file.getAbsolutePath()
            );
        }
    }

    Ausgabe wie

    create sample directory /tmp/foobar/dir_A
      mtime: 05.01.2016  15:35:15  file: /tmp/foobar/dir_A/file1
      mtime: 05.01.2016  15:36:15  file: /tmp/foobar/dir_A/file2
      mtime: 05.01.2016  15:37:15  file: /tmp/foobar/dir_A/file3
    create sample directory /tmp/foobar/dir_B
      mtime: 05.01.2016  15:35:15  file: /tmp/foobar/dir_B/file1
      mtime: 05.01.2016  15:36:15  file: /tmp/foobar/dir_B/file2
      mtime: 05.01.2016  15:37:15  file: /tmp/foobar/dir_B/file3
    create sample directory /tmp/foobar/dir_C
      mtime: 05.01.2016  15:35:15  file: /tmp/foobar/dir_C/file1
      mtime: 05.01.2016  15:36:15  file: /tmp/foobar/dir_C/file2
      mtime: 05.01.2016  15:37:15  file: /tmp/foobar/dir_C/file3
    
    list the most recent file per directory
      mtime: 05.01.2016  15:37:15  file: /tmp/foobar/dir_A/file3
      mtime: 05.01.2016  15:37:15  file: /tmp/foobar/dir_B/file3
      mtime: 05.01.2016  15:37:15  file: /tmp/foobar/dir_C/file3

    update Zu finden, die neuesten Dateien per direkten Unterverzeichnis von einem bestimmten Stamm die unten snippet wird die Arbeit zu tun.

    Davon ausgehen, eine directory-Struktur wie

    /tmp/foobar
    /tmp/foobar/dir_A
    /tmp/foobar/dir_A/sub_A
    /tmp/foobar/dir_B
    /tmp/foobar/dir_B/sub_B
    /tmp/foobar/dir_C
    /tmp/foobar/dir_C/sub_C

    und starten Sie mit der root Verzeichnis wie /tmp/foobar der code wird wieder die neueste Datei in /tmp/foobar/dir_A und unten, in /tmp/foobar/dir_B und unten …

    System.out.println("list the most recent file per direct subdirectory");
    //find all direct directories below /tmp/foobar
    Files.find(root, 1, (path, attrs) -> attrs.isDirectory())
            //filter out the root itself
            .filter(p -> !p.equals(root))
            .forEach((dir) -> {
                try {
                    //find all contained files in any subdirectory
                    Optional<Path> recentFile = Files.find(dir, Integer.MAX_VALUE, 
                                (path, attrs) -> attrs.isRegularFile())
                            //return the file with the recent last
                            //modification time
                            .max((p1, p2)
                                    -> Long.compare(p1.toFile().lastModified(),
                                       p2.toFile().lastModified()));
                    //if a file was found
                    if (recentFile.isPresent()) {
                        //print modification time and file name
                        printFileInfo(recentFile.get().toFile());
                    }
                } catch (IOException ex) {
                    ex.printStackTrace(System.err);
                }
            });

    Ausgabe

    mtime: 08.01.2016  13:10:57  file: r:\temp\foobar\dir_A\sub_A\file1
    mtime: 08.01.2016  13:11:39  file: r:\temp\foobar\dir_B\sub_B\file3
    mtime: 08.01.2016  13:11:19  file: r:\temp\foobar\dir_C\file1

    Bearbeiten Folgende snippet funktioniert auch mit Java 6.

    File root = new File("/tmp/foobar");
    File[] topDirectories = root.listFiles(new FileFilter() {
        @Override
        public boolean accept(File file) {
            return file.isDirectory();
        }
    });
    System.out.println("topDirectories = " + Arrays.toString(topDirectories));
    for (File directory : topDirectories) {
        File recentFile = new File("");
        recentFile.setLastModified(0L);
        recentFile = getRecentFile(directory, recentFile);
        System.out.println("recentFile = " + recentFile);
    }

    .

    //if you have a huge amount of files in deeply nested directories
    //this might need some further tuning
    static File getRecentFile(File dir, File baseFile) {
        File recentFile = baseFile;
        for (File file : dir.listFiles()) {
            if (file.isDirectory()) {
                recentFile = getRecentFile(file, recentFile);
            } else {
                if (file.lastModified() > recentFile.lastModified())  {
                    recentFile = file;
                }
            }
        }
        return recentFile;
    }
    • Hey, SubOptimal ist die Antwort, die du gepostet hast macht genau das, was ich will, aber in deinem Fall, erstellen Sie Dateien und Verzeichnisse. Ich will, wenn Dateien und Verzeichnisse, die bereits im Pfad, dann, wie zu finden neueste Datei. Ich bin neu in der Programmierung
    • Die Path root = Paths.get("/tmp/foobar") definiert das top-Verzeichnis, unter dem code finden sich alle neuesten Dateien im unter-Verzeichnis-Struktur. Die Dateien und Verzeichnisse, in denen nur erstellt für Demo-Zwecke, um eine eigenständige ausführbare Beispiel. Der code, der tatsächlich die Suche unterhalb der Linie System.out.println("list the most recent file per directory");
    • Ich habe es, sir, eigentlich ist das problem wenn es irgendein Unterverzeichnis in das Verzeichnis, dann sollte es wieder die neueste Datei vergleichen von Verzeichnis und Unterverzeichnis, aber in diesem Fall ist es die Rückkehr sowohl aus Verzeichnis und Unterverzeichnis.
    • Können Sie fügen Sie bitte einen Beispiel-Verzeichnisbaum mit einigen dummy-Dateinamen, die in Ihrer Frage. Ich habe nicht bekommen, was Sie wollen. Ich verstehe deine ursprüngliche Frage, die Sie nicht möchten, dass die neueste Datei der ganze Baum, sondern für jede Verzeichnis-Ebene.
    • zum Beispiel gibt es einen Pfad /tmp/test und in diesem Pfad gibt es drei Ordner ‚a‘, ‚b‘, ‚c‘. Jetzt in der ‚a‘ – Ordner gibt es 2 Dateien sind a1.txt & a2.txt und innen ‚a‘ – Ordner gibt es Unterordner “ abc “ und in diesem Ordner gibt es 2 Dateien t1.txt & t2.txt. Nun, wenn wir in /tmp/test/ein er liefert die Letzte Datei wie a2.txt und wenn wir in /tmp/test/a/abc es gibt t2.txt. Als, ‚abc‘ Unterordner ‚a‘, so sollte es wieder nur die Letzte Datei, die wie aus all diesen Dateien a1.txt,a2.txt,t1.txt,t2.txt. Hoffe du hast das verstanden
    • Sie wollen das neuste von allen Dateien, die unterhalb /tmp/test oder das neueste unter jedem direkten Unterverzeichnis von /tmp/test? z.B. das neueste unten /tmp/test/a in jedem Unterverzeichnis?
    • ja, die neueste unterhalb von /tmp/test/ein
    • Werfen Sie einen Blick in die Beispiel Hinzugefügt.
    • Vielen Dank es hat funktioniert.
    • Hey wollt nur mal Fragen, warum wir verwendet haben, Weg Klasse statt File-Klasse. Ist diese Sache, die erreicht werden kann, mit Datei-Konzept?
    • Hängt davon ab, was du meinst. In dem gegebenen Beispiel Path kann nicht einfach ersetzt durch File als Files.find(..) erwarten Path. Wenn du meinst Traversierung durch das Verzeichnis mit File.listFiles() ja, das ist möglich. Aber dann haben Sie zu halten das traversal durch den directory-Baum selbst.
    • Eigentlich in unsere Produktions-server wir sind mit dem jdk 1.6 und Pfad unterstützt im jdk 1.7,so müssen-code beachten Sie die server-Konfiguration, wenn Sie zeigen können, ein dummy-Beispiel mit Datei wäre eine große Hilfe
    • Werfen Sie einen Blick in das snippet Hinzugefügt. Überprüft wurde mit der gleichen Struktur wie das erste Beispiel.
    • Es funktionierte, vielen Dank.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.