DOMANDA Archiviazione File C++

NS12

Nuovo Utente
2
0
Salve a tutti, non sono troppo esperto in C++ ma vorrei creare un automatismo che mi archivi dei file in varie cartelle, ma mi spiego meglio:

io ho una cartella (es. "C:\Users\userid\Desktop\test") nella quale vengono creati dei file con nomi che seguono determinate regole come "Cod_Cod2_Data" (es. "1234_5678_170308").

io vorrei controllare in contenuto di questa cartella a intervalli regolari e se trovo dei nuovi files non archiviati in cartelle vorrei creare una cartella con nome "cod" e buttarci dentro tutti i file che iniziano con quel cod ("esempio: nella cartella "C:\Users\userid\Desktop\test" ho
123.dir
456.dir
789_123_170803.txt
789_456_170803.txt

Dopo aver avviato il mio "programmino" il contenuto della cartella deve diventare:

123.dir
456.dir
789.dir (all'interno di questa nuova cartella avrò i file 789_123_170803.txt e 789_456_170803.txt)

Per il momento riesco a creare una cartella per ogni nome diverso di file, ma non saprei come leggere i primi "x" caratteri del nomefile per raggruppare quelli con gli stessi prefissi.

Spero di essere stato abbastanza chiaro e spero che sia possibile.
 

NikoPera

Nuovo Utente
88
19
CPU
Intel Core i5-4690 @ 3.5 GHz
Dissipatore
Cooler Master Hyper 212 EVO
Scheda Madre
ASUSTek Z97-K
HDD
850 EVO 120 GB + 7200 rpm 1 TB
RAM
2x4 GB DDR3 1600MHz CL9
GPU
Gigabyte GeForce GTX 970 Gaming G1
Audio
Cuffie Sony Wireless
Monitor
Asus VE248H 24" 1920x1080@60Hz 2ms GtG
PSU
Cooler Master 650W 80+ Gold
Case
Cooler Master K380
OS
Windows 8.1 Pro
premetto che so meno di te in C++ (sono uno studente al 3 anno di informatica), infatti non so il codice per accedere a file e cartelle. Comunque, se il tuo problema è
ma non saprei come leggere i primi "x" caratteri del nomefile per raggruppare quelli con gli stessi prefissi.
allora la soluzione è semplice (il nomefile l'ho messo stringa perchè appunto non so ancora come accedere a file ecc.. )
Codice:
#include <iostream>
#include <conio.h>
using namespace std;
int i=0;

int main () {
   string nomefile="789_123_170803";
   string codicefile;
   int pos=0;
   
   //questo while lo usi solamente se il codice ha lunghezza variabile, altrimenti, sotto, usi .substr(0,lunghezzafissacodice)
   do {
       if(nomefile.at(i)=='_') pos=i;
       i++;
   } while (pos==0);
   
   codicefile=nomefile.substr(0,pos);
   cout<<codicefile;
   
   _getch;
   return 0;
}
 

NS12

Nuovo Utente
2
0
grazie mille NikoPera per il tentativo ma non era quello che cercavo.

Alla fine sono riuscito a fare quello che volevo, vi posto la soluzione se mai dovesse servire a qualcuno.

Ho fatto un semplice file .bat come segue:
Codice:
rem inserire il percorso della cartella da ordinare
cd C:\Users\userid\Desktop\folder

rem adesso prende ogni file presente nella cartella specificata, ne legge il nome fino al primo "_" e crea una cartella col nome letto
for /f "tokens=1 delims=_" %%a in ('dir C:\Users\userid\Desktop\folder /b') do (mkdir %%~na)

rem prende tutti i file che si chiamano allo stesso modo fino al primo "_" e li mette nella cartella corrispondente
for /f "tokens=1 delims=_" %%c in ('dir C:\Users\userid\Desktop\folder /b') do (move %%c_*.* %%~nc)

rem per completezza ho anche aggiunto una seconda istruzione "move" per spostare i file che si chiamano come altri ma che non hanno "_"
rem es. 1324_567.txt, 1234_789.txt, 1234.txt tutti e tre i file andranno nella cartella 1234.dir
for /f "tokens=1 delims=_" %%b in ('dir C:\Users\userid\Desktop\folder /b') do (move %%b %%~nb)

cheers
 
Ultima modifica da un moderatore:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!