Попробуй использовать вместо "seek FH, 0,2" "seek FH,-1,2" - может так он нормально воспримет.
Тут ещё идея возникла - здесь ведь причина вполне понятна, почему он отказывается выводить правильный размер - тип данных слишком маленький. Можно использовать "seek FH, 4294967296, 0" (такой аргумент по-идее должен принять) и если ответ не "ложь" (ака если файл >= 4гигов), то тогда к результату stat прибавляешь 4294967296. С переменными такого размера Perl работает (во всяком случае мой домашний ActiveState Perl 5.8.2). Правда и тут есть ограничение - файл размером 8Гб :-). Но если уж нужен универсальный код, то для seek можно организовать цикл.
Всем привет!
Возник вопрос - как при помощи Perl можно получить размер файла, если файл превышает 4Gb?
Хорошо работающая конструкция типа
$u = (stat("$ARGV[0]"))[7];
print "$u\n";
работает на небольших файлах, на файле больше 4 гб - выдает например такое число -7294976
может быть16.07.04 15:59 Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
не знаю, прав ли я, но разве в данном случае нельзя использвать функцию length?
Да, результат будет большой, но его можно поделить, например, на 1024 и узнать результат в килобайтах...
Извиняюсь, если протупил ;))
length использует в качестве параметра скалар -...16.07.04 17:33 Автор: Heller <Heller> Статус: Elderman
> не знаю, прав ли я, но разве в данном случае нельзя > использвать функцию length? > Да, результат будет большой, но его можно поделить, > например, на 1024 и узнать результат в килобайтах... > Извиняюсь, если протупил ;)) length использует в качестве параметра скалар - следовательно, надо вначале файл считать в переменную. А речь идёт о 4 Гб..
Решением может быть (не знаю, никогда не проверял на файлах 4 Гб) использование оператора -s:
open (FH,"file");
print -s FH;
close FH;
Есть ещё вариант, который опять же не знаю насколько пойдёт с большим файлом, но скорее всего он тебе поможет. Используй seek и tell:
seek FH,0,2;
#идём в нулевую позицию относительно конца файла
print tell FH;
#считываем позицию
Попробуй еще вместо stat использовать POSIX::fstat - она скорее всего умеет работать с крупными файлами, POSIX, всё таки.. Возвращает fstat список и, если не ошибаюсь, точно в таком же формате как и stat.
ЗЫ. Как проверишь - рапортуй о результатах, плз. Сам доступа к транслятору сейчас не имею, а вопрос интересный.
То же самое отрицательное число16.07.04 18:54 Автор: Cyber_Onix Статус: Незарегистрированный пользователь
> > Есть ещё вариант, который опять же не знаю насколько пойдёт > с большим файлом, но скорее всего он тебе поможет. > Используй seek и tell: > > seek FH,0,2; > #идём в нулевую позицию относительно конца файла > print tell FH; > #считываем позицию >
результат -1
> Попробуй еще вместо stat использовать POSIX::fstat - она > скорее всего умеет работать с крупными файлами, POSIX, всё > таки.. Возвращает fstat список и, если не ошибаюсь, точно в > таком же формате как и stat. >
Еще не пробовал
Ещё возможное решение16.07.04 19:08 Автор: Heller <Heller> Статус: Elderman
Попробуй использовать вместо "seek FH, 0,2" "seek FH,-1,2" - может так он нормально воспримет.
Тут ещё идея возникла - здесь ведь причина вполне понятна, почему он отказывается выводить правильный размер - тип данных слишком маленький. Можно использовать "seek FH, 4294967296, 0" (такой аргумент по-идее должен принять) и если ответ не "ложь" (ака если файл >= 4гигов), то тогда к результату stat прибавляешь 4294967296. С переменными такого размера Perl работает (во всяком случае мой домашний ActiveState Perl 5.8.2). Правда и тут есть ограничение - файл размером 8Гб :-). Но если уж нужен универсальный код, то для seek можно организовать цикл.