2017-03-28 67 views
1

我有一個包含一堆子目錄的目錄,每個子目錄都包含幾個文本文件。每個子目錄都包含一個文本文件,它與包含它的子目錄共享相同的名稱;我想將此文件的內容添加到所有其他文本文件,除了與子目錄共享名稱的文件,並且我想用java編寫它。例如,給定包含子文件「b」,「c」,「d」,分別包含文件「b」,「e」,「f」和「c」,「g」的子目錄「a」 ,「h」和「d」,「i」,「j」,我想要有包含子文件「b」,「c」,「d」的dir分別包含文件「b」,「b + e「,」b + f「和」c「,」c + g「,」c + h「和」d「,」d + i「,」d + j「那就是文件「a」,「b」,「c」。將文本添加到條件目錄中的多個文件(Java)

final File folder = new File("/path-of-directory/"); 

public static void listFilesForFolder(final File folder) { 
    for (final File fileEntry : folder.listFiles()) { 
     if (fileEntry.isDirectory()) { 
      listFilesForFolder(fileEntry); 
     } else if (fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(".")).toLowerCase().equals(folder.getName().toLowerCase())) 

       // found the file wich content has to be added to other files in the same directory. How to? 
     } 
} 
+1

首先,你將不得不嘗試寫一些代碼,然後與我們分享,如果你遇到的具體問題。 – aUserHimself

+0

final File folder = new File(「/ path-of-directory /」); 公共靜態無效listFilesForFolder(最終文件夾){ 的(最後文件FileEntry的:folder.listFiles()){ 如果(fileEntry.isDirectory()){ listFilesForFolder(FileEntry的); (0),fileEntry.getName()。lastIndexOf(「。」))。toLowerCase()。equals(folder.getName()。toLowerCase())) //發現文件內容必須是addes到同一目錄中的其他文件。如何? } } – Kyle

+0

請編輯您的答案以更新它與任何額外的信息(如上面的代碼),不要忘記格式化它。 – aUserHimself

回答

0

該解決方案的工作對我蠻好,請務必閱讀評論的細節:

public class FileCopy { 

    public static void recursivelyCopyContent(final File folder) { 
     for (final File fileEntry : folder.listFiles()) { 
      if (fileEntry.isDirectory()) { 
       recursivelyCopyContent(fileEntry); 
      } else if (fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(".")).toLowerCase().equals(folder.getName().toLowerCase())) { 
       // just pass the folder and the file to the method that will do the actual content copy 
       copyContent(folder, fileEntry); 
      } 
     } 
    } 

    public static void copyContent(final File folder, final File fileName) { 
     try { 
      // get the byte[] content of the source file 
      byte[] fileContent = Files.readAllBytes(fileName.toPath()); 
      for (final File fileEntry : folder.listFiles()) { 
       // only select files with a different absolute path than the source one 
       if(fileEntry.isFile() && !fileEntry.getAbsolutePath().equals(fileName.getAbsolutePath())) { 
        // append contents from source to destination file 
        Files.write(fileEntry.toPath(), fileContent, StandardOpenOption.APPEND); 
       } 
      } 
     }catch (IOException e) { 
      e.getStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     final File folder = new File("/path-of-directory/"); 
     FileCopy.recursivelyCopyContent(folder); 
    } 
} 

只是要注意文件不帶擴展名:你的病情

fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(".")).toLowerCase().equals(folder.getName().toLowerCase()) 

將拋出java.lang.StringIndexOutOfBoundsException因爲在他們的名字中不存在.字符。

在這種情況下,我建議採取下列措施:

// both cases covered: files have or do not have an extension 
if (
    (!fileEntry.getName().contains(".") && fileEntry.getName().toLowerCase().equals(folder.getName().toLowerCase())) || 
    (fileEntry.getName().contains(".") && fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf(".")).toLowerCase().equals(folder.getName().toLowerCase())) 
) 
+0

你的解決方案工作得很好,除了對「listFilesForFolder」的調用,這是舊的方法名稱。用遞歸替換CopyPtent並更改簽名對我來說也適用。 – Kyle

+0

我只是試圖給它增加一個更具啓發性的名字。如果你願意,你可以自由改變它,這不是一個問題。 – aUserHimself

+0

我的意思是在你的解決方案的第五行調用listFilesForFolder(fileEntry),這應該是遞歸的複製內容(fileEntry),因爲遞歸方法的名稱不再是「listFilesForFolder」。 – Kyle

相關問題