Newsgroup: it.comp.lang.c++
Titolo: Dimensione File!

Non riesco a trovare una qualche procedura che mi ritorni
la dimensione di un File!!
Qualcuno puo' darmi un aiuto???
--
Lorenzo - Firenze
ICQ 25093807
www.geocities.com/SunsetStrip/Backstage/9818/

 la dimensione di un File!!
Se sei sotto un sistema operativo serio, esistono delle procedure non
portabili che servono proprio a questo; ad esempio, sotto Unix,
stat() e' garantito ritornare il numero esatto di bytes fino all'EOF
(attenzione che sotto altri sistemi con un clone di stat, ad esempio
le prime versioni dell'AmigaOS, poteva esserci una piccola differenza.
-- 
Maurizio Loreti                      
http://wwwcdf.pd.infn.it/~loreti/mlo.html
Un. of Padova, Dept. of Physics - Padova, Italy          
lor...@padova.infn.it

 
// Io in genere uso codice del tipo seguente
#include <iostream>
#include <fstream>
int main(int, char *[]) {
    int lunghezzaFile;
    fstream f("myfile",ios::nocreate|ios::in|ios::out);
    f.seekg(0L,ios::end);
    lunghezzaFile=f.tellg();
    std::cout << lunghezzaFile << endl;
}

 la dimensione di un File!!
Non vorrei sbagliare ma non ci sono funzioni standard che diano questa
informazione. L'unica č aprire il file (fopen()), posizionarsi alla fine
(fseek()) e leggere la posizione (ftell()).
EMG


~~~~~~~~~~~~~~~~~
MAINARDI Gianfranco
Burago di Molgora (MI)
Italia
Email : 
main...@rete039.it
ICQ# number : 31334916
~~~~~~~~~~~~~~~~~

 
www.geocities.com/SunsetStrip/Backstage/9818/
Se non specifichi per quale Sistema Operativo ti serve temo sia dura
aiutarti perche' mi risulta che non ci sia una Funzione Standard per lo
scopo.
L'unica cosa che posso fare e' fornirti una classe che ho realizzato per
fare il porting di un mio programmino per MS-DOS, creato con il Borland
4.0 in C++, verso Linux (dove utilizzo l'egcs-1.0.3a-14).
Si tratta di codice che devi prendere con le molle perche' non sono un
professionista, bensi', un dilettante ;)
***INIZIO FILE HEADER
// UDA'Software Copyright 1998, Inc
// File: file.h
// Version 1.0.00
/* Questo file header deve emulare le funzioni della libreria file.h
   del compilatore Borland C/C++ 4.0 */
#ifndef INC_CLASSLIB_FILE_H
#define INC_CLASSLIB_FILE_H
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <SFile.h>
#ifdef _OS_LINUX_
#include <unistd.h>
#endif // _OS_LINUX_
class TFile {
 private:
  int		iUnitSize;	// Unita' di IO.
  int		iMode;		// Modalita' aperturta file.
  long		lFileSize;	// Dimensione del file.
  char		*pcFileName;	// Nome del file.
  struct stat	stat_TFile;	// Dati del file.
  SFile		*pSF_TFile;	// Classe Gestione File.
 protected:
 public:
  enum { FileNull = -1 };
  enum{
    //  Open mode
    ReadOnly		= O_RDONLY, 
      ReadWrite		= O_RDWR, 
      WriteOnly		= O_WRONLY, 
      Create		= O_CREAT | O_TRUNC, 
      CreateExcl	= O_CREAT | O_EXCL, 
      Append		= O_APPEND
      };
 
  enum{
    //  Permission flags for Create
    PermRead		= S_IREAD,
      PermWrite		= S_IWRITE,
      PermRdWr		= S_IREAD | S_IWRITE
      };
 
  enum{
    //  DOS file type flags
    Normal		= 0x00,
      RdOnly		= 0x01,
      Hidden		= 0x02,
      System		= 0x04,
      Volume		= 0x08,
      Directory		= 0x10,
      Archive		= 0x20
      };
 
  enum seek_dir
  { 
    beg = 0, 
    cur = 1, 
    end = 2 
  };
  TFile(int);
  ~TFile();
  int	Open(const char *name, int access, int permission);  
  int	Close();
  int	Read(void *buffer, int numBytes);
  int	Write(/*const*/ void *buffer, long numBytes);
  long	Length();
};
#endif // INC_CLASSLIB_FILE_H
***FINE FILE HEADER
***INIZIO FILE SOURCE
// UDA'Software Copyright 1998, Inc
// File: file.cc
// Version 1.0.00
#include <classlib/file.h>
TFile::TFile(int UnitSize):
  iUnitSize(UnitSize),
  iMode(0)
{
  pcFileName = new char[255];
  pSF_TFile = new SFile();
}
TFile::~TFile() {
  // Azzera tutto ed elimina i puntatori.
  iUnitSize = 0;
  iMode = 0;
  delete pcFileName;
  delete pSF_TFile;
}
int	TFile::Open(const char *name, int access, int permission) {
  memcpy(pcFileName, name, 255);
  switch(access) {
  case ReadOnly:
    iMode = ios::in;
    break;
  case (Create | WriteOnly):
    iMode = ios::out;
    break;
  default:
    return 0;
  }
  pSF_TFile->open(name, iUnitSize, iMode);
 
  return pSF_TFile->is_open();
}
int	TFile::Close() {
  // Chiude il file se era aperto
  if (iMode) {
    pSF_TFile->close();
    iMode = 0;
    return 1;
  }
  return 0;
}
int	TFile::Read(void *buffer, int numBytes) {
  // Se il file non e' aperto in lettura restituisce 0.
  if (iMode != ios::in)
    return 0;
  // Legge dal file.
  pSF_TFile->get(buffer);
  // Se la dimensione "da leggere" e' diversa da quella impostata come
  // Unita' di Lettura restituisce 0, altrimenti, il valore che,
  // teoricamente, dovrebbe essere letto:
  return (iUnitSize == numBytes) ? iUnitSize : 0;
}
int	TFile::Write(/*const*/ void *buffer, long numBytes) {
  // Se il file non e' aperto in scrittura restituisce 0.
  if (iMode != ios::out)
    return 0;
  // Scrive sul file.
  pSF_TFile->put(buffer);
  // Se la dimensione "da scrivere" e' diversa da quella impostata
  // come Unita' di Scrittura restituisce 0, altrimenti, il valore
  // che, teoricamente, dovrebbe essere scritto:
  return (iUnitSize == numBytes) ? iUnitSize : 0;
}
long	TFile::Length() {
  // Viene verificata la dimensione del file.
  if (stat(pcFileName, &stat_TFile))
    return 0;
  lFileSize = (long)stat_TFile.st_size;
  return lFileSize;
}
***FINE FILE SOURCE
In teoria si tratta di codice multipiattaforma, tuttavia, io l'ho
compilato con successo solo sotto Linux (in DOS non ho provato).
Ciao, U D A.
-- 
<><><><><><><><><><><><><><><><><><><><><><><><
UDA'Software
mailto:
u...@freemail.it
mailto:
uda.so...@iol.it
http://www.GeoCities.com/SiliconValley/Bay/2165