폴더 또는 파일 크기 가져오기
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;
}
}
}
calculateSize
은 Path
파일에도 사용할 수 있습니다.파일 또는 디렉토리에 액세스할 수 없는 경우 이 경우 경로 객체의 반환 크기는 다음과 같습니다.0
.
소스 코드:
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.xml
filename을 클릭합니다.
<!-- 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
'programing' 카테고리의 다른 글
한 줄로 동적으로 인쇄 (0) | 2023.01.21 |
---|---|
주의: 정의되지 않은 오프셋: 0 in (0) | 2023.01.21 |
값을 붙여 임시 열을 추가하다 (0) | 2023.01.21 |
JUnit에서는 assertNotEquals 메서드가 제공되지 않는 이유는 무엇입니까? (0) | 2023.01.21 |
자동 증가 시작 번호를 변경하시겠습니까? (0) | 2023.01.21 |