디렉토리의 모든 파일 삭제(디렉토리 제외) - 1개의 라이너 솔루션
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();
이렇게 하면 디렉토리가 아닌 파일만 삭제됩니다.
피터 로레이의 대답은 훌륭합니다. 왜냐하면 그것은 간단하고 특별한 것에 의존하지 않기 때문입니다. 그리고 그것은 여러분이 해야 할 방법입니다.서브 디렉토리와 그 컨텐츠도 삭제할 필요가 있는 경우는, 다음과 같이 재귀합니다.
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 라이브러리를 사용하고 있는 것 같으므로 Apache 라이브러리를 사용하십시오.FileUtils.cleanDirectory()
방법.
Java 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");
} } }}
rm -rf
보다 훨씬 퍼포먼스가 뛰어났다FileUtils.cleanDirectory
.
단일 솔루션이 아닌 광범위한 벤치마킹 결과rm -rf
를 사용하는 것보다 몇 배나 빠릅니다.FileUtils.cleanDirectory
.
물론, 작은 디렉토리나 단순한 디렉토리의 경우는 문제가 되지 않습니다만, 이 경우, 몇 기가바이트의 깊이 중첩된 서브 디렉토리는 10분 이상 걸립니다.FileUtils.cleanDirectory
1분 동안만rm -rf
.
이를 위한 Java의 대략적인 구현은 다음과 같습니다.
// Delete directory given and all subdirectories and files (i.e. recursively).
//
static public boolean clearDirectory( File file ) throws IOException, InterruptedException {
if ( file.exists() ) {
String deleteCommand = "rm -rf " + file.getAbsolutePath();
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec( deleteCommand );
process.waitFor();
file.mkdirs(); // Since we only want to clear the directory and not delete it, we need to re-create the directory.
return true;
}
return false;
}
큰 디렉토리나 복잡한 디렉토리를 취급하는 경우는, 시도해 볼 가치가 있습니다.
하위 디렉토리가 포함되지만 폴더 자체는 삭제하지 않는 다른 Java 8 Stream 솔루션.
사용방법:
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);
}
}
파일과 관련된 모든 스트림 솔루션의 문제.walk 또는 Files.delete는 이러한 메서드가 IOException을 발생시키는 것으로 스트림에서 처리하기가 어렵습니다.
나는 가능한 한 간결한 해결책을 만들려고 했다.
디렉토리에서 모든 파일을 삭제하려면 "C:\예"
File file = new File("C:\\Example");
String[] myFiles;
if (file.isDirectory()) {
myFiles = file.list();
for (int i = 0; i < myFiles.length; i++) {
File myFile = new File(file, myFiles[i]);
myFile.delete();
}
}
(이전 답변에 따르면) 이 방법이 효과가 있을 것 같습니다.
Files.walk(Paths.get("C:/test/ABC/"))
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.filter(item -> !item.getPath().equals("C:/test/ABC/"))
.forEach(File::delete);
건배!
package com;
import java.io.File;
public class Delete {
public static void main(String[] args) {
String files;
File file = new File("D:\\del\\yc\\gh");
File[] listOfFiles = file.listFiles();
for (int i = 0; i < listOfFiles.length; i++)
{
if (listOfFiles[i].isFile())
{
files = listOfFiles[i].getName();
System.out.println(files);
if(!files.equalsIgnoreCase("Scan.pdf"))
{
boolean issuccess=new File(listOfFiles[i].toString()).delete();
System.err.println("Deletion Success "+issuccess);
}
}
}
}
}
모든 파일을 삭제하려면
if(!files.equalsIgnoreCase("Scan.pdf"))
효과가 있을 거라고요
언급URL : https://stackoverflow.com/questions/13195797/delete-all-files-in-directory-but-not-directory-one-liner-solution
'source' 카테고리의 다른 글
VueJS 오류: 프로펠을 직접 변환하지 마십시오. (0) | 2022.08.21 |
---|---|
부호 있는 문자에서 부호 없는 문자로 변환하고 다시 돌아오시겠습니까? (0) | 2022.08.21 |
상위 컴포넌트에서 Vue.js 기능 컴포넌트에 클래스를 적용하는 방법 (0) | 2022.08.21 |
어떤 경우에 JPA @JoinTable 주석을 사용합니까? (0) | 2022.08.21 |
Vuex v-model을 개체 상태 필드로 (0) | 2022.08.21 |