Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
Ещё возможное решение 16.07.04 19:08 Число просмотров: 1405
Автор: 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 можно организовать цикл.
ЗЫ. За арифметику не ручаюсь.
|
<programming>
|
[Perl] Perl -> Get File Size 16.07.04 13:26
Автор: Cyber_Onix Статус: Незарегистрированный пользователь
|
Всем привет!
Возник вопрос - как при помощи 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 Статус: Незарегистрированный пользователь
|
> open (FH,"file"); > print -s FH; > close FH;
То же самое отрицательное число
> > Есть ещё вариант, который опять же не знаю насколько пойдёт > с большим файлом, но скорее всего он тебе поможет. > Используй 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 можно организовать цикл.
ЗЫ. За арифметику не ручаюсь.
|
|
|