Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Chiarimenti su SystemTimeToFileTime

    Ho un problema che non riesco a spiegarmi:
    il seguente codice C scandisce ricorsivamente un directory
    stampando a video il nome, la dimensione e l'ora di modifica di tutti i files e sottodirectory contenuti nella directory di partenza.

    Non riesco a capire perche' se durante lo sleep modifico un file non ancora letto il programma quando riprende (dopo lo sleep) non si accorge della variazione.
    Ho aggiunto un ciclo for per ripetere l'operazione una seconda volta (vedi codice) ed al secondo passaggio il programma legge correttamente la variazione. E' normale oppure sbaglio in qualcosa, se cosi perche' la prima volta non viene letto l'aggiornamento?
    Inoltre vorrei sapere perche' la trasformazione della SystemTime con la SystemTimeToFileTime mi carica nel buffer un dato FILETIME che non coincide con il numero di 100 nanosecondi a partire dal 1601 come dovrebbe essere, ma un numero piu' piccolo.

    TKS
    codice:
    //*****************
    Questo codice effettua la ricerca del file
    o directory in modo ricorsivo nelle sottocartelle
    ******************/
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    
    WIN32_FIND_DATA ricerca;
    char path [256];
    void search(char*);
    
    void search(char *path)
    	{
    
    	union	{
    			LONGLONG li;
    			FILETIME ft;
    			}lpft,diff,lpft1;
    
    	SYSTEMTIME st;
    
    	char path_cor [256];
    	HANDLE h;
    	chdir(path);
    
    	GetSystemTime(&st);
    	SystemTimeToFileTime(&st, &lpft.ft);
    	printf("ora sistema in filetime %llu\n\n",lpft.li/10000000);
    	int j;
    	for(j=0; j<2;j++)
    		{
    		h = FindFirstFile("*.*", &ricerca);
    		if (h != INVALID_HANDLE_VALUE)
    			{
    			do
    				{
    				strcpy(path_cor,path);
    				if((ricerca.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) !=0)
    					{
    					if( !((strcmp(ricerca.cFileName,".") &&(strcmp(ricerca.cFileName,".."))) ) )
    						{
    						//printf ("DIR . or ..\n");
    						}
    					else
    						{
    						strcat(path_cor,ricerca.cFileName);
    						strcat(path_cor,"\\");
    						printf ("cart: %s\n",path_cor);
    						lpft1.ft=ricerca.ftLastWriteTime;
    						printf ("\ttempoinsecondi cartella: %llu\n\n",lpft1.li/10000000); // stampo il valore i secondi
    						printf ("\ttempo trascorso: %llu\n\n",(lpft.li-lpft1.li)/10000000);
    						search(path_cor);
    						}
    					}
    				else
    					{
    						printf ("File: %s\n",strcat(path_cor,ricerca.cFileName));
    						printf ("\tsize: %10d\n",ricerca.nFileSizeLow);
    						printf ("aspetto.....\n");
    						Sleep(10000);
    						printf (".....riparto\n");
    						lpft1.ft=ricerca.ftLastWriteTime;
    						printf ("\ttempoinsecondi file: %llu\n\n",lpft1.li/10000000); // stampo il valore i secondi
    						if(lpft.li < lpft1.li)
    						printf ("\ttempo trascorso: %llu\n\n",(lpft1.li-lpft.li)/10000000);
    					}
    				}
    			while (FindNextFile(h, &ricerca));
    			}
    		else
    			{
    				printf("Errore %d\n", GetLastError ());
    			}
    		FindClose(h);
    		}
    	}
    	
    int main()
    	{
    		char * path="C:\\Documents and Settings\\giancarlo\\Desktop\\PROVE\\";
    		printf ("path di partenza %s\n\n",path);
    		search(path);
    		exit (0);
    	}
    Tks a lot

  2. #2
    usa i tag
    {code}
    tuo codice sorgente
    {/code}
    oppure
    {php}
    tuo codice sorgente
    {/php}

    in cui al posto delle graffe usi le quadre, altrimenti non si capisce niente ;-)

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Evidentemente FindFirstFile e FindNextFile non riconosce eventuali modifiche fatte a file e cartelle, una volta "partiti" con la ricerca (e cio è con FindFirst, che restituisce l'Handle con cui continuare).

    Dunque, o dopo lo sleep devi ricominciare la ricerca daccapo, o puoi cercare di capire solo le modifiche effettuate ai file dal tuo sleep in poi, con FindFirstChangeNotification.

    Comunque potresti indentare un pò il codice.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.