【问题标题】:How to check folder size or containing files in Java without knowing the file name with java.nio.file?如何在不知道 java.nio.file 文件名的情况下检查文件夹大小或包含 Java 中的文件?
【发布时间】:2020-02-27 08:20:29
【问题描述】:

前段时间我有一个类似的问题。现在我没有任何特定的文件名,因为它是一个预处理器脚本。所以我需要检查文件列表的文件大小或特定路径的大小。

具体路径的解决方案是:

    var filePath = "//path//to//some//folder//file.name";
    try{
        var fileContent = java.nio.file.Files.size(java.nio.file.Paths.get(filePath));
        var fileSize = fileContent / 1048576;
        logger.debug("Filesize in MB: " + fileSize);
    }
    catch(e){
    ...

我已经尝试过的:

java.io.File(filePath).length();

这里的大小与文件夹中的实际大小不匹配。

java.nio.file.Files.list(filePath);

这里我得到一个 java.util.stream.ReferencePipeline$Head@... 我不知道如何在欢乐中读出它

也许任何人都可以帮助或向我展示另一种解决方案,以便在处理之前检查文件大小,而无需在 Java 版本“1.8.0._92”和 Windows Server 2012R2 环境中读取文件?

【问题讨论】:

    标签: java mirth java.nio.file


    【解决方案1】:

    您可以使用流对目录中所有文件的大小求和:

            long total = Files
               .list(Paths.get("c:/some/path/"))
               .mapToLong(p -> p.toFile().length())
               .sum();
            System.out.println(total);
    

    编辑:上面的原始答案是用 Java 编写的。在 Mirth javascript 中,它看起来像这样:

            var total = java.nio.file.Files
               .list(java.nio.file.Paths.get("c:/some/path/"))
               .mapToLong(function(p) {return p.toFile().length()})
               .sum();
            channelMap.put('total', total);
    

    【讨论】:

    • 不幸的是,我当前的 mirth / java 版本不支持这个..
    • 那么你应该把你的 mirth 和 java 版本放在原帖中。如果您不指定,通常假定您使用的是当前版本的 mirth 并且至少是 java 8。
    • @th_lo 查看编辑。此解决方案至少适用于 mirth 3.0+,并且只要您至少运行 Java 7,它可能会更旧。
    【解决方案2】:

    尝试使用

     import java.nio.channels.FileChannel;
    FileChannel fileChannel = FileChannel.open(filePath);
            long fileSize = fileChannel.size();
    

    【讨论】:

    • 谢谢,这可能是一种可能的方法。但是 FileChannel.open 会读入文件吗?如果是这样,那对我的情况来说不是一个好的解决方案。我想在处理之前测试大文件
    【解决方案3】:

    找到适合我需求的解决方案(在 Mirth 3.4.2.8129 上测试)Java 版本“1.8.0._92”和 Windows Server 2012R2 环境

        // Modify the message variable below to pre process data
        var folderPath = "C:////path//to//some//folder";
        var folder = new Packages.java.io.File(folderPath);
        var listOfFiles = folder.listFiles();
        var count = listOfFiles.length;
    
        for (i=0; i<count; i++){
            var ext = listOfFiles[i];
            if (ext.toString().endsWith(".name")){ //filter by extentions e.g. .xml
                var file = listOfFiles[i];
                var filestr = file.toString().replace("\\","//"); //adjust for UNC
                var fileSize = java.nio.file.Files.size(java.nio.file.Paths.get(filestr)) / 1048576;
                if (fileSize > 10){
                    ChannelUtil.stopChannel(channelId); //stop channel if needed
                    throw "File " + file + " is > "+ "10 MB" 
                }
            }
        }
        return message;
    

    如果从不同的服务器读取,必须允许 Mirth 服务器(用户)从(UNC)路径读取

    【讨论】:

    • 在 UNC 路径名上创建 java.io.File 仅在 windows 上运行 java 时有效。
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 2016-12-29
    • 1970-01-01
    相关资源
    最近更新 更多