<<< DISK$DATA:[NOTES$LIBRARY]VAX_VMS.NOTE;1 >>> -< SIG VAX/VMS >- ================================================================================ Note 1475.0 Quelle-est la taille du fichier ? 11 replies DECUSF::ROCHE_F "Francois ROCHE - Anderson Consulti" 14 lines 25-SEP-1991 11:47 -------------------------------------------------------------------------------- Est-il possible d'obtenir la taille en octets d'un fichier quelconque ?. Bien entendu , la solution qui consiste a lire et comptabiliser tous les enregistrements (via RMS, ou ordres de lecture read) n'est pas tres satisfaisante. La primitive stat (unixio) renvoie soit nombre de blocs alloues * 512 soit une valeur incorrecte. Autre essai en langage C open + lseek (fichier, 0 , SEEK_END) donne les memes resultats. merci. ================================================================================ Note 1475.1 Quelle-est la taille du fichier ? 1 of 11 DECUSF::JOUVIN_M "Michel Jouvin - CECM/CNRS Vitry" 8 lines 25-SEP-1991 12:06 -< Avec $open, pas tres difficile >- -------------------------------------------------------------------------------- Apparemment c'est en C? Je ne sais pas s'il y a une fonction standard mais il est toujours possible d'ouvrir le fichier directement par le rms service $open, de lire le nombre de block utilise et la position de l'eof dans le dernier block. Le nombre de byte devient : (block_utilises-1) * 512 + eof Michel ================================================================================ Note 1475.2 Quelle-est la taille du fichier ? 2 of 11 DECUSF::SMANS_M "Michel Smans, C.I.R.C., Lyon" 7 lines 25-SEP-1991 12:14 -< oui, mais... >- -------------------------------------------------------------------------------- mais tous ces bytes sont-ils "utiles"? (je pense aux 0-terminated strings) quelle est le nombre que .0 veut REELLEMENT obtenir? le nombre de bytes "utiles", auquel cas je crois qu'il faut lire tout, ou un autre nombre, mais dans ce cas, je ne comprends pas a quoi ca peut servir et donc le nombre de blocks*512 serait suffisant me gourre-je? ================================================================================ Note 1475.3 Quelle-est la taille du fichier ? 3 of 11 DECUSF::QUIVOGNE_L 2 lines 25-SEP-1991 12:16 -< eof = 0 >- -------------------------------------------------------------------------------- Je me permets une petite precision sur .1 Si eof = 0, le nombre de bytes devient block_utilises * 512 ================================================================================ Note 1475.4 Quelle-est la taille du fichier ? 4 of 11 DECUSF::PIERONNE_J "PIERONNE Jean-François / Indépen" 4 lines 25-SEP-1991 12:56 -< Quelque chose d'approchant >- -------------------------------------------------------------------------------- J'ai un exemple de programme effectuant ce genre de manip (tail) a partir des structures RMS, il faudrait en extraire la partie effectuant la manip, je peux mettre le programme dans VMS si ca vous interesse (c'est une version tres recente de tail, ecrite en C) ================================================================================ Note 1475.5 Quelle-est la taille du fichier ? 5 of 11 DECUSF::ROCHE_F "Francois ROCHE - Anderson Consulti" 23 lines 25-SEP-1991 15:53 -< Taille d'un fichier la suite >- -------------------------------------------------------------------------------- .1, .2, .3 : Le calcul nombre de blocs /512 + bidouille ne peut donner un resultat satisfaisant: - ce calcul ne tient pas compte du format des enregistrements. - en adaptant ce calcul au format, ca ne marche toujours pas. Par exemple un sequentiel variable carriage return carriage control est structure longueur (word) + valeur. Sur 512 on peut donc avoir de 170 a 510 caracteres utiles... .4 : Je ne vois pas trop bien la relation tail (si c'est le tail unix) avec mon probleme, mais je suis interessé par le source C (expliquez-moi la procedure a suivre pour le retrouver) ayant fouille RMS dans tous les sens pour resoudre le probleme (FAB, XAB, ...). merci. ================================================================================ Note 1475.6 Quelle-est la taille du fichier ? 6 of 11 DECUSF::PIERONNE_J "PIERONNE Jean-François / Indépen" 5 lines 25-SEP-1991 21:35 -< tail suite >- -------------------------------------------------------------------------------- Je me suis dis que trouver les derniers enregistrements d'un fichier devait avoir un rapport avec trouver sa taille. Ceci dit je n'ai pas verifie... J'ai mis dans VMS tail.c et tail.doc, ils sont passes sur INFO-VAX il y a pas tres longtemps. ================================================================================ Note 1475.7 Quelle-est la taille du fichier ? 7 of 11 DECUSF::OURGHANLIA_B "Eppur si muove..." 1 line 26-SEP-1991 07:59 -< VMS:... >- -------------------------------------------------------------------------------- Voir dans VMS:DIR_SLASH_FULL.C ================================================================================ Note 1475.8 Quelle-est la taille du fichier ? 8 of 11 DECUSF::ROCHE_F "Francois ROCHE - Anderson Consulti" 24 lines 26-SEP-1991 10:12 -< Il faut donc lire ... >- -------------------------------------------------------------------------------- Visiblement la reponse est : - ouvrir le fichier - lire et compter juqu'a la fin de fichier - fermer le fichier Quelle-est alors la methode la plus rapide ? A titre d'exemple sur un fichier sequentiel variable de 12000 lignes de 80 carateres : - C ou BASIC : environ 13s pour la lecture - $OPEN, $GET, $CLOSE : environ 11s pour la lecture - COPY du fichier lui ne prend que 4s !! le tout sur un 3800 et RF71. Enfin pour lever un doute, l'information que je souhaite obtenir est le nombre de carateres utiles . Merci. ================================================================================ Note 1475.9 Quelle-est la taille du fichier ? 9 of 11 DECUSF::BERENGUIER_A "Alain, ALCATEL BUSINESS SYSTE" 10 lines 26-SEP-1991 10:29 -< un WC pour VMS ? >- -------------------------------------------------------------------------------- Si vous voulez le nombre de caracteres utiles je ne voit pas comment faire independamment d'ouvrir le fichier, compter, fermer le fichier. Dans les differentes bande DECUS ( US ) on trouve des emulations d'unix, et en particulier "WC" pour word count qui indiquent le nombre d'octets, le nombre de mots et le nombre de lignes. J'ai modifie l'un de ces programmes pour le rendre plus "VMS" ( en particulier le wildcard ). Si vous etez interesser je peut le poster. Berenguier Alain. ================================================================================ Note 1475.10 Quelle-est la taille du fichier ? 10 of 11 DECUSF::SMANS_M "Michel Smans, C.I.R.C., Lyon" 95 lines 26-SEP-1991 11:09 -< un exemple... >- -------------------------------------------------------------------------------- un exemple de programme fortran pour essayer de lire tres vite le nombre de records, leur taille, et retenir la plus petite et la plus grande... je ne pretends pas que c'est ce qu'on peut faire de mieux mais ca marche assez bien pour moi... character file*80 logical bio_x integer nb,buf include '($fabdef)' include '($rabdef)' include '($rmsdef)' record /fabdef/ fab, /rabdef/ rab logical sys$open,sys$connect,sys$get,sys$close call lib$get_input(file,'file : ',l) call lib$init_timer(ih) fab.fab$b_bid = fab$c_bid fab.fab$b_bln = fab$c_bln fab.fab$l_fna = %loc(file) fab.fab$b_fns = l fab.fab$b_fac = fab$m_get fab.fab$w_ifi = 0 bio_x = sys$open(fab) if ( .not.bio_x ) call lib$signal(%val(bio_x)) rab.rab$b_bid = rab$c_bid rab.rab$b_bln = rab$c_bln rab.rab$l_rop = rab$m_rah rab.rab$l_fab = %loc(fab) rab.rab$w_isi = 0 bio_x = sys$connect(rab) if ( .not.bio_x ) call lib$signal(%val(bio_x)) rab.rab$b_rac = rab$c_seq rab.rab$l_ubf = %loc(buf) rab.rab$w_usz = 1 n=0 nb=0 m1='7fffff'x m2=0 do while ( bio_x.ne.rms$_eof ) bio_x = sys$get(rab) if ( bio_x.eq.rms$_normal ) then n=n+1 nb=nb+rab.rab$w_rsz m1=min(m1,rab.rab$w_rsz) m2=max(m2,rab.rab$w_rsz) else if ( bio_x.eq.rms$_rtb ) then n=n+1 nb=nb+rab.rab$l_stv m1=min(m1,rab.rab$l_stv) m2=max(m2,rab.rab$l_stv) else if ( bio_x.ne.rms$_eof ) then call lib$signal(%val(bio_x)) end if end do bio_x = sys$close(fab) if ( .not.bio_x ) call lib$signal(%val(bio_x)) call lib$show_timer(ih) type *,n,nb,m1,m2 end resultats sur un fichier de 12 rec variables: a) 4000-300 et RF31 ELAPSED: 0 00:00:01.34 CPU: 0:00:00.69 BUFIO: 2 DIRIO: 54 FAULTS: 1 12000 409800 0 71 b) mv3100/e et RF31 servi par le 4000-300 ELAPSED: 0 00:00:04.74 CPU: 0:00:02.17 BUFIO: 4 DIRIO: 59 FAULTS: 12 12000 409800 0 71 c) mv3100/e et RZ23 local ELAPSED: 0 00:00:03.40 CPU: 0:00:02.17 BUFIO: 2 DIRIO: 54 FAULTS: 1 12000 409800 0 71 les nombres sont dans l'ordre: nombre de rec, somme des tailles, plus petit et plus grand joke: je propose un concours pour le programme qui ira le plus vite pour faire ce genre du truc... ni prix, ni recompenses, juste le fun! bye ================================================================================ Note 1475.11 Quelle-est la taille du fichier ? 11 of 11 DECUSF::SMANS_M "Michel Smans, C.I.R.C., Lyon" 2 lines 26-SEP-1991 11:11 -< ooops, typo! >- -------------------------------------------------------------------------------- en me relisant je vois que j'annonce un fichier de 12 recs... il y en a 12000 evidement!