Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Filename dei files presenti in una Directory
Forum - C/C++ - Filename dei files presenti in una Directory

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Fumetto (Normal User)
Newbie


Messaggi: 4
Iscritto: 08/04/2020

Segnala al moderatore
Postato alle 17:11
Mercoledì, 14/04/2021
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-|

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 21:59
Giovedì, 15/04/2021
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.
PM Quote
Avatar
musical wrighter (Normal User)
Newbie


Messaggi: 17
Iscritto: 26/09/2018

Segnala al moderatore
Postato alle 17:07
Lunedì, 14/06/2021
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

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1318
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 14:08
Martedì, 15/06/2021
@Fumetto:
http://www.pierotofy.it/pages/extras/forum/2/1066529-coman ...
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 il 15/06/2021 alle 14:11


in programmazione tutto è permesso
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6385
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:50
Martedì, 15/06/2021
Testo quotato

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 nessuno il 15/06/2021 alle 15:53


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6385
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:52
Martedì, 15/06/2021
Testo quotato

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 nessuno il 15/06/2021 alle 15:53


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6385
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:56
Martedì, 15/06/2021
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++

  1. #include <windows.h>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.         vector<WIN32_FIND_DATA> files;
  10.         WIN32_FIND_DATA FindFileData;
  11.         HANDLE hFind;
  12.  
  13.         hFind = FindFirstFile(L"\\*.*", &FindFileData);
  14.         if (hFind == INVALID_HANDLE_VALUE)
  15.         {
  16.                 wcout << "FindFirstFile failed " << GetLastError() << endl;
  17.                 return 1;
  18.         }
  19.         else
  20.         {
  21.                 wcout << (FindFileData.cFileName) << endl;
  22.                 files.push_back(FindFileData);
  23.  
  24.                 while (FindNextFile(hFind, &FindFileData))
  25.                 {
  26.                         wcout << FindFileData.cFileName << endl;
  27.                         files.push_back(FindFileData);
  28.                 }
  29.  
  30.                 FindClose(hFind);
  31.         }
  32.  
  33.         return 0;
  34. }



che usa un vector per memorizzare tutti i file/cartelle presenti nella root

Ultima modifica effettuata da nessuno il 15/06/2021 alle 16:15


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
musical wrighter (Normal User)
Newbie


Messaggi: 17
Iscritto: 26/09/2018

Segnala al moderatore
Postato alle 16:35
Giovedì, 17/06/2021
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

  1.  


wstring nome=(FindFileData.cFileName);
Codice sorgente - presumibilmente Plain Text

  1.  


buona serata a tutti

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6385
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:42
Giovedì, 17/06/2021
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.



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo