OVH Cloud OVH Cloud

longueur de fichier

2 réponses
Avatar
kakrocq
Bonjour,
Je voudrais savoir comment connaitre la longueur des gros fichiers ( >4Go)
car par stat j'ai:
struct stat {
dev_t st_dev; /* device */
ino_t st_ino; /* inode */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device type (if inode device) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
};
la longueur du fichier est donnée par off_t ( unsigned long donc limité à
4Go)
et je ne vois pas comment utiliser blksize_t et blkcnt_t

2 réponses

Avatar
Stephane Chazelas
On Mon, 30 Jan 2006 17:33:27 +0100, kakrocq wrote:
Bonjour,
Je voudrais savoir comment connaitre la longueur des gros fichiers ( >4Go)
car par stat j'ai:
struct stat {
dev_t st_dev; /* device */
ino_t st_ino; /* inode */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device type (if inode device) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
};
la longueur du fichier est donnée par off_t ( unsigned long donc limité à
4Go)
et je ne vois pas comment utiliser blksize_t et blkcnt_t
[...]


Utilise stat64 (qui utilise off64_t). blkcnt_t et blkcnt_t sont
pour l'utilisation disque, pas pour la taille (le nombre
d'octets qu'on peut trouver dedans).

--
Stephane

Avatar
Nicolas George
Stephane Chazelas wrote in message
:
Utilise stat64 (qui utilise off64_t).


Ces fonctions ne sont pas standard. La méthode correcte pour avoir des
offsets 64 bits, est de le spécifier sous forme d'options de compilation. La
méthode est indiquée dans la spécification de la commande c99 : sur un
système conforme, on obtient les options avec getconf, sur les variables :

POSIX_V6_ILP32_OFFBIG_CFLAGS
POSIX_V6_ILP32_OFFBIG_LDFLAGS
POSIX_V6_ILP32_OFFBIG_LIBS

POSIX_V6_LPBIG_OFFBIG_CFLAGS
POSIX_V6_LPBIG_OFFBIG_LDFLAGS
POSIX_V6_LPBIG_OFFBIG_LIBS

selon si on est sur une architecture 32 bits ou plus. Sous GNU/Linux, ça
donne -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITSd.

Sur un système moins conforme, on fouillera les includes de la libc pour
deviner ce qu'il faut mettre.