【问题标题】:Recursively getting the size of a directory递归获取目录大小
【发布时间】:2012-02-19 23:59:51
【问题描述】:

有没有一个很好的 gem 来获取递归计算的目录大小?在unix中,我可以使用du,但我想要一个吸收操作系统差异的库。

【问题讨论】:

标签: ruby directory filesize


【解决方案1】:

这似乎有效:

Dir.glob(File.join(dir, '**', '*'))
  .map{ |f| File.size(f) }
  .inject(:+)

【讨论】:

  • 我认为您实际上只是在获取带有(&:size) 的字符串的长度。你想要的是{ |file| File.size(file) }
  • 或者使用sum而不是inject(:+)(在Ruby 2.6.4上测试)
【解决方案2】:

这样的东西对你有用吗?

def directory_size(path)
  path << '/' unless path.end_with?('/')

  raise RuntimeError, "#{path} is not a directory" unless File.directory?(path)

  total_size = 0
  Dir["#{path}**/*"].each do |f|
    total_size += File.size(f) if File.file?(f) && File.size?(f)
  end
  total_size
end

puts directory_size '/etc'

【讨论】:

    【解决方案3】:

    这是我使用 http://ruby-doc.org/core-2.2.0/File.html#method-c-size 的解决方案:

    def directory_size(path)
      size=0
      Dir.glob(File.join(path, '**', '*')) { |file| size+=File.size(file) }
      size
    end
    

    【讨论】:

      【解决方案4】:

      看起来sys-filesystem 处理了这个问题,但您需要做一些数学运算才能将可用块转换为字节(通过乘以块大小)。

      【讨论】:

      • 这可能是由于自此答案以来经过了很长时间,但提到的 gem 正确地确定了块大小(以及以字节为单位的大小,参见 bytes_{used,total,free} 仅在文件系统(=mount)级别并且似乎无法确定目录的大小。
      【解决方案5】:

      查看File::Stat 类(注意它不计算目录内容的大小,需要手动完成)。

      file = File::Stat.new('.')
      puts file.size
      

      http://ruby-doc.org/core-1.9.3/File/Stat.html#method-i-size

      【讨论】:

      • 我假设您被否决了,因为这会返回目录的大小,而不是目录内容的组合大小。
      【解决方案6】:

      支持工具:

      diruse /M %windir%
      diruse /K /S %windir%
      diruse /S %windir%
      diruse /, %windir%
      

      微软...系统安装光盘

      msiexec /i %cd:~0,2%\SUPPORT\TOOLS\SUPTOOLS.MSI /q addlocal=all
      

      Sysinternals 套件实用程序:

      du.exe -l 1 %windir%
      

      微软...

      Sysinternals Suite

      【讨论】:

      • 目前尚不清楚这如何解决问题。你需要解释一下
      猜你喜欢
      • 2017-01-11
      • 2015-08-07
      • 2018-12-17
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 2020-01-31
      相关资源
      最近更新 更多