From aaf1a80c6f29ee59dd17e40874b616e4b39493fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Mat=C4=9Bj=C4=8Dek?= Date: Wed, 4 Sep 2024 23:46:36 +0200 Subject: [PATCH] The XFS file system doesn't return size of the directory content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: David Matějček --- .../com/sun/enterprise/util/io/FileUtils.java | 34 +++++++++++++++++-- .../sun/enterprise/util/io/FileUtilsTest.java | 2 +- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/nucleus/common/common-util/src/main/java/com/sun/enterprise/util/io/FileUtils.java b/nucleus/common/common-util/src/main/java/com/sun/enterprise/util/io/FileUtils.java index 2a73086c5ca..a7433a7a316 100644 --- a/nucleus/common/common-util/src/main/java/com/sun/enterprise/util/io/FileUtils.java +++ b/nucleus/common/common-util/src/main/java/com/sun/enterprise/util/io/FileUtils.java @@ -40,6 +40,8 @@ import java.nio.channels.WritableByteChannel; import java.nio.charset.Charset; import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.Collection; import java.util.Locale; @@ -743,7 +745,7 @@ public static File copyResource(String resourcePath, File outputFile) throws IOE /** - * Copies a file. + * Copies a file or directory. * * @param fin File to copy * @param fout New file @@ -765,6 +767,34 @@ public static void copy(File fin, File fout) throws IOException { } + /** + * Computes file or directory size. Follows symlinks just for the provided parameter, but not + * for files under the tree. + * + * @param fileOrDirectory + * @return summary of sizes of regular files. + * @throws IOException if any file size cannot be read. + */ + public static long getSize(File fileOrDirectory) throws IOException { + try { + return Files.walk(fileOrDirectory.getCanonicalFile().toPath()) + .filter(p -> Files.isRegularFile(p, LinkOption.NOFOLLOW_LINKS)).mapToLong(FileUtils::getRegularFileSize) + .sum(); + } catch (IllegalStateException e) { + throw new IOException("Could not read size of " + fileOrDirectory, e); + } + } + + + private static long getRegularFileSize(Path path) { + try { + return Files.size(path); + } catch (IOException e) { + throw new IllegalStateException("Could not read file size for " + path, e); + } + } + + /** * Returns a String with uniform slashes such that all the * occurances of '\\' are replaced with '/'. @@ -1057,7 +1087,7 @@ private static class FileOutputStreamWork implements RetriableWork { private Throwable lastError; private final File out; - public FileOutputStreamWork(File out) { + private FileOutputStreamWork(File out) { this.out = out; } diff --git a/nucleus/common/common-util/src/test/java/com/sun/enterprise/util/io/FileUtilsTest.java b/nucleus/common/common-util/src/test/java/com/sun/enterprise/util/io/FileUtilsTest.java index aa65d48077a..b09df42e8c8 100644 --- a/nucleus/common/common-util/src/test/java/com/sun/enterprise/util/io/FileUtilsTest.java +++ b/nucleus/common/common-util/src/test/java/com/sun/enterprise/util/io/FileUtilsTest.java @@ -88,7 +88,7 @@ public void testCopyDirectoriesFiles() throws Exception { File outputDir = new File(tempDir, "outputDir"); File testDir = new File(FileUtilsTest.class.getResource("/process").toURI()); FileUtils.copy(testDir, outputDir); - assertEquals(testDir.length(), outputDir.length()); + assertEquals(FileUtils.getSize(testDir), FileUtils.getSize(outputDir)); }