Oppure

Loading
14/04/21 15:11
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)
8-|8-|
aaa
15/04/21 19:59
AldoBaldo
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 19/04/21 15: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.
14/06/21 15:07
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
aaa
15/06/21 12:08
Carlo
@Fumetto:
pierotofy.it/pages/extras/forum/2/1066529-comando_di_sistema_windows_in_un_codice_c_mi_sapreste_dire_dove_sto_sbagliando_e_come_deve_essere_eventualmente_cambiato/
ti consiglio di leggerlo con attenzione, perché sull'argomento incalzo AldoBaldo con domande ripetute, e le risposte sono tutte utili.

@musical wrighter:
era una tua domanda, mi sembra che le risposte furono esaustive. :asd:
Ultima modifica effettuata da Carlo 15/06/21 12:11
in programmazione tutto è permesso
15/06/21 13:50
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 15/06/21 13:53
15/06/21 13:52
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)
8-|8-|


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 15/06/21 13:53
15/06/21 13:56
Un semplice esempio di base, a partire dalla documentazione

docs.microsoft.com/en-us/windows/win32/api/fileapi/…

può essere il seguente

#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 15/06/21 14:15
17/06/21 14:35
musical wrighter
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


wstring nome=(FindFileData.cFileName);


buona serata a tutti
aaa