Perl에서 더 좋은 모듈을 발견하지는 못해서, 일일이 파일 사이즈를 모두 더해서 폴더 사이즈를 구하였다. 그래서 시간이 좀 걸린다.

첫번째 방법
use v5.10;
use strict;
use warnings;

use File::Find;

sub get_folder_size {
    my ($dst_folder) = @_;
    my $folder_size = 0;
    find( sub { $folder_size += -f $_ ? -s _ : 0 }, $dst_folder );

    return $folder_size;
}

say "Folder Size : ".get_folder_size("C:\\");


두번째 방법

# ------------------------------------------------------------------------------
# 필요한 모듈 : cpanm -n File::Find::Object 
# ------------------------------------------------------------------------------
use v5.10;
use strict;
use warnings;

use File::Find::Object;

sub get_folder_size {
    my ($dst_folder) = @_;
    my $folder_size = 0;

    my $tree = File::Find::Object->new({}, ($dst_folder));
    while(my $file = $tree->next()) {
        next unless -e $file; # 존재하지 않으면 다음
        next unless -f $file; # 일반파일이 아니면 다음
        next unless -r $file; # 
        next unless -R $file; # 
        $folder_size += -s $file;
    }

    return $folder_size;
}

say "Folder Size : ".get_folder_size("C:\\");


Ruby 버전에 이어서 Groovy 버전도 만들어보았다. 거의 생김새가 비슷한 언어여서, 몇가지만 수정하면 바로 동작한다.

def FOLDER_LIST = [
                    "/path/to1",
                    "/path/to2",
                    "/path/to3",
                    "/path/to4",
                    "/path/to5",
                  ]

def startDate = new Date().format('yyyy/MM/dd HH:mm:ss')

def size_folder_list = []
FOLDER_LIST.each { folder_name ->
    def folder_size = 0
    new File(folder_name).eachFileRecurse { path ->
        folder_size += path.size()
    }
    size_folder_list << "${folder_size}|${folder_name}"
}

size_folder_list = size_folder_list.sort { a, b ->
    (a_size, a_file) = a.split(/\|/)
    (b_size, b_file) = b.split(/\|/)
    // b_size as int <=> a_size as int
    b_size.toInteger() <=> a_size.toInteger()
}

size_folder_list.each { folder ->
    (f_size, f_path) = folder.split(/\|/)
    println("${f_size},${f_path}")
}


def endDate = new Date().format('yyyy/MM/dd HH:mm:ss')
println "\n\n\n"
println "================================================================================"
println "Start Time : $startDate"
println "End   Time : $endDate"
println "================================================================================"

Ruby 에서 여러 디렉토리의 사이즈를 구하고 크기 순으로 정렬하는 방법을 구현해보았다. 여러 팀에서 공유하는 파일의 서버의 경우, 각 디렉토리별(팀)로 어느 정도 사용하는 지를 알아보고 싶을 때 이용하면 좋을 것이다.

require 'find'


$FOLDER_LIST = [
                'C:\\path\\to1',
                'C:\\path\\to2',
                'C:\\path\\to3',
                'C:\\path\\to4',
                'C:\\path\\to5',
               ]

start_time = Time.now


size_folder_list = Array.new
$FOLDER_LIST.each() do | folder_name |
  folder_size = 0
  Find.find(folder_name) do | path |
    if(File.exist?(path))
      folder_size += File.size(path)
    end
  end
  size_folder_list << "#{folder_size}|#{folder_name}"
end

size_folder_list = size_folder_list.sort do |a, b| 
  (a_size, a_file) = a.split(/\|/)
  (b_size, b_file) = b.split(/\|/)
  b_size.to_i <=> a_size.to_i
end

size_folder_list.each do | folder |
  (f_size, f_path) = folder.split(/\|/)
  print f_size + "," + f_path + "\n"
end


end_time = Time.now
puts "\n\n========================================================================="
puts "Start Time : #{start_time}"
puts "End Time   : #{end_time}"

PHP에서 윈도우에서 폴더 크기를 구하려면 아래와 같이 한다. 첫번째 방법은 인터넷에서 찾은 방법인데, 테스트해보니 결과값이 나오지 않았다. 그래서, 어쩔수 없이 하위 폴더를 모두 찾아가면서 파일크기를 모두 더해서 폴더의 전체용량을 구하는 것을 새로 만들었다. 전부다 뒤지기 때문에 시간이 좀 걸린다. 대신 윈도우 뿐만 아니라 다른 OS(Linux, BSD 등)에서도 동작한다는 장점이 있긴 하다. ^^

  • 윈도우 폴더 크기 구하기
    function Get_DirByteSize($Dir_Path) 
    {
        $objFs = new COM("Scripting.FileSystemObject"); 
        $objFolder = $objFs->GetFolder($Dir_Path); 
     
        return $objFolder->Size;  // byte 단위 
    }
    
    인터넷에서 찾은 예제 코드이긴 한데, 테스트해보니 결과 값이 나오지 않는다. ^^;
  • 무식하지만 확실하게 디렉토리 용량 구하는 방법 (OS 상관 없음)
    function Get_DirByteSize($dst_dir) 
    {
        $dir_size = 0;
     
        $rdi = new RecursiveDirectoryIterator($dst_dir);
        try {
            foreach (new RecursiveIteratorIterator($rdi, 
                RecursiveIteratorIterator::LEAVES_ONLY, 
                RecursiveIteratorIterator::CATCH_GET_CHILD) as $path) {
     
                if ($path->isFile()) {
                    $dir_size += $path->getSize();
                }
            }
        } catch(Exception $e) {
            echo "Message: ".$e->getMessage();
        }
     
        return $dir_size;
    }
     
    $dir_size = Get_DirByteSize("C:\\");
    echo "\nC Drive Size : $dir_size\n";
    

요즘, PHP를 이용해서 웹프로그래밍 외에 여러가지를 해보고 있는데, 상당히 쓸만하다. Perl, Python, Ruby 가 부럽지 않을 정도로 충분히 많은 것들이 갖추어져 있어서, 왠만한 분야에서 거의 쓰일 수 있을 것 같다.

+ Recent posts