Program Tip

Java에서 디렉토리가 비어 있는지 확인하는 방법

programtip 2021. 1. 10. 19:31
반응형

Java에서 디렉토리가 비어 있는지 확인하는 방법


Java에서 디렉토리가 비어 있는지 확인하고 싶습니다. 그러나 그 디렉토리에 많은 파일이있을 가능성이 있으므로 가능하면 파일 목록을 쿼리하지 않고 수행하고 싶습니다.


JDK7을 사용하면 Files.newDirectoryStream을 사용하여 디렉토리를 연 다음 반복자의 hasNext () 메서드를 사용하여 반복기에 대한 파일이 있는지 테스트 할 수 있습니다 (스트림을 닫는 것을 잊지 마십시오). 이것은 java.io.File 목록 메소드와 비교할 때 거대한 디렉토리 또는 디렉토리가 원격 파일 시스템에있는 경우 더 잘 작동합니다.

예:

private static boolean isDirEmpty(final Path directory) throws IOException {
    try(DirectoryStream<Path> dirStream = Files.newDirectoryStream(directory)) {
        return !dirStream.iterator().hasNext();
    }
}

File parentDir =  file.getParentFile();
if(parentDir.isDirectory() && parentDir.list().length == 0) {
    LOGGER.info("Directory is empty");
} else {
    LOGGER.info("Directory is not empty");
}

에서 고려 소스 코드 , 방법을 수행합니다java.io.File list()

    public java.lang.String[] list() {
    ...
        byte[][] implList = listImpl(bs);
        if (implList == null) {
           // empty list
           return new String[0];
        }     
     ...
     }

     private synchronized static native byte[][] listImpl(byte[] path);

바이트 배열을 전달하는 네이티브 메서드를 호출하여 파일을 가져옵니다. 메소드가 리턴 null하면 디렉토리가 비어 있음을 의미합니다.

, 파일을 나열하지 않고 디렉토리가 비어 있는지 확인하는 기본 메서드도 없기 때문에 디렉토리가 비어 있는지 확인하기 위해 Java에서 구현할 방법이 없습니다.

결과 : 파일을 나열하지 않고 디렉토리가 비어 있는지 확인하는 것은 아직 Java에서 구현되지 않았습니다.


if(!Files.list(Paths.get(directory)).findAny().isPresent()){
    Files.delete(Paths.get(directory));
 }

Files.list로 느리게 채워진 스트림을 반환하면 실행 시간 관련 문제가 해결됩니다.


이것은 더러운 해결 방법이지만 ( delete메소드를 사용하여 ) 삭제를 시도 할 수 있으며 삭제 작업이 실패하면 디렉토리가 비어 있지 않고 성공하면 비어 있습니다 (하지만 다시 만들어야합니다). , 그리고 그것은 깔끔하지 않습니다). 더 나은 솔루션을 계속해서 찾을 것입니다.

편집 : java.nio.file.Files 클래스에서 walkFileTree를 찾았습니다 : http://download.java.net/jdk7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file .Path , java.nio.file.FileVisitor) 문제는 이것이 Java 7 전용이라는 것입니다.

나는이 문제와 관련된 다른 질문들 (큰 배열에 메모리를 할당하는 list ()를 사용하지 않고 디렉토리에 파일을 나열)과 관련된 다른 질문을 찾았으며 대답은 항상 "JNI를 사용하지 않는 한 할 수 없습니다. ", 이는 플랫폼에 따라 다르며 추악합니다.


플랫폼 종속 코드를 사용할 수 있다면 시스템 라이브러리를로드하고 해당 API를 사용하여 실제 네이티브 코드를 사용해 볼 수 있습니다.

In Windows for example you have a Win32 API named FindFirstFile() with the directory name (without a trailing backslash). If it returns something other than . and .. you know the directory isn't empty. It will not list all the files so it's much faster than file.list().

The equivalent on Unix is opendir. For your purposes the logic would be the same.

Of course - calling native methods has a price on usability and the initial library loading which should be negated by the time it will save on the FS queries.


     Path checkIfEmpty=Paths.get("Pathtofile");
     DirectoryStream<Path> ds = Files.newDirectoryStream(checkIfEmpty);
     Iterator files = ds.iterator();
     if(!files.hasNext())
         Files.deleteIfExists(Paths.get(checkIfEmpty.toString()));

I also had this Confusion for a Long time about how to check if the Directory was empty or not But the Answer is Quite Simple use

class isFileEmpty{
public static void main(String args[]){
File d = new File(//Path of the Directory you want to check or open);
String path = d.getAbsolutePath().toString();
File dir = new File(path);
File[] files = dir.listFiles();
if(!dir.exists()){
System.out.Println("Directory is Empty");
}
else{
for(int i =0;i<files.length;i++){
System.out.Println(files[i])
           }
       }
   }
}

I want to add to answer of Developer. Checking is it directory or not should not be in one If operator, because you will have mistake in logic. First of all you checking is it directory or not, and only after that you checking directory consistensy, becouse you will get wrong answer if the tranfered to method directory is not exist. Just check it. Should be like this:

if (file.isDirectory()) {
    if( file.list().length == 0) {
        logger.info("Directory is empty");
        return false;
    } else {
        logger.info("Directory is not empty");
        return true;
    }
} else {
    return false;
}

ReferenceURL : https://stackoverflow.com/questions/5930087/how-to-check-if-a-directory-is-empty-in-java

반응형