Здравствуйте, scsnow, Вы писали:
S>есть файловый дескриптор, открытый так: S>int fp; S>fp=open("file.txt",O_RDONLY);
S>задача: S>определить размер файла file.txt
S>очевидное решение: S>int len,size; S>char buf[1024]; S>size=0; S>while (len=read(fp,buf,1024)) size+=len;
Это шутка такая?
1) fstat() на дескриптор, выдаст кучу данных, в st_size будет размер (номер последней известной позиции плюс 1)
2) lseek() с SEEK_END, его возврат будет размером (вместе с изменением позиции), не забыть вернуть позицию на начало, когда надо будет читать
S>однако требуется что-то более разумное...
Вы бы хоть один учебник по юниксу почитали:) Вот это точно будет разумным.:)
Здравствуйте, netch80, Вы писали:
S>Это шутка такая?
нет, не шутка. из всех функций знаю тока open, write, read, close
S>2) lseek() с SEEK_END, его возврат будет размером (вместе с изменением позиции), не забыть вернуть позицию на начало, когда надо будет читать
аналог rewind скажите, пожалуйста
S>Вы бы хоть один учебник по юниксу почитали Вот это точно будет разумным.
Всему свое время, а щас пока пишу первую программу под *nix
Здравствуйте, scsnow, Вы писали:
S>>2) lseek() с SEEK_END, его возврат будет размером (вместе с изменением позиции), не забыть вернуть позицию на начало, когда надо будет читать S>аналог rewind скажите, пожалуйста
N>2) lseek() с SEEK_END, его возврат будет размером (вместе с изменением позиции), не забыть вернуть позицию на начало, когда надо будет читать
Я подозреваю, что это будет небыстро. Проверять неохота )
Здравствуйте, Vamp, Вы писали:
N>>2) lseek() с SEEK_END, его возврат будет размером (вместе с изменением позиции), не забыть вернуть позицию на начало, когда надо будет читать V>Я подозреваю, что это будет небыстро.
Может и медленнее, чем stat, но все же не настолько, чтобы это хоть как-нибудь заметить. lseek() ведь только устанавливает значение переменной, а не обращается к диску.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
ДД>Может и медленнее, чем stat, но все же не настолько, чтобы это хоть как-нибудь заметить. lseek() ведь только устанавливает значение переменной, а не обращается к диску.
Не уверен. Я просто не знаю, что там реально происходит в этот момент. Не удивлюсь, если умная ОС проецирует в память кусочек файла, с целью пре-кэширования.
Да здравствует мыло душистое и веревка пушистая.
Re[5]: размер файла и linux api
От:
Аноним
Дата:
06.10.08 08:16
Оценка:
Здравствуйте, Vamp, Вы писали:
ДД>>Может и медленнее, чем stat, но все же не настолько, чтобы это хоть как-нибудь заметить. lseek() ведь только устанавливает значение переменной, а не обращается к диску. V>Не уверен. Я просто не знаю, что там реально происходит в этот момент. Не удивлюсь, если умная ОС проецирует в память кусочек файла, с целью пре-кэширования.
в linux просто возьмется inode->i_size и соотвественно модифицируется file->f_pos,
не уверен что ОС можно будет назвать "умной" если она на запросы модифицирующие положение в файле
будет что-либо перекешировать, если на каждый запрос пользователя делать "опережение", то никаких
ресурсов не хватит