Newsgroup: it.comp.lang.c
Titolo: Cambiare data ai file con setftime()

Avrei bisogno di copiare dei file (di testo) e vorrei fare in modo che
la copia dei file avesse la stessa data/ora degli originali ma
purtroppo, per qualche motivo a me oscuro, la data e l'ora vengono
cambiate molto raramente. Ad esempio il programmino qui sotto allegato
(l'esempio fornito dal compilatore) dovrebbe creare un file con la
data corrente, cambiargli la data in 1/1/2001 1:1:1 e poi cancellarlo.
Il cambio di data pero' non avviene quasi mai. Dov'e' l'errore ?
Ho notato che, le rare volte che il programma riesce a cambiare la
data, smette di farlo se da DOS creo il file di test (in pratica
riesce a cambiare la data se il file e' appena stato creato con la
fopen() ma non ci riesce se il file esiste gia'). Mi spiego meglio:
- eseguo il programma piu' volte e funziona
- da dos faccio copy \autoexec.bat test.$$$
- eseguo il programma e non cambia piu' la data
- il file test.$$$ viene cancellato e quindi dovrei trovarmi nella
situazione iniziale. Invece posso eseguire quante volte voglio il
programma che non cambiera' piu' la data.
Ho provato anche ad usare l'interrupt 21 al posto di setftime() ma
anche lui si e' comportato allo stesso modo.
-----------esempio-----------------
#include <stdio.h>
#include <process.h>
#include <fcntl.h>
#include <io.h>
int main(void)
{
   struct ftime filet;
   FILE *fp;
   if ((fp = fopen("TEST.$$$", "w")) == NULL)   {
      perror("Error:");
      exit(1);
   }
   fprintf(fp, "testing...\n");
   filet.ft_tsec = 1;
   filet.ft_min = 1;
   filet.ft_hour = 1;
   filet.ft_day = 1;
   filet.ft_month = 1;
   filet.ft_year = 21;
   system("dir TEST.$$$");
   setftime(fileno(fp), &filet);
   fclose(fp);
   system("dir TEST.$$$");
   unlink("TEST.$$$");
   return 0;
}
Bye/ciao
Verno Vito Valerio
ICQ : 700.84.18
ve...@ibm.net
Genoa - Italy

Mandi !
Premesso che dopo molti anni di inattivitá mi sono rimesso a lavorare .. ( o
meglio ricomincio a ristudiare e a riaggiornarmi sul C e .. C++ )
con questo esempio (una volta ... si faceva cosí ) dovresti poter cambiare
la data di qualsiasi file
premesso che _dos_setftime usa il servizio DOS 0x57,
premesso che file_handle viene associato dalla funzione _dos_open,
premesso che date é unsigned integer in cui i bit :
0-4    day 1-31
5-8    month 1-12
9-15    year 1980-2099
e che date ... :
0-4    seconds diviso 2 : 0-29
5-10    minutes 0-59
11-15    hours 0-23
premesso che se ha successo _dos_setftime ritorna 0 altrimenti torna DOS
error code e la variabile errno al valore ABADF ...
...
#include <dos.h>
#include <fcntl.h>
main()
{
    int handle, year = 1989, month = 12, day = 25 ;
    int hour = 12, minute = 30, second = 40;
    unsigned date, time;
if (_dos_open("TEST.DAT", O_RDWR, &handle) != 0)
    printf("error opening TEST.DAT\n");
else
    {
    date = (year - 1980) << 9;
    date += month << 5;
    date += day;
    time = hour << 11;
    time += minute << 5;
    time += second / 2;
    _dos_setftime(handle, date, time);
    }
}
Non so che compilatore usi ma se lavori in DOS dovrebbe funzionare,
fammi sapere dopo gli esperimenti ! .. se non funziona ristudieró piú a
fondo il caso ... anche perché devo recuperare gli anni di inattivitá !
Mandi di nuovo ! Vito (anch'io !) ma di Udine.

Mandi di nuovo ! Vito (anch'io !) ma di Udine.
Ci ho passato 9 mesi a Udine (militare)
