
Fumetto (Normal User)
Newbie
    
Messaggi: 4
Iscritto: 08/04/2020
|
Sto imparando ad usare il C++, (con Visual Studio 2019), sono alle prime armi:
vorrei leggere tutti i nomi dei files presenti in una specifica directory.
Sostanzialmente chiedo se esiste in C++ una funzione che ritorna (in una array di chars, oppure in una struttura od altro) i nomi di tutti i files presenti in una Directory esistente (dopo dovrò andare ad analizzare singolarmente questi files di testo, ma questo non è un problema)

|
|

AldoBaldo (Member)
Guru
    
Messaggi: 708
Iscritto: 08/01/2015
|
Quel che ne so non è particolarmente aggiornato, ma credo che ti tocchi rivolgerti al sistema operativo, o a qualche libreria (che comunque si rivolgerà indirettamente al sistema operativo).
Per "scorrere" il contenuto di una cartella in Windows esistono FindFirstFile() e FindNextFile(). Prova a cercare nei vecchi thread di questo forum, mi sembra di ricordare che la questione sia già venuta fuori in passato.
Modifica del 19/4: devo perdere l'abitudine di rispondere a chi non ha gia' scritto almeno un tot di messaggi precedenti.
Ultima modifica effettuata da AldoBaldo il 19/04/2021 alle 17:02
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|

musical wrighter (Normal User)
Newbie
    
Messaggi: 20
Iscritto: 26/09/2018
|
Purtroppo anch'io come Fumetto sto cercando di mettere insieme un codice che compili e funzioni a questo scopo e fin'ora quel che mi pare ci vada più vicino siano i comandi find first file e find next file. Ma parlavi di array di chars. Invece la cosa più comoda se condo me sarebbe se fosse fattibile raccogliere i nomi dei file o delle sottocartelle quel che sono in un array dinamico di tipo string o wstring. Perché un nome non è composto da un singolo carattere. Saresti costretto a dichiarare tanti array quanti sono i file all'interno della cartella. Informazione quest'ultima che potresti anche non avere a priori
|
|

Carlo (Member)
Guru^2
    
Messaggi: 1427
Iscritto: 29/01/2018
|
Ultima modifica effettuata da Carlo il 15/06/2021 alle 14:11
in programmazione tutto è permesso |
|

()
Newbie
    
Messaggi:
Iscritto:
|
Postato originariamente da musical wrighter:
Purtroppo anch'io come Fumetto sto cercando di mettere insieme un codice che compili e funzioni a questo scopo e fin'ora quel che mi pare ci vada più vicino siano i comandi find first file e find next file. Ma parlavi di array di chars. Invece la cosa più comoda se condo me sarebbe se fosse fattibile raccogliere i nomi dei file o delle sottocartelle quel che sono in un array dinamico di tipo string o wstring. Perché un nome non è composto da un singolo carattere. Saresti costretto a dichiarare tanti array quanti sono i file all'interno della cartella. Informazione quest'ultima che potresti anche non avere a priori |
E qual è il problema? Non sei ancora riuscito con FindFirstFile/FindNextFile ?
Puoi usare gli array di array di chars, sai cosa sono? Ultima modifica effettuata da il 15/06/2021 alle 15:53 |
|

()
Newbie
    
Messaggi:
Iscritto:
|
Postato originariamente da Fumetto:
Sto imparando ad usare il C++, (con Visual Studio 2019), sono alle prime armi:
vorrei leggere tutti i nomi dei files presenti in una specifica directory.
Sostanzialmente chiedo se esiste in C++ una funzione che ritorna (in una array di chars, oppure in una struttura od altro) i nomi di tutti i files presenti in una Directory esistente (dopo dovrò andare ad analizzare singolarmente questi files di testo, ma questo non è un problema)
 |
Il C e il C++ non sanno nulla circa il trattamento del filesystem. Devi usare le funzioni specifiche di libreria del sistema che usi.
Se scrivi per Windows, utilizza le API FindFirstFile/FindNextFile. Cerca e studia bene la documentazione. Ultima modifica effettuata da il 15/06/2021 alle 15:53 |
|

