ABC 디렉토리 내의 모든 파일을 삭제하고 싶습니다.
내가 시도 FileUtils.deleteDirectory(new File("C:/test/ABC/"));
하면 폴더 ABC도 삭제됩니다.
디렉토리 내부의 파일을 삭제할 수 있지만 디렉토리는 아닌 하나의 라이너 솔루션이 있습니까?
답변
import org.apache.commons.io.FileUtils;
FileUtils.cleanDirectory(directory);
동일한 파일에서이 방법을 사용할 수 있습니다. 또한 하위 폴더와 파일 아래의 모든 하위 폴더를 재귀 적으로 삭제합니다.
답변
당신은 좋아합니까?
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을 발생 시킨다는 것입니다.
가능한 한 더 간결한 솔루션을 만들려고했습니다.