PDA

Visualizza la versione completa : [C++] Uso di CFileDialog per la selezione di un file


emi81
12-07-2007, 18:12
Sto lavorando ad un progetto MFC multipleviews in visual c++ 6.

Ho la necessità di ricavare il path di un file di testo, che in seguito devo utilizzare.
Per ricavare il path faccio cosi :


CFileDialog dlg(TRUE,NULL,NULL,OFN_EXPLORER|OFN_ENABLESIZING|O FN_READONLY|OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN _PATHMUSTEXIST,"File Txt(*.TXT)|*.txt||",0);
if (dlg.DoModal() == IDOK){
CString filePath = dlg.GetPathName();
}


Cosi funziona tutto, solo che poi se faccio altre operazioni su file, anche in un alrta view, quando chiamo la fclose di un file (qualsiasi) mi da errore.
piu precisamente :


Expression: stream!=NULL

Si è verificato l'errore di exception unknow software exception (0x80000003) nell'applicazione alla posizione 0x102189a1


Ci dev'essere qualcosa che ha a che fare con CFileDialog, perchè provando ad inizializzare la variabile filePath con il percorso ("c:\file.txt") funziona tutto correttamente e non mi da errori nella chiusura di altri file.

Non capisco cosa possa essere..
Sembra come che la dlg.DoModal() apra un file e non lo chiuda, e quando voglio andare io a chiudere un altro file, mi da errore.. ma mi smebra una cosa un po surreale..

Vincenzo1968
12-07-2007, 22:00
Originariamente inviato da emi81

Non capisco cosa possa essere..
Sembra come che la dlg.DoModal() apra un file e non lo chiuda, e quando voglio andare io a chiudere un altro file, mi da errore.. ma mi smebra una cosa un po surreale..

La funzione DoModal() della classe CFileDialog non apre il file; una volta ottenuto il path con dlg.GetPathName(), il file va aperto esplicitamente con fopen ( ma ti consiglio di usare la classe CStdioFile per la gestione dei file in MFC ).

Sembra che l'errore sia dovuto al fatto che tenti di chiudere un file che non è mai stato aperto.

:)

emi81
13-07-2007, 11:17
Sembra che l'errore sia dovuto al fatto che tenti di chiudere un file che non è mai stato aperto.

Hai ragione!
ora devo capire perchè non me lo apre.....

anche perche questo errore è dovuto a una cosa che non centra niente con la CFileDialog.
solo che se faccio quell'operazione poi dopo le alrte funzioni mi danno tutte questo errore..

emi81
13-07-2007, 12:06
io devo creare file di testo con identificativo progressivo e faccio in questo modo :


FILE *file;

sprintf (buffer, "prova%i.txt", cont);

file = fopen(buffer,"w");
if (file != NULL) {
fprintf (file, "hello world");
fclose(file);
}
else return -1;


dove cont è una varibile che incremento

In questo modo il file "prova%i.txt", che prima non esiste, viene creato in automatico.
e tutto questo funziona correttamente fino a quando non apro una dialogbox che serve per settare dei parametri. qui faccio aprore la finestra per selezionare il file.
Quando torno alla finestra in cui faccio ripartire le operazioni di apertura e salvataggio del file non mi crea piu i file "prova%i.txt", mah...

emi81
13-07-2007, 12:52
Ho trovato finalmente l'errore!




La funzione DoModal() della classe CFileDialog non apre il file; una volta ottenuto il path con dlg.GetPathName(), il file va aperto esplicitamente con fopen


Non apre il file, ma setta come path di partenza per l'applicazione, il path dove si trova il file che ho selezionato.
Infatti i file che voglio aprire con la CFileDialog possono trovarsi in qualsiasi zona del conmputer, mentre i file "prova%i" che voglio andare a salvare li voglio andare a salvare in una cartella ben precisa che si trova dove c'è il file eseguibile del mio programma.


Quindi facendo la CFileDialog setto ho il punto di partenza del path differente, e quando lancio :
[code]
file = fopen("./cartella/prova.txt", "w");
[code]
non mi apre il file perchè non trova la cartella.


Per risolvere il problema bisogna aggiungere OFN_NOCHANGEDIR ai vari flag del CFileDialog :unz: :unz: :unz:

Loading