()
Newbie
    
Messaggi:
Iscritto:
|
Un semplice esempio di base, a partire dalla documentazione
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/ ...
può essere il seguente
Codice sorgente - presumibilmente C++ |
#include <windows.h> #include <iostream> #include <vector> using namespace std; int main() { vector<WIN32_FIND_DATA> files; WIN32_FIND_DATA FindFileData; HANDLE hFind; hFind = FindFirstFile(L"\\*.*", &FindFileData); if (hFind == INVALID_HANDLE_VALUE) { wcout << "FindFirstFile failed " << GetLastError() << endl; return 1; } else { wcout << (FindFileData.cFileName) << endl; files.push_back(FindFileData); while (FindNextFile(hFind, &FindFileData)) { wcout << FindFileData.cFileName << endl; files.push_back(FindFileData); } FindClose(hFind); } return 0; }
|
che usa un vector per memorizzare tutti i file/cartelle presenti nella root
Ultima modifica effettuata da il 15/06/2021 alle 16:15 |
|

musical wrighter (Normal User)
Newbie
    
Messaggi: 20
Iscritto: 26/09/2018
|
Rispondo sia a Carlo che a Nessuno anche se premetto che se adesso Fumetto ci dice che dopo aver letto tutte le risposte a risolto tanto meglio per lui soprattutto. La domanda l'ha posta lui dopo tutto quindi l'obbiettivo è quello. Carlo si ricordo d'aver aperto quel topic anno scorso ma alla finfine la sola cosa che sono riuscito a far funzionare correttamente e che s'avvicina di più allo scopo è system("dir"). Ma apparte che non dovremmo esortare nessuno in ogni caso ad usare system per inserire del batch in un codice c++ in più in questo modo l'eseguibile ha il piccolo effetto collaterale di crearti un nuovo file di testo nella cartella. In cui successivamente si può andare a rileggerne il contenuto includendo la libreria fstream e dichiarando una variabile di tipo ifstream che punti allo stesso file appena generaro. ma Si tratta di una tattica di fortuna che ho tra virgolette inventato per ottenere indirettamente un elenco del contenuto della cartella dove si trova l'eseguibile stesso. Ma ribadisco che è un ripiego in mancanza d'altro di meglio. Nessuno sta mattina partendo dall'esempie che hai scritto nell'ultimo messaggio ho messo insieme un codice che compila ma l'eseguibile non fa che aprirsi e richiudersi. Giusto per chiarezza, suggerite tutti di usare array di char in stile c classico perché voi personalmente li preferite o perché i metodi FindFirstFile e FindNextFile sono proprio incompatibili con le stringhe? non è la prima volta che tento un modo che penso mi possa copiare il nome di un file nel valore di una string o di una wstring, e non da errori di compilazione ma a quanto pare non compie nemmeno quest'operazione.
in questo modo
Codice sorgente - presumibilmente Plain Text |
wstring nome=(FindFileData.cFileName);
Codice sorgente - presumibilmente Plain Text |
buona serata a tutti |
|

()
Newbie
    
Messaggi:
Iscritto:
|
Come sicuramente saprai, se lanci un eseguibile per una applicazione console, è normale che questo apra la console, esegua il codice e la chiuda.
Se vuoi vedere i risultati,
apri tu la console (comando cmd) ed esegui l'exe al suo interno
OPPURE
inserisci come ultima istruzione prima del return, un input di una variabile di comodo che permetta di non chiudere subito la console.
Sono tutte conoscenze di base che davo per scontate.
In merito alle stringhe, non vedo il problema. Nell'esempio che ti ho indicato puoi memorizzare nel vector oggetti con le informazioni per i file (oltre al nome), ma se ti interessa solo il nome, allora basta cambiare il tipo di vector
vector<wstring> files;
e le push_back con
files.push_back(FindFileData.cFileName);
Infine, per quanto riguarda la
wstring nome = FindFileData.cFileName;
senza le parentesi non necessarie, non vedo problemi. Non capisco quali errori hai, con cosa stai compilando e con quali settaggi.
|
|