2011-07-24 22 views
9

Sembra che questa domanda sia piuttosto semplice ma non riesco a trovare la soluzione chiara per copiare i file in C senza dipendenza dalla piattaforma.Come posso copiare file in C senza dipendenza dalla piattaforma?

Ho usato una chiamata system() nel mio progetto open source per creare una directory, copiare file ed eseguire programmi esterni. Funziona molto bene con Mac OS X e altri sistemi Unix-ish, ma non funziona su Windows. Il problema era:

system("cp a.txt destination/b.txt"); 
  • Windows utilizza le barre rovesciate per separatore di percorso. (vs slash in Unix-ish)
  • Windows utilizza 'copia' per il comando di copia interna. (vs cp in Unix-ish)

Come posso scrivere un codice di copia senza dipendenza?

(A dire il vero, ho scritto le macro per risolvere questi problemi, ma non è cool. http://code.google.com/p/npk/source/browse/trunk/npk/cli/tests/testutil.h, L22-56)

+0

problema non è appeso a 'copiare' come ho detto sopra. – lqez

risposta

6

È necessario utilizzare le funzioni della libreria standard C in stdio.h.

In particolare, sarà sufficiente fopen, fread, fwrite e fclose.

Assicurarsi di includere l'opzione b ("binario") nei flag su fopen.

[modifica]

Purtroppo, i nomi dei file stessi (forward-slash contro back-slash) sono ancora dipendente dalla piattaforma. Quindi avrai bisogno di una sorta di #ifdef o simile per affrontarlo.

Oppure è possibile utilizzare uno cross-platform toolkit.

+0

Grazie per la risposta. Ma i toolkit cross-platform sono troppo grandi per il mio piccolo progetto. Non esiste una soluzione semplice per risolvere il problema di slash? – lqez

+2

Poiché le organizzazioni di directory sono specifiche della piattaforma, non esiste un modo completamente banale. Tuttavia, a livello di API, Windows accetta barre o barre rovesciate nei nomi dei percorsi (è la shell cmd.exe che richiede barre rovesciate). Quindi, finché i nomi di Unix non contengono mai una barra rovesciata (e probabilmente nemmeno i due punti), sarai OK. –

+0

@ Jonathan: OK, ammetto che non lo sapevo. Che dire dei nomi di file con barre in essi, che sono legali su Windows?Forse dovrei provarlo qualche volta :-) – Nemo

0

Utilizzare la libreria C standard stdio.h. Aprire il primo file di input per la lettura utilizzando fopen(inputFilename, "rb") e aprire il file di output per la scrittura utilizzando fopen(outputFilename, "wb"), copiare il contenuto utilizzando fread e fwrire. Quindi chiudi entrambi i file usando fclose.

8

La funzione system() è molto più difficile di quanto valga; invoca il guscio in un processo separato e di solito dovrebbe essere evitato.

Invece fopen()a.txt e dest/b.text, e utilizzare getc()/putc() per fare la copia (poiché la libreria standard è più probabile che fare pagina allineato buffer di te)

FILE *src = fopen("a.txt", "rb"); 
FILE *dst = fopen("dest/b.txt", "wb"); 
int i; 
for (i = getc(src); i != EOF; i = getc(src)) 
{ 
    putc(i, dst); 
} 
fclose(dst); 
fclose(src); 
+0

Grazie per aver risposto. Ma non risolve il problema del separatore di percorsi. – lqez

+1

Secondo: http://msdn.microsoft.com/en-us/library/77859s1t(v=VS.71).aspx i separatori di percorso sono un problema 'system()', non uno 'fopen()'. Fallisce nel sistema a causa della chiamata della shell. – Dave

+0

Apprezzo davvero il tuo aiuto. – lqez

Problemi correlati