|
||||
|
|
#1 (permalink) |
|
Nuovo della community ![]()
13 Messaggi
![]() |
Salve, Vi chiedo aiuto per poter risolvere un problema:
Ho in una dir una serie di file all'interno dei quali vi sono le informazioni che mi servono. Io riesco a scegliere i file da leggere e a scrivere le informazioni (data aaaammgg, e n. file xxx) richieste in un altro file ma quello che non riesco proprio a fare è scrivere nel file la sola data e n. file + nuova. Mi spiego meglio il numero file arriva a 099 e poi riparte da 001, se prendo in considerazione il valore + alto, quando ho 5 file dal 097 allo 002 mi dà come risultato il 099 anzichè il 002 quindi la data mi può aiutare, dovrei stabilire quale numero file è il più nuovo. Per favore aiutatemi a trovare una soluzione... Grazie anticipatamente. codice:
#include <dirent.h>
#include <iostream>
#include <string.h>
using namespace std;
main ()
{
FILE *fo,*fi;
string path;
DIR* d;
char buf[20];
d = opendir(path.c_str());
dirent* f;
fo = fopen("ag.txt", "w");
if (fo == NULL) {
printf("Errore aprendo il file 'fo'\n","ag.txt");
exit(0);
}
while (f = readdir(d))
{
strncpy(buf,f->d_name,20);
if (!strncmp(buf, "aggbd0", 6))
{
char appo[20]= "";
char app1[650]= "";
fi = fopen(buf, "r");
if (fi == NULL) {
printf("Errore aprendo il file 'fi'\n","ag.txt");
exit(0);
}
fgets(app1,641,fi);
strncpy(appo,app1+629,11);
fclose(fi);
fprintf(fo,"%s\n",appo);
}}
fclose(fo);
}
Il tracciato tipo (prima riga): xxxxxxxxxx19 114171 xxxxTxxxxxIExxxx xxxxxG xxL 20090105800000522800002700200701318000005131000026 5020011231800000503400002600 000000000000000000000000 0000000000000000000000000309 00000000 00000000Y00000000 B03BA0193180990000000000000000000S 0000000019960714199607153 C 00000000 00000000 00000000 00000000B 00000000 00000000 00000000 E 0 0606 1066601011 00000000 000000000000000 000000000000000 000000000000000 10110011578000000000000000000000000 20091005048 Grazie. l.V. P.S.: compilo con borland bcc32 ver. 5.5.1.1 Ultima modifica di bottomap : 26-01-2010 a 16:45. |
|
|
|
|
|
#2 (permalink) |
|
Moderatore Globale ![]() ![]()
2,774 Messaggi
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Ciao,
Se puoi usare le API win32, puoi ottenere dale GetFileAttributesEx (GetFileAttributesEx Function (Windows)) una struttura WIN32_FILE_ATTRIBUTE_DATA contenente tra le altre cose la data di ultimo accesso, la data di creazione e quella di ultima modifica. Chiaramente poi dovrai utilizzare le informazioni per "ordinare" il tuo insieme di file. In alternativa le numerose varianti della funzione _fstat (_fstat, _fstat32, _fstat64, _fstati64, _fstat32i64, _fstat64i32) ti permettono di ottenere la stessa informazione. In alternativa potresti aprire tutti e cinque i file e stabilire, controllando il contenuto, quale dei tre contiene la data maggiore... Ciaociao ![]()
__________________
![]() Venite a farmi un saluto su http://www.bottomap.com/ - Come porre domande in modo intelligente - Hai mai dato un'occhiata al Regolamento del Forum? Se la risposta è no, sarebbe proprio l'ora di farlo... - Se un utente ti è stato d'aiuto usa il pulsante Commenta Intervento per aumentare la sua reputazione! "La violenza è l'ultimo rifugio degli incapaci" - I.Asimov (per chiunque se lo fosse mai chiesto, il nick Bottomap è volutamente sgrammaticato) |
|
|
|
|
|
#3 (permalink) | |
|
Nuovo della community ![]()
13 Messaggi
![]() |
Quote:
gli attributi non possono essere d'aiuto in quanto negli n files sono tutti uguali == l'unica mi sembra quella di aprire gli n files e stabilire quale ha la data più recente. In effetti è quello che faccio con il listato che ho pubblicato, genero un files "ag.txt" con all'interno i dati richiesti presi da ogni files con la struttura seguente: ... 20091023063 20091026064 20091027065 20091028066 20091029067 20091030068 20091102069 20091103070 20091104071 20091105072 ... ora dovrei aprire questo file "ag.txt", stabilire quale riga contiene la data più recente e creare un ulteriore file vuoto nominandolo con il numero agg - gli ultimi tre byte della riga contenente la data più recente -. Grazie. lV |
|
|
|
|
|
|
#4 (permalink) | |
|
Moderatore Globale ![]() ![]()
6,639 Messaggi
![]() ![]() ![]() ![]() ![]() ![]() |
Quote:
C'è l'orario di creazione, ultimo accesso ... e quello è indicativo ...
__________________
Antonio GIULIANA |
|
|
|
|
|
|
#5 (permalink) | |
|
Nuovo della community ![]()
13 Messaggi
![]() |
Quote:
![]() Date uguali, orari uguali, sono generati da un front-end al momento della richiesta e quindi differiscono per i dati contenuti e per il nome... |
|
|
|
|
|
|
#6 (permalink) |
|
Moderatore Globale ![]() ![]()
6,639 Messaggi
![]() ![]() ![]() ![]() ![]() ![]() |
Uguali ... ?
Prova a controllare i valori restituiti per i vari file (Creazione, UltimoAccesso, UltimaScrittura) inserendo nella CreateFile il percorso e il nome del file in questo codice ... codice:
HANDLE hFile;
FILETIME ftCreate, ftAccess, ftWrite;
hFile = CreateFile("...", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite);
CloseHandle(hFile);
ULARGE_INTEGER uli;
uli.LowPart = ftCreate.dwLowDateTime;
uli.HighPart = ftCreate.dwHighDateTime;
ULONGLONG s1(uli.QuadPart/10000 );
cout << "Create: " << s1 << endl;
uli.LowPart = ftAccess.dwLowDateTime;
uli.HighPart = ftAccess.dwHighDateTime;
ULONGLONG s2(uli.QuadPart/10000 );
cout << "Access: " << s2 << endl;
uli.LowPart = ftWrite.dwLowDateTime;
uli.HighPart = ftWrite.dwHighDateTime;
ULONGLONG s3(uli.QuadPart/10000 );
cout << "Write : " << s3 << endl;
__________________
Antonio GIULIANA |
|
|
|
|
|
#7 (permalink) | |
|
Nuovo della community ![]()
13 Messaggi
![]() |
Quote:
Io compilo con Bcc32, non riesco a compilare il tuo listato puoi indicarmi come posso fare? Posso inviarti i files così ci dai un'occhiata anche tu, Per me hanno tutti gli stessi attributi !?! Se vuoi te li posso mettere a disposizione su un ftp ma quando li scarichi e li salvi in locale cambierà la data di creazione, l'ora ecc... oppure dimmi tu. Ti ringrazio per la tua gentile collaborazione. lV |
|
|
|
|
|
|
#8 (permalink) |
|
Moderatore Globale ![]() ![]()
2,774 Messaggi
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Ciao,
Il codice postato da Antonio utilizza le API di windows... non dovresti aver problemi a compilare anche con bcc32. Che errori ottieni (non riesco a compilare è un'indicazione un po'generica)? Per il problema in sé, è molto difficile che sulla stessa macchina due file vengano creati con lo stesso timestamp (in creazione, ultimo accesso o modifica)... visto che il processore è uno ed il disco è uno (se eventualmente anche il processo che genera i file è uno solo, hai sostanzialmente la certezza). Le risoluzione minima del dato ottenuto con la GetFileTime o la GetFileAttributesEx (alal fine lavori sempre con la stessa struttura FILETIME) è di 10 millisecondi per la data di creazione, 2 secondi per la modifica e un valore più alto per l'ultimo accesso (variabile anche a seconda del file system). La data di creazione dovrebbe essere abbastanza univoca, a meno che non crei file ad una velocità inferiore a 10ms... se invece devi controllare la data di modifica, può darsi che entro due secondi due file abbiano lo stesso timestamp, in caso la cosa migliore è fare qualche prova... Ciaociao ![]()
__________________
![]() Venite a farmi un saluto su http://www.bottomap.com/ - Come porre domande in modo intelligente - Hai mai dato un'occhiata al Regolamento del Forum? Se la risposta è no, sarebbe proprio l'ora di farlo... - Se un utente ti è stato d'aiuto usa il pulsante Commenta Intervento per aumentare la sua reputazione! "La violenza è l'ultimo rifugio degli incapaci" - I.Asimov (per chiunque se lo fosse mai chiesto, il nick Bottomap è volutamente sgrammaticato) |
|
|
|
|
|
#9 (permalink) | |
|
Moderatore Globale ![]() ![]()
6,639 Messaggi
![]() ![]() ![]() ![]() ![]() ![]() |
Quote:
Spero tu abbia inserito tutti gli include necessari, tra cui, ovviamente #include <windows.h>
__________________
Antonio GIULIANA |
|
|
|
|
|
|
#10 (permalink) | |
|
Nuovo della community ![]()
13 Messaggi
![]() |
Quote:
infatti non avevo inserito l' #include <windows.h> e mi davauna miriade di errori. adesso è tutto ok, controllo e ti faccio sapere... ![]() Ciao... |
|
|
|
|
![]() |
| Strumenti della discussione | |
| Modalità di visualizzazione | |
|
|
Tutti gli orari sono GMT +1. Attualmente sono le 04:57.
















Modalità lineare

