簡體   English   中英

Java-在文件系統中移動文件

[英]Java - Moving files within filesystem

我正在做學校作業,我們正在做一個簡單的filemanager,它將所有帶后綴"jpg"文件(例如)移到另一個文件夾中。 問題是我們應該對所有文件夾進行遞歸操作。

示例:您在文件夾“下載”中:

--downloads
----me.jpg
----smth.doc
----folder1
------you.jpg

現在,您必須將所有.jpg文件移動到文件夾“照片”中,並在其中創建“ folder1”,同時還要移動文件“ you.jpg”

這就是我所擁有的,但似乎只能從“下載文件夾”中移動文件

private void move(String suffix, String sourcePath, String destination) throws IOException{
    File dir = new File(sourcePath);
    File destDir = new File(destination);
    String src;
    String dst;

    for (File f : dir.listFiles(new ExtensionFilter(suffix))){
        String name = f.getName();
        src = f.getAbsolutePath();
        dst = destination + "\\" + name;
        Files.createDirectories(Paths.get(destination));
        Files.move(Paths.get(src), Paths.get(dst));
        logs.add("MV;" + src + ";" + dst);
    }

    for (File f : dir.listFiles(new DirectoryFilter())){
        move(suffix, f.getPath(), destination + "\\" + f.getName());    
    }
}

日志只是ArrayList來保存已移動文件的日志

嘗試從Apache Commons IO使用FileUtils 那是最簡單的方法。

結合使用Java NIO.2 API和Java 8,可能會容易得多

Java 8引入了Files.walk(path)方法,該方法Files.walk(path)返回給定路徑下所有路徑的Stream:

通過遍歷以給定起始文件為根的文件樹,返回用Path懶散填充的Stream

建議的解決方案如下:

private void move(String suffix, Path source, Path destination) throws IOException {
    Files.createDirectories(destination);
    Files.walk(source)
         .filter(p -> p.toString().endsWith(suffix))
         .forEach(p -> {
             Path dest = destination.resolve(source.relativize(p));
             try {
                 Files.createDirectories(dest.getParent());
                 Files.move(p, dest);
             } catch (IOException e) {
                 throw new UncheckedIOException(e);
             }
         });
}

此代碼創建目標路徑。 然后,它從源路徑開始走,並僅過濾以給定后綴結尾的路徑。 最后,對於每個人:

  • source.relativize(p)返回從源到該路徑的相對路徑。

    例如,在UNIX上,如果此路徑為“ / a / b”並且給定路徑為“ / a / b / c / d”,則所得的相對路徑將為“ c / d”。

    這樣,這將返回路徑在源下的部分,以便我們可以將其復制到目標路徑中。

  • destination.resolve(other)返回通過將此路徑附加到其他路徑而構建的路徑:

    在最簡單的情況下,在這種情況下,此方法將給定路徑連接到該路徑,並返回以給定路徑結尾的結果路徑。

  • 因此,現在,我們有效地擁有了完整的目標路徑。 我們首先需要使用Files.createDirectories(dir)創建父目錄。 dest.getParent()返回父路徑,也就是說,它將路徑中的文件名刪除。 最后一步是使用Files.move(source, target)將源路徑移動到目標路徑。

如果您還不能升級到Java 8並繼續使用Java 7,則仍然可以使用Files.walkFileTree而不是Files.walk (其余代碼需要進行調整,但是想法是相同的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM