[java] 하나의 라이너 솔루션-디렉토리가 아닌 디렉토리의 모든 파일 삭제

ABC 디렉토리 내의 모든 파일을 삭제하고 싶습니다.

내가 시도 FileUtils.deleteDirectory(new File("C:/test/ABC/"));하면 폴더 ABC도 삭제됩니다.

디렉토리 내부의 파일을 삭제할 수 있지만 디렉토리는 아닌 하나의 라이너 솔루션이 있습니까?



답변

import org.apache.commons.io.FileUtils;

FileUtils.cleanDirectory(directory); 

동일한 파일에서이 방법을 사용할 수 있습니다. 또한 하위 폴더와 파일 아래의 모든 하위 폴더를 재귀 적으로 삭제합니다.

문서 : org.apache.commons.io.FileUtils.cleanDirectory


답변

당신은 좋아합니까?

for(File file: dir.listFiles())
    if (!file.isDirectory())
        file.delete();

디렉토리가 아닌 파일 만 삭제합니다.


답변

Peter Lawrey의 답변은 간단하고 특별한 것에 의존하지 않기 때문에 훌륭합니다. 하위 디렉토리와 그 내용도 제거하는 것이 필요한 경우 재귀를 사용하십시오.

void purgeDirectory(File dir) {
    for (File file: dir.listFiles()) {
        if (file.isDirectory())
            purgeDirectory(file);
        file.delete();
    }
}

하위 디렉토리와 그 내용 (질문의 일부)을 아끼려면 다음과 같이 수정하십시오.

void purgeDirectoryButKeepSubDirectories(File dir) {
    for (File file: dir.listFiles()) {
        if (!file.isDirectory())
            file.delete();
    }
}

또는 한 줄 솔루션을 원했기 때문에 :

for (File file: dir.listFiles())
    if (!file.isDirectory())
        file.delete();

그런 사소한 작업을 위해 외부 라이브러리를 사용하는 것은 어쨌든이 라이브러리가 필요하지 않은 한 좋은 아이디어가 아닙니다.이 경우 기존 코드를 사용하는 것이 좋습니다. 어쨌든 Apache 라이브러리를 사용하고있는 것처럼 보이므로 그 FileUtils.cleanDirectory()방법을 사용하십시오 .


답변

자바 8 스트림

이렇게하면 ABC 에서 파일 만 삭제됩니다 (하위 디렉토리는 변경되지 않음).

Arrays.stream(new File("C:/test/ABC/").listFiles()).forEach(File::delete);

이렇게하면 ABC (및 하위 디렉토리) 에서 파일 만 삭제됩니다 .

Files.walk(Paths.get("C:/test/ABC/"))
                .filter(Files::isRegularFile)
                .map(Path::toFile)
                .forEach(File::delete);

^이 버전은 IOException 처리가 필요합니다


답변

또는 Java 8에서 이것을 사용하려면 :

try {
  Files.newDirectoryStream( directory ).forEach( file -> {
    try { Files.delete( file ); }
    catch ( IOException e ) { throw new UncheckedIOException(e); }
  } );
}
catch ( IOException e ) {
  e.printStackTrace();
}

예외 처리가 너무 부피가 큰 것은 유감입니다. 그렇지 않으면 하나의 라이너가됩니다 …


답변

public class DeleteFile {
    public static void main(String[] args) {
        String path="D:\test";
        File file = new File(path);
        File[] files = file.listFiles();
        for (File f:files)
        {if (f.isFile() && f.exists)
            { f.delete();
system.out.println("successfully deleted");
            }else{
system.out.println("cant delete a file due to open or error");
} }  }}


답변

폴더 자체가 아닌 폴더의 모든 내용, 하위 디렉토리 포함을 삭제하는 또 다른 Java 8 스트림 솔루션.

용법:

Path folder = Paths.get("/tmp/folder");
CleanFolder.clean(folder);

그리고 코드 :

public interface CleanFolder {
    static void clean(Path folder) throws IOException {

        Function<Path, Stream<Path>> walk = p -> {
            try { return Files.walk(p);
        } catch (IOException e) {
            return Stream.empty();
        }};

        Consumer<Path> delete = p -> {
            try {
                Files.delete(p);
            } catch (IOException e) {
            }
        };

        Files.list(folder)
            .flatMap(walk)
            .sorted(Comparator.reverseOrder())
            .forEach(delete);
    }
}

Files.walk 또는 Files.delete와 관련된 모든 스트림 솔루션의 문제점은 이러한 메소드가 스트림에서 처리하기 어려운 IOException을 발생 시킨다는 것입니다.

가능한 한 더 간결한 솔루션을 만들려고했습니다.