Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] Creare o modificare file in una cartella in AppData

    Salve a tutti,
    ho creato un programma che ha bisogno di creare e modificare dei file di testo, che pensavo di tenere in una cartella apposita in AppData. Il codice che ho scritto è:
    codice:
    ofstream f("%APPDATA%\\NomeProgramma\\documento.txt");
    if(!f) {
    cout<<"Errore nella creazione del file!";
    return false;
    }
    
    f<<"testo di prova";
    
    f.close();
    Questo codice l'ho provato in Windows XP senza successo. Vorrei che funzionasse su tutte le versioni da XP in poi.
    Da sempre errore e non crea il file.
    Come posso fare?
    Ringrazio in anticipo.

  2. #2
    1. Le variabili d'ambiente non vengono espanse nei percorsi che passi a ofstream/fopen & co. Per ottenere il valore di una variabile d'ambiente devi usare getenv.
    2. Se non esiste la directory NomeProgramma, non viene creata automaticamente; devi usare la API CreateDirectory per crearla.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    ah ok, prima di questo ho creato la cartella come mi hai detto te, ma mi da ancora errore.
    Non ho capito come mi possa servire la prima informazione che mi hai dato, puoi farmi un esempio più pratico?
    Grazie

  4. #4
    Quando scrivi %APPDATA%\MioProgramma nel prompt dei comandi, cmd.exe prima di farci qualunque cosa espande le variabili d'ambiente (nello specifico APPDATA), costruendo così il percorso "vero" (tipicamente qualcosa del tipo c:\Users\nomeutente\AppData\Roaming); questa operazione non viene fatta da praticamente nessuna funzione/classe che opera su percorsi in C/C++, per cui ofstream crede di dover creare il file in una cartella che si chiama letteralmente "%APPDATA%" (che non esiste, per cui ottieni l'errore).

    Quello che devi fare è espandere "manualmente" la variabile d'ambiente appdata e costruire il percorso di conseguenza; quindi:
    codice:
    std::string appData = getenv("appdata");
    std::string myDir = appData + "\\NomeProgramma";
    CreateDirectory(myDir.c_str(), NULL);
    ofstream f((myDir + "\\documento.txt").c_str());
    ...
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Grazie mille.
    Per prendere il percorso di %APPDATA% ho fatto così:
    codice:
    TCHAR appData[MAX_PATH];
    SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, appData);

  6. #6
    Anche meglio.
    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 © 2021 vBulletin Solutions, Inc. All rights reserved.