2016-01-05 3 views
-7

У меня есть путь abc, на этом пути есть каталоги/подкаталоги и файлы. Теперь, например, если есть каталог «A» & «B», в котором есть некоторые файлы, и есть подкаталог, в котором находятся файлы. То же самое в каталоге «B». Теперь Output должен быть из каталога «A», мы должны получить последний модифицированный файл и тот же в каталоге «B».Получить последний каталог файлов wise в java

Я сделал это много.

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

     } 

    } 

} 

вывод - я получаю только последний модифицированный файл из всех справочников и подкаталогов. я хочу, например, вывод, как если бы я находился в директории «А», чем сначала должен проверить, что у него есть подкаталог или файлы, а затем должен получить от него последний измененный файл перед тем, как перейти в другой каталог.

+1

Вы попробовали что-нибудь со своей стороны, чтобы сделать это? – YoungHobbit

+0

Да, я пробовал. Мне удалось получить все файлы из списка каталогов, но мне нужно перечислить каталог файлов и получить последний модифицированный файл согласно директории wise –

+0

Опубликовать все, что вы сделали до сих пор. Вход, ток и ожидаемый выход. Это помогает каждому понять эту проблему. – Ambrish

ответ

1

Найдите ниже небольшой фрагмент, который делает то, что вы хотите достичь.

Для демонстрационной цели он также создает некоторые примеры каталогов и файлов.

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

выход как

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 

обновление Чтобы найти самые новые файлы за прямой подкаталоге данного корня ниже фрагмент кода будет делать работу.

Предположим, структуру каталогов, как

/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 

и вы начинаете с root каталога, как /tmp/foobar код будет возвращать новейший файл в /tmp/foobar/dir_A и ниже, в /tmp/foobar/dir_B и ниже ...

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

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 

редактировать После сниппет также работает с 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; 
} 
+0

Эй, SubOptimal ответ, который вы опубликовали, делает именно то, что я хочу, но в вашем случае вы создаете файлы и каталог. Я хочу, чтобы файлы и каталог уже находились в пути, а затем, как найти последний файл. Я новичок в программировании –

+0

@AnshSethi 'Path root = Paths.get ("/tmp/foobar ")' определяет верхний каталог под кодом, который найдет все новейшие файлы в приведенной ниже структуре каталога. Файлы и каталоги, созданные только для демонстрационной цели, имеют пример автономного запуска. Код, который фактически выполняет поиск, находится ниже строки 'System.out.println («перечислить самый последний файл в каталоге»); ' – SubOptimal

+0

Что я получил, сэр, на самом деле проблема в том, что есть какой-либо подкаталог внутри каталога, тогда он должен возвращать последний файл, сравниваемый с каталогом и подкаталогом, но в этом случае он возвращается из каталога и подкаталога. –

Смежные вопросы