2017-03-28 8 views
1

각각 하나의 디렉토리에 여러 개의 텍스트 파일이 들어있는 하위 디렉토리가 있습니다. 각각의 하위 디렉토리에는 하위 디렉토리와 동일한 이름을 가진 텍스트 파일이 들어 있습니다. 하위 디렉토리와 이름을 공유하는 파일을 제외하고이 파일의 내용을 다른 모든 텍스트 파일에 추가하려고합니다.이 파일을 java로 만들고 싶습니다.조건이있는 디렉토리의 여러 파일에 텍스트 추가 (Java)

예를 들어 파일 "b", "e", "f"및 "c"를 포함하는 하위 디렉토리 "b", "c" , "h"및 "d", "i", "j"를 포함하는 하위 디렉토리 "b", "c", "d" c + h, c + h, d, d + i, d + j 등의 파일을 삭제하고, 파일 "a", "b", "c"입니다.

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

발생합니다 당신의 상태 :

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

그냥 확장자가없는 파일에주의 :

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

최종 파일 폴더 = 새 파일 ("/ path-of-directory /"); 공공 정적 무효 listFilesForFolder (최종 파일 폴더) {에 대한 (최종 파일 fileEntry : folder.listFiles()) { (fileEntry.isDirectory()) { listFilesForFolder (fileEntry)의 경우; } else if (fileEntry.getName(). substring (0, fileEntry.getName(). lastIndexOf (".")). // 내용이 동일한 디렉토리의 다른 파일에 추가되어야하는 파일을 찾았습니다. 어떻게? } } – Kyle

+0

답을 수정하여 위의 코드와 같은 추가 정보로 업데이트하고 형식을 지정하는 것을 잊지 마십시오. – aUserHimself

답변

0

이 솔루션은 세부 사항에 대한 의견을 읽고 있는지 확인 나를 위해 잘 작동 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"에 대한 호출을 제외하고는 정상적으로 작동합니다. recursivelyCopyContent로 바꾸고 서명을 변경하면 나에게도 잘 작동합니다. – Kyle

+0

방금 ​​더 암시적인 이름을 추가하려고했습니다. 원하면 다시 변경할 수 있습니다. 문제는 아닙니다. – aUserHimself

+0

재귀 메서드의 이름이 더 이상 "listFilesForFolder"가 아니기 때문에 listFilesForFolder (fileEntry)라는 호출을 솔루션의 다섯 번째 행에 추가해야했습니다. recursivelyCopyContent (fileEntry) 여야합니다. – Kyle