2013-02-23 5 views
1

스택 오버플로 오류, 이것은 여기에서 찾을 수 있습니다 다음 목적의 솔루션재귀 삭제의 원인이 내가 디렉토리에 폴더에서 모든 파일을 삭제하고 폴더를 유지하는 방법에 대한 질문을

How to delete files of a directory but not the folders

하나 재귀를 사용하여,이를 달성하기 위해했다 : 나는 스택 오버플로 오류를 얻을 때까지 그냥 호출의 : Deletefiles의 전체 콘솔을 얻을 그러나

public void DeleteFiles() { 
    File file = 
     new File(
      "D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/"+ 
      "resources/pdf/"); 
    System.out.println("Called deleteFiles"); 
    if (file.isDirectory()) { 
     for (File f : file.listFiles()) { 
      DeleteFiles(); 
     } 
    } else { 
     file.delete(); 
    } 
} 

, 파일을 찾아 삭제하는 디렉토리를 통해 이동하지 않는 것 , 어떻게 이걸 얻을 수 있을까요?

+2

귀하의 재귀 분명히 잘못된 것입니다, 당신은 몇 가지 종이를 가지고 로직을 작성해야, 그게 당신에게 –

+0

도움이 될 재귀를 사용했던 그 질문에는 인수가있었습니다. http://stackoverflow.com/questions/15041971/how-to-delete-files-of-a-directory-but-not-the-folders-java#answer-15042022 –

답변

2
File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/"); 

동일한 파일을 계속해서 만들고 있습니다. 함수 밖에 파일을 선언하십시오.

재귀가 제안 된 것과 다릅니다. 훨씬 간단 솔루션이있는 경우

public void DeleteFiles(File file) { 
    System.out.println("Called deleteFiles"); 
    if (file.isDirectory()) { 
     for (File f : file.listFiles()) { 
      DeleteFiles(f); 
     } 
    } else { 
     file.delete(); 
    } 
} 
2
public void DeleteFiles() { 
    File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/"); 
    System.out.println("Called deleteFiles"); 
    DeleteFiles(file); 
} 

public void DeleteFiles(File file) { 
    if (file.isDirectory()) { 
     for (File f : file.listFiles()) { 
      DeleteFiles(f); 
     } 
    } else { 
     file.delete(); 
    } 
} 
4

재귀 문제가 요구된다. commons-io로 :

import java.io.File; 
import org.apache.commons.io.FileUtils; 
import static org.apache.commons.io.filefilter.TrueFileFilter.TRUE; 

File root = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/"); 
Iterator<File> files = FileUtils.iterateFiles(root, TRUE, TRUE); 
for (File file : files) { 
    file.delete(); 
} 

또는 JDK 7과 : 당신이 원래의 대답을 보면

import java.nio.file.*; 
import java.nio.file.attribute.BasicFileAttributes; 

Path root = Paths.get("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/"); 
Files.walkFileTree(root, new SimpleFileVisitor<Path>() { 
    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
      throws IOException { 
     file.delete(); 
     return FileVisitResult.CONTINUE; 
    } 
}) 
+0

재귀 대부분의 경우 가장 간단한 구현 방법입니다. 귀하의 접근 방식은 외부 라이브러리를 포함해야하며 재귀를 사용합니다 – Trinimon

+0

@Andre : 1) JDK7은 외부 라이브러리가 아닙니다. 2) 대다수의 Java 개발에서 위와 같이 코드에서 복잡성을 제거하기 때문에 특정 작업을 수행하기위한 라이브러리를 추가하는 것이 문제를 정확하게 해결하는 선호되는 방법입니다. 3) 위의 코드 중 어느 것도 재귀 적입니다.이 코드는 구현이 안정적인 라이브러리에 의해 제공되므로 더 간단합니다. 구현에 신경 쓸 필요가 없습니다. –

+0

죄송합니다. 1. _org.apache.commons_은 확실히 외부 라이브러리입니다 (ORACLE JDK1.7 API http://docs.oracle.com/javase/7/docs/api/ 참조). 2. 전혀 유효하지 않습니다. (예 : Android, J2ME), 라이센스 문제 또는 사용자 정의가 필요한 경우 3. org.apache.commons.io.FileUtils _does_ recursion 사용 (http : // grepcode의 iterateFiles/listFiles/innerListFiles 참조) .com/file/repo1.maven.org/maven2/commons-io/commons-io/1.4/org/apache/commons/io/FileUtils.java # FileUtils. % 3Cinit % 3E % 28 % 29 – Trinimon

관련 문제