programing

폴더 또는 파일 크기 가져오기

firstcheck 2023. 1. 21. 10:05
반응형

폴더 또는 파일 크기 가져오기

Java에서 폴더 또는 파일 크기를 검색하려면 어떻게 해야 합니까?

java.io.File file = new java.io.File("myfile.txt");
file.length();

이것은 파일의 길이(바이트 단위)를 반환합니다.0파일이 존재하지 않는 경우.폴더 크기를 가져오는 기본 제공 방법은 없습니다. 디렉토리 트리를 재귀적으로 이동해야 합니다.listFiles()디렉토리를 나타내는 파일오브젝트의 메서드) 및 디렉토리 사이즈를 축적합니다.

public static long folderSize(File directory) {
    long length = 0;
    for (File file : directory.listFiles()) {
        if (file.isFile())
            length += file.length();
        else
            length += folderSize(file);
    }
    return length;
}

경고: 이 메서드는 실제 작업에 사용할 수 있을 만큼 강력하지 않습니다. directory.listFiles()돌아올지도 모른다null원인이 되다NullPointerException또한 심볼링크는 고려되지 않으며 다른 장애 모드가 있을 수 있습니다.방법을 사용합니다.

java-7 nio api를 사용하면 폴더 크기를 더 빨리 계산할 수 있습니다.

다음은 강력한 실행 준비 예시로 예외를 발생시키지 않습니다.입력할 수 없거나 통과할 수 없는 디렉토리가 기록됩니다.심볼링크는 무시되며 디렉토리를 동시에 수정해도 필요 이상으로 문제가 발생하지 않습니다.

/**
 * Attempts to calculate the size of a file or directory.
 * 
 * <p>
 * Since the operation is non-atomic, the returned value may be inaccurate.
 * However, this method is quick and does its best.
 */
public static long size(Path path) {

    final AtomicLong size = new AtomicLong(0);

    try {
        Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {

                size.addAndGet(attrs.size());
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) {

                System.out.println("skipped: " + file + " (" + exc + ")");
                // Skip folders that can't be traversed
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc) {

                if (exc != null)
                    System.out.println("had trouble traversing: " + dir + " (" + exc + ")");
                // Ignore errors traversing a folder
                return FileVisitResult.CONTINUE;
            }
        });
    } catch (IOException e) {
        throw new AssertionError("walkFileTree will not throw IOException if the FileVisitor does not");
    }

    return size.get();
}

당신은 평범한 사람이 필요해요.

디렉토리가 아닌 파일이 전달되면 메서드가 예외를 발생시키므로 파일이 디렉토리인지 여부를 수동으로 확인해야 합니다.

경고: 이 메서드(commons-io 2.4 기준)에는 버그가 있어 버그가 발생할 수 있습니다.IllegalArgumentException디렉토리가 동시에 변경되는 경우.

Java 8의 경우:

long size = Files.walk(path).mapToLong( p -> p.toFile().length() ).sum();

사용하는 것이 좋을 것 같습니다.Files::size맵 스텝에서는 체크 마크가 켜져 있지만 예외가 발생합니다.

갱신:
또한 일부 파일/폴더에 액세스할 수 없는 경우 예외가 발생할 수 있습니다.질문과 Guava를 사용한 다른 솔루션을 참조하십시오.

public static long getFolderSize(File dir) {
    long size = 0;
    for (File file : dir.listFiles()) {
        if (file.isFile()) {
            System.out.println(file.getName() + " " + file.length());
            size += file.length();
        }
        else
            size += getFolderSize(file);
    }
    return size;
}

Java 8의 경우 이는 올바른 방법 중 하나입니다.

Files.walk(new File("D:/temp").toPath())
                .map(f -> f.toFile())
                .filter(f -> f.isFile())
                .mapToLong(f -> f.length()).sum()

디렉토리의 길이 메서드가 0이 되는 것은 아니기 때문에 모든 디렉토리를 필터링하는 것이 중요합니다.

적어도 이 코드는 Windows 탐색기 자체와 동일한 크기 정보를 제공합니다.

일반적인 파일 크기를 얻는 가장 좋은 방법은 다음과 같습니다(디렉토리 및 비디렉토리용).

public static long getSize(File file) {
    long size;
    if (file.isDirectory()) {
        size = 0;
        for (File child : file.listFiles()) {
            size += getSize(child);
        }
    } else {
        size = file.length();
    }
    return size;
}

편집: 이 작업은 시간이 많이 걸릴 수 있습니다.UI 스레드에서 실행하지 마십시오.

또, 여기(https://stackoverflow.com/a/5599842/1696171) 에서 취득한 것은, 반환된 문자열로부터 유저가 취득하는 좋은 방법입니다.

public static String getReadableSize(long size) {
    if(size <= 0) return "0";
    final String[] units = new String[] { "B", "KB", "MB", "GB", "TB" };
    int digitGroups = (int) (Math.log10(size)/Math.log10(1024));
    return new DecimalFormat("#,##0.#").format(size/Math.pow(1024, digitGroups))
            + " " + units[digitGroups];
}

File.length()(Javadoc).

이것은 디렉토리에서는 동작하지 않거나, 동작하는 것을 보증하는 것은 아닙니다.

렉토리의경경????????그 에 있는 모든 할 수 .File.list() ★★★★★★★★★★★★★★★★★」File.isDirectory()이치노

File에 브브 a a a a a a a a가 있다.length★★★★

f = new File("your/file/name");
f.length();

Java 8 NIO API 를 사용하고 싶은 경우는, 다음의 프로그램이 그 디렉토리의 사이즈(바이트 단위)를 인쇄합니다.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class PathSize {

    public static void main(String[] args) {
        Path path = Paths.get(".");
        long size = calculateSize(path);
        System.out.println(size);
    }

    /**
     * Returns the size, in bytes, of the specified <tt>path</tt>. If the given
     * path is a regular file, trivially its size is returned. Else the path is
     * a directory and its contents are recursively explored, returning the
     * total sum of all files within the directory.
     * <p>
     * If an I/O exception occurs, it is suppressed within this method and
     * <tt>0</tt> is returned as the size of the specified <tt>path</tt>.
     * 
     * @param path path whose size is to be returned
     * @return size of the specified path
     */
    public static long calculateSize(Path path) {
        try {
            if (Files.isRegularFile(path)) {
                return Files.size(path);
            }

            return Files.list(path).mapToLong(PathSize::calculateSize).sum();
        } catch (IOException e) {
            return 0L;
        }
    }

}

calculateSizePath파일에도 사용할 수 있습니다.파일 또는 디렉토리에 액세스할 수 없는 경우 이 경우 경로 객체의 반환 크기는 다음과 같습니다.0.

  • Android 및 Java 지원
  • 폴더와 파일 모두에 대응
  • 필요한 모든 위치에서 null 포인터를 확인합니다.
  • 심볼릭 링크숏컷을 무시합니다.
  • 제작 준비 완료!

소스 코드:

   public long fileSize(File root) {
        if(root == null){
            return 0;
        }
        if(root.isFile()){
            return root.length();
        }
        try {
            if(isSymlink(root)){
                return 0;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return 0;
        }

        long length = 0;
        File[] files = root.listFiles();
        if(files == null){
            return 0;
        }
        for (File file : files) {
            length += fileSize(file);
        }

        return length;
    }

    private static boolean isSymlink(File file) throws IOException {
        File canon;
        if (file.getParent() == null) {
            canon = file;
        } else {
            File canonDir = file.getParentFile().getCanonicalFile();
            canon = new File(canonDir, file.getName());
        }
        return !canon.getCanonicalFile().equals(canon.getAbsoluteFile());
    }

해 봤어요.du -c <folderpath>nio보다 2배 . recursion ( 또는 재귀)

private static long getFolderSize(File folder){
  if (folder != null && folder.exists() && folder.canRead()){
    try {
      Process p = new ProcessBuilder("du","-c",folder.getAbsolutePath()).start();
      BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
      String total = "";
      for (String line; null != (line = r.readLine());)
        total = line;
      r.close();
      p.waitFor();
      if (total.length() > 0 && total.endsWith("total"))
        return Long.parseLong(total.split("\\s+")[0]) * 1024;
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
  return -1;
}

Windows 에서는, java.io 를 사용하는 것이 편리합니다.

    public static long folderSize(File directory) {
    long length = 0;

    if (directory.isFile())
         length += directory.length();
    else{
        for (File file : directory.listFiles()) {
             if (file.isFile())
                 length += file.length();
             else
                 length += folderSize(file);
        }
    }

    return length;
}

이것은 테스트되고 있고, 제 쪽에서는 정상적으로 동작하고 있습니다.

private static long getFolderSize(Path folder) {
        try {
            return Files.walk(folder)
                      .filter(p -> p.toFile().isFile())
                      .mapToLong(p -> p.toFile().length())
                      .sum();
        } catch (IOException e) {
            e.printStackTrace();
            return 0L;
        }
public long folderSize (String directory)
    {
        File curDir = new File(directory);
        long length = 0;
        for(File f : curDir.listFiles())
        {
            if(f.isDirectory())
            {               
                 for ( File child : f.listFiles()) 
                 {
                     length = length + child.length();
                 }

                System.out.println("Directory: " + f.getName() + " " + length + "kb");
            }
            else
            {
                length = f.length();
                System.out.println("File: " + f.getName() + " " + length + "kb");
            }
            length = 0;
        }
        return length;
    }

Stack Overflow에서 제안된 다양한 솔루션에 대한 많은 조사 및 조사 결과.나는 마침내 나만의 해결책을 쓰기로 결심했다.API가 폴더 크기를 가져올 수 없는 경우 충돌하고 싶지 않기 때문에 No-throw 메커니즘을 사용하는 것이 목적입니다.이 방법은 멀티스레드 시나리오에는 적합하지 않습니다.

먼저 파일 시스템 트리를 트래버스하면서 유효한 디렉토리가 있는지 확인하고 싶습니다.

private static boolean isValidDir(File dir){
    if (dir != null && dir.exists() && dir.isDirectory()){
        return true;
    }else{
        return false;
    }
}

둘째, 재귀 콜을 심볼링크(소프트링크)에 삽입하지 않고 총 집계에 크기를 포함시키지 않도록 합니다.

public static boolean isSymlink(File file) throws IOException {
    File canon;
    if (file.getParent() == null) {
        canon = file;
    } else {
        canon = new File(file.getParentFile().getCanonicalFile(),
                file.getName());
    }
    return !canon.getCanonicalFile().equals(canon.getAbsoluteFile());
}

마지막으로 지정된 디렉토리의 크기를 가져오기 위한 재귀 기반 구현입니다.dir.listFiles()의 늘체크입니다javadoc에 따르면 이 메서드가 null을 반환할 가능성이 있습니다.

public static long getDirSize(File dir){
    if (!isValidDir(dir))
        return 0L;
    File[] files = dir.listFiles();
    //Guard for null pointer exception on files
    if (files == null){
        return 0L;
    }else{
        long size = 0L;
        for(File file : files){
            if (file.isFile()){
                size += file.length();
            }else{
                try{
                    if (!isSymlink(file)) size += getDirSize(file);
                }catch (IOException ioe){
                    //digest exception
                }
            }
        }
        return size;
    }
}

케이크의 크림, 파일 목록 크기를 가져오기 위한 API(루트 아래에 있는 모든 파일과 폴더일 수 있음)

public static long getDirSize(List<File> files){
    long size = 0L;
    for(File file : files){
        if (file.isDirectory()){
            size += getDirSize(file);
        } else {
            size += file.length();
        }
    }
    return size;
}

linux에서 디렉토리를 정렬하려면 du - hs * | sort - h

하시면 됩니다.Apache Commons IO을 사용하다

사용하고 는, 의 의존 .pom.xmlfilename을 클릭합니다.

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

Maven 팬이 아닌 경우 다음 항아리를 다운로드하여 클래스 경로에 추가합니다.

https://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar

public long getFolderSize() {

    File folder = new File("src/test/resources");
    long size = FileUtils.sizeOfDirectory(folder);

    return size; // in bytes
}

Commons IO를 통해 파일 크기를 가져오려면

File file = new File("ADD YOUR PATH TO FILE");

long fileSize = FileUtils.sizeOf(file);

System.out.println(fileSize); // bytes

또, 다음의 방법으로도 달성할 수 있습니다.Google Guava

Maven의 경우 다음을 추가합니다.

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.1-jre</version>
</dependency>

Maven을 사용하지 않을 경우 클래스 경로에 다음 추가

https://repo1.maven.org/maven2/com/google/guava/guava/28.1-jre/guava-28.1-jre.jar

public long getFolderSizeViaGuava() {
        File folder = new File("src/test/resources");
        Iterable<File> files = Files.fileTreeTraverser()
                .breadthFirstTraversal(folder);
        long size = StreamSupport.stream(files.spliterator(), false)
                .filter(f -> f.isFile())
                .mapToLong(File::length).sum();

        return  size;
    }

파일 크기를 가져오려면

 File file = new File("PATH TO YOUR FILE");
 long s  = file.length();
 System.out.println(s);
fun getSize(context: Context, uri: Uri?): Float? {
    var fileSize: String? = null
    val cursor: Cursor? = context.contentResolver
        .query(uri!!, null, null, null, null, null)
    try {
        if (cursor != null && cursor.moveToFirst()) {

            // get file size
            val sizeIndex: Int = cursor.getColumnIndex(OpenableColumns.SIZE)
            if (!cursor.isNull(sizeIndex)) {
                fileSize = cursor.getString(sizeIndex)
            }
        }
    } finally {
        cursor?.close()
    }
    return fileSize!!.toFloat() / (1024 * 1024)
}

언급URL : https://stackoverflow.com/questions/2149785/get-size-of-folder-or-file

반응형