Информация об изменениях

Сообщение Re[8]: Как определить размер(длину) файла в Линукс средствам от 29.11.2007 4:33

Изменено 23.01.2016 13:41 netch80

Здравствуйте, Conr, Вы писали:

C>Вроде подобный код у меня всегда работал на Linux'ах всяких, Bsd и MacOSX :xz: А на какие системы это непереносимо? просто для общего развития...


C>if( (st.st_mode & S_IFMT) != S_IFREG )


Кстати, более рекомендуемый вариант — if(S_ISREG(st.st_mode))

C>{

C> // non-seekable
C>}

Да файлы-то конечно seekable. Но кроме них ещё могут быть плоские диски и другие более странные объекты. Вот тут и начинается:

— традиционные юниксы: для каждого диска (раздела, слайса, etc.) есть блочное устройство (для монтирования) и байтовое (для ремонтов и дампов)
— FreeBSD: оставлено только байтовое ('c') устройство
— Linux: оставлено только блочное ('b') устройство

Проверка по st_mode на seekable, в таком случае, точнее всего в Linux (по условию S_ISREG(st.st_mode)||S_ISBLK(st.st_mode)). На всех прочих (с заменой S_ISBLK на S_ISCHR) она будет давать сильные сбои.
Re[8]: Как определить размер(длину) файла в Линукс средствам
Здравствуйте, Conr, Вы писали:

C>Вроде подобный код у меня всегда работал на Linux'ах всяких, Bsd и MacOSX :xz: А на какие системы это непереносимо? просто для общего развития...


C>if( (st.st_mode & S_IFMT) != S_IFREG )


Кстати, более рекомендуемый вариант — if(!S_ISREG(st.st_mode))

C>{

C> // non-seekable
C>}

Да файлы-то конечно seekable. Но кроме них ещё могут быть плоские диски и другие более странные объекты. Вот тут и начинается:

— традиционные юниксы: для каждого диска (раздела, слайса, etc.) есть блочное устройство (для монтирования) и байтовое (для ремонтов и дампов)
— FreeBSD: оставлено только байтовое ('c') устройство
— Linux: оставлено только блочное ('b') устройство

Проверка по st_mode на seekable, в таком случае, точнее всего в Linux (по условию S_ISREG(st.st_mode)||S_ISBLK(st.st_mode)). На всех прочих (с заменой S_ISBLK на S_ISCHR) она будет давать сильные сбои.