2016-01-05 45 views
-7

我有一個路徑abc,在該路徑中有目錄/子目錄和文件。現在,例如,如果有一個目錄'A'&'B',其中有一些文件,並且有文件存在的子目錄。 'B'目錄中相同。現在輸出應該來自'A'目錄,我們應該得到最後修改的文件,並在'B'目錄中得到相同的結果。在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()); 
      } 

     } 

    } 

} 

輸出 - 我只是從所有的目錄和子目錄獲取最後修改的文件。我想輸出,如果我在「A」目錄中比它應該首先檢查它有子目錄或文件在它應該得到最後修改後的文件,然後再遍歷到其他目錄。

+1

你嘗試過從你身邊做什麼嗎? – YoungHobbit

+0

是的,我已經嘗試過。我已經設法從目錄列表中獲取所有文件,但我必須明智地列出文件目錄並根據目錄明智地獲取最後修改的文件 –

+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

我得到它的先生,其實問題是如果目錄內有任何子目錄,那麼它應該返回最新的文件比較從目錄和子目錄,但在這種情況下,它從目錄和子目錄返回。 –

相關問題