Windows上でPerlスクリプトを実行しています。
ファイルのサイズを取得するのに
$fsize = -s $filename;
としてファイルサイズを取得していますが、これではファイルのプロパティの「サイズ」項しか分かりません。
「ディスク上のサイズ」を取得したいのですが、その方法を教えてください。
クラスタサイズから逆算すれば取れると思います。
use strict; use warnings; my $filename = 'test.txt'; my $filesize = -s $filename; print $filesize, "\n"; print get_disk_filesize($filesize), "\n"; sub get_disk_filesize { my $size = shift; my $cluster_size = 4096; # クラスタサイズ my $disk_filesize = (int(($size-1) / $cluster_size) + 1) * $cluster_size; return $disk_filesize; }
クラスタサイズの取り方が分からなかったので4,096バイト固定にしています。
何らかの手段でクラスタサイズをちゃんと取得するか、1バイトのファイルを
作ってサイズを確認するというのが確実だと思います。
参考
FAT および NTFS のデフォルトのクラスタ サイズ
http://support.microsoft.com/default.aspx?scid=kb%3bja%3b140365
ブロックサイズじゃだめですか?
@a = stat "/r/.skk-jisyo"; $blocks = $a[12]; print "blocks=$blocks\n";
回答ありがとうございます。
残念ながらWindowsではブロック数もブロックサイズも取得できません。
$filename = 'a.txt'; open(IN, "dir /v $filename |"); while (<IN>) { if(/.+\s+.+\s+\d+\s+([0-9,]+).+$filename/){ print $1; } } close(IN);
エラートラップなどは適宜仕込んでください。
回答ありがとうございます。
/vのオプションが無効なスイッチとしてエラーになるのですが、何のオプションでしょうか?
クラスタサイズから逆算すれば取れると思います。
use strict; use warnings; my $filename = 'test.txt'; my $filesize = -s $filename; print $filesize, "\n"; print get_disk_filesize($filesize), "\n"; sub get_disk_filesize { my $size = shift; my $cluster_size = 4096; # クラスタサイズ my $disk_filesize = (int(($size-1) / $cluster_size) + 1) * $cluster_size; return $disk_filesize; }
クラスタサイズの取り方が分からなかったので4,096バイト固定にしています。
何らかの手段でクラスタサイズをちゃんと取得するか、1バイトのファイルを
作ってサイズを確認するというのが確実だと思います。
参考
FAT および NTFS のデフォルトのクラスタ サイズ
http://support.microsoft.com/default.aspx?scid=kb%3bja%3b140365
回答ありがとうございます。
明日試してみます。
ちなみにストレージはDataONTAPでCIFSを使っています。
完璧です。
ありがとうございます。
回答ありがとうございます。
明日試してみます。
ちなみにストレージはDataONTAPでCIFSを使っています。
完璧です。
ありがとうございます。