Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C] Copiare file in cartella con spazi nel nome

    Mi sono accorto che se si vuole copiare (o comunque compiere operazioni tipo taglia o cancella) un file in una cartella chiamata ad esempio "prova prova" il programma da errore, mentre se la cartella si chiama "prova_prova" il file viene copiato correttamente.
    Dato che mi serve di copiare file in una cartella contenente spazi nel nome, come posso fare?
    Ci sono comandi/librerie specifici?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Come stai copiando il file?

    Utilizza i doppi apici " all'inizio e alla fine del nome del file ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Il comando è questo:
    codice:
    sprintf(command,"copy %s C:\\Programmi\\Adobe\\Adobe Photoshop CS2\\Presets\\Brushes\\",brush);
    system(command);
    La variabile del comando è già stata dichiarata.

  4. #4
    Ti ha gia risposto Oregon, leggi bene la risposta i doppi apici devono racchiudere il nome del file (il percorso).

  5. #5
    In ogni caso, non mi stancherò mai di ripeterlo, non bisogna mai usare la funzione system, poiché non è portabile, non ti dà alcun feedback sul risultato dell'operazione (non restituisce infatti il valore di ritorno del comando lanciato, ma della shell) ed è assolutamente inefficiente (ogni volta che chiami la system avvii almeno un processo inutilmente, quello dell'interprete dei comandi). Inoltre è facile imbattersi in problemi come quello che è stato evidenziato qui, che non si verificherebbero chiamando le apposite funzioni che esistono per effettuare questo genere di lavori, come la API CopyFile su Windows; se non si desidera usare le API specifiche della piattaforma si può anche scrivere facilmente una funzione di copia con le sole funzioni standard di IO su file.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    A parte la "bruttura", come già ti ha detto MItaly, del comando, penso tu debba "doppio escapare" gli spazi. Ad esempio: "nome file" -> "nome\\ file".

  7. #7
    Ragazzi grazie delle risposte, ma io purtroppo sono alle prime armi perciò non conosco queste differenze, a me così hanno detto di fare e così faccio...
    Comunque il problema non sta tanto nel file con lo spazio nel nome, ma nella cartella di destinazione che cel'ha!

  8. #8
    Metti le virgolette anche lì, come faresti al prompt dei comandi.
    codice:
    //FIXME: non si usa la system; la system è il male!
    sprintf(command,"copy \"%s\" \"C:\\Programmi\\Adobe\\Adobe Photoshop CS2\\Presets\\Brushes\\\"",brush);
    system(command);
    ... e sputa in un occhio a chi ti ha detto di fare così.
    L'alternativa corretta è usare una funzione come questa:
    codice:
    /* Copia il file inFile in outFile; restituisce il numero di byte copiati */
    size_t copy_file(char * inFile, char * outFile)
    {
        FILE *in,*out;
        if((in=fopen(inFile,"rb"))==NULL)
            return 0;
        if((out=fopen(outFile,"wb"))==NULL)
        {
            fclose(in);
            return 0;
        }
        size_t len, tot=0;
        char buffer[1024];
        
        while((len = fread(buffer,1,sizeof(buffer),in)) > 0)
        {
            fwrite(buffer,1,len,out);
            tot+=len;
        }
        fclose(in);
        fclose(out);
        return tot;
    }
    .
    Esempio di utilizzo:
    codice:
    char buffer[260]="C:\\Programmi\\Adobe\\Adobe Photoshop CS2\\Presets\\Brushes\\";
    strncat(buffer,brush,sizeof(buffer));
    file_copy(brush,buffer);
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Wow questi source sono pieni di comandi che non conosco. :S
    Grazie, cercherò di capirci qualcosa!

  10. #10
    Originariamente inviato da Perfidious
    Wow questi source sono pieni di comandi che non conosco. :S
    Questo mi preoccupa molto...
    Grazie, cercherò di capirci qualcosa!
    Prego, figurati.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.