2009-06-08 22 views
7

L'API di file a 64 bit è diversa su ciascuna piattaforma.Supporto file di grandi dimensioni in C++

in Windows: _fseeki64
in Linux: fseeko
in FreeBSD: ancora un'altra chiamata simile ...

Come posso più efficace rendere più conveniente e portatile? Ci sono esempi utili?

+0

Anche i tipi sono diversi. Windows usa '__int64' e gcc usa' size-t'. Quale sarebbe il modo migliore per 'printf' questi? '"% llu ", (unsigned long long) offset'? – hippietrail

+0

@hippietrail: IMO è off_t/off64_t su gcc – rsjethani

risposta

13

La maggior parte delle piattaforme basate su POSIX supportano il simbolo del preprocessore "_FILE_OFFSET_BITS". Impostandolo su , il tipo off_t sarà 64 bit anziché 32 e le funzioni di manipolazione del file come lseek() supporteranno automaticamente l'offset a 64 bit tramite alcune magie del preprocessore. Dal punto di vista della compilazione, l'aggiunta del supporto di offset dei file a 64 bit in questo modo è abbastanza trasparente, assumendo che si stiano utilizzando correttamente i typedef pertinenti. Ovviamente, l'ABI cambierà se stai esponendo le interfacce che utilizzano il tipo off_t. Idealmente si dovrebbe definire sulla riga di comando, ad es .:

cxx -D_FILE_OFFSET_BITS=64 

per assicurarsi che si applica a tutte le intestazioni OS inclusi dal codice.

Sfortunatamente, Windows non supporta questo simbolo del preprocessore, quindi è necessario gestirlo autonomamente o fare affidamento su una libreria che fornisce il supporto per file di grandi dimensioni multipiattaforma. ACE è una di queste librerie (entrambe basate su POSIX e piattaforme Windows - basta definire _FILE_OFFSET_BITS = 64 in entrambi i casi). So che Boost.filesystem supporta anche file di grandi dimensioni su piattaforme basate su POSIX, ma non sono sicuro di Windows. Altre librerie multipiattaforma forniscono probabilmente un supporto simile.

+0

come impostare questa bandiera da Visual Studio 2008? – savi

+0

Puoi aiutarmi a ottenere questo negli studi di Visual? – savi

+0

@savi: non sono a conoscenza di un equivalente di Visual Studio a '_FILE_OFFSET_BITS = 64'. Se non stai utilizzando una libreria che gestisce in modo trasparente gli scostamenti di file di grandi dimensioni per te, probabilmente dovrai eseguire il rollover del tuo codice per ottenere lo stesso effetto. Ad esempio, la discussione "[Accesso a file enormi in C] (http://coding.derkeiler.com/Archive/C_CPP/comp.lang.c/2006-12/msg03560.html)" dal comp.lang.c il newsgroup descrive un approccio. – Void

2

Il mio suggerimento migliore sarebbe quello di utilizzare una libreria per la gestione di ciò che già esiste.

Un buon candidato potrebbe utilizzare la libreria di file CPL da GDAL. Questo fornisce il supporto per file di grandi dimensioni multipiattaforma per read + write, in ascii e binario. La maggior parte dei formati di file GDAL sono stati implementati e sono ampiamente utilizzati.

0

STLport supporto nativo per dimensioni file 64 bit. D'altra parte, se stai facendo accessi intensivi al disco, potresti voler utilizzare la mappatura dei file: mmap su unix e CreateFileMapping su Windows.

0

Ho scritto una libreria una volta chiamata 'mfile', che sta per 'multi-file'. Il problema era che avevo un sistema che non supportava file di grandi dimensioni, quindi questa libreria avrebbe usato il supporto per i file di grandi dimensioni disponibile su alcuni sistemi, o gestendo il passaggio di più file che avrebbe virtualmente concatenato.

In ogni caso, forniva un'interfaccia simile a "FILE" e funzionava abbastanza bene. Quando ho dovuto effettuare il porting su Windows, è stato facile inserire l'appropriato supporto a 64 bit. Su Unix, _FILE_OFFSET_BITS fornisce abbastanza magia che non ho dovuto giocare troppi giochi per farlo funzionare.

0

Scrivere una classe che incapsuli la gestione dei file e utilizzare la compilazione condizionale nella classe per gestire ciascuna piattaforma.

Quindi utilizzare la classe anziché la gestione dei file nativa quando è necessario accedere a un file dal programma.

Per quanto posso dire, non esiste un set di funzioni di I/O di file universalmente portabili quando si tratta di gestire file di grandi dimensioni.

Problemi correlati