252u3130@fergvax.unl.edu (Phil Dietz) (11/18/90)
Once again I've run into a DOS problem (I sure wish the RKM's had the info in it like it should! What book do I need). I need to change the DateStamp on a ton of files, but I do not know the proper command. I can get it VIA the FILEINFO deally, but how can a change it on disk??? Do I have to recopy the whole file with a new DateStamp or is there a goofy funtion like ChangeDS(FILE *fp, ds_Days, ds_Minute, ds_Tick)....... Phil Dietz <<<=================--------- Cheap Ad ---------===================<<< Phil Dietz SWL Lincoln 565 MEGS! 2 lines 252u3130@fergvax.unl.edu (402)421-1963 AMIGA, IBM, MAC, GIFS IBM'ers and Mac'ers are shopping for a life. Amiga the best!
jjszucs@cbmvax.commodore.com (John J. Szucs) (11/20/90)
In article <1990Nov18.030410.7819@hoss.unl.edu> 252u3130@fergvax.unl.edu (Phil Dietz) writes: >I need to change the DateStamp on a ton of files, but I do not know the >proper command. Under 2.0, the function: BOOL SetFileDate(char *Name,struct DateStamp *DateStamp) while change the date of the file/directory named <Name> to the date in the DateStamp structure DateStamp. For example, to set the date of the file "foo" to 1:05:03 am, Jan 4, 1978 (yes, I chose that DateStamp because it was easy to figure out in my head :-)): ... static struct DateStamp DateStamp ={ 3, /* 3 days since Jan 1, 1978 */ 65, /* 65 minutes past midnight */ 150, /* 150 ticks past minute */ }; BOOL Success; ... Success=SetFileDate("foo",&DateStamp); if (Success) { printf("Succesfully set the date\n"); } else { printf("Couldn't set the date\n"); } >Phil Dietz -- ============================================================================ || John J. Szucs || The opinions expressed are my own and || || Systems Evaluation Group || in no way represent the opinions or || || Product Assurance Department || policies of Commodore Technology, Inc. || || Commodore Technology, Inc. || or any associated entity. || ============================================================================ ...{rutgers|uunet|pyramid}!cbmvax!jjszucs "Nice boys don't play jjszucs@cbmvax.commodore.com rock 'n' roll"
huver@amgraf.UUCP (Huver) (11/20/90)
In article <1990Nov18.030410.7819@hoss.unl.edu>, Phil Dietz wrote: > ... > I need to change the DateStamp on a ton of files, but I do not know the > proper command. Read 1.3 Enhancer manual page 2-25, the SETDATE command. If you need to do it from inside a program, Thad Floryan just posted to comp.sys.amiga (as a follow-up to `compress' spawned question) an example, in C source, by Jeff Lydiatt. NOTICE, however, in Lydiatt's setDate() function he used: arg[1] = (ULONG)IoErr(); /* lock on parent director set by DeviceProc() */ which is incorrect. ParentDir() should be used for this purpose. A similar function that I use with Manx 3.6/5.0 (under WB 1.3 or 1.3.2), modified slightly from original PDmake posting, is attached below. -huver ...!uunet!amgraf!huver -or- huver%amgraf@uunet.uu.net ------ #include <exec/types.h> #include <exec/memory.h> #include <exec/io.h> #include <exec/ports.h> #include <libraries/dosextens.h> #include <string.h> /* * Set date of a given file. * -- !! Uses Manx dos_packet() function !! -- * * Returns: 0 -- all is well; 1 -- whatever error we encounter. */ int setfdate (name, date) char *name; /* C string of file (including path) */ ULONG date[3]; /* desired datestamp, ala DateStamp(). */ { struct MsgPort *task, *DeviceProc(); UBYTE *bcpls, *AllocMem(); BPTR lock, plock, Lock(), ParentDir(); /* heck, need to convert to BCPL string */ if (strlen(name) > 255) return 1; if ((bcpls = AllocMem(256L, MEMF_PUBLIC)) == 0) return 1; /* get file system handler process */ if ((task = DeviceProc(name)) == 0) { FreeMem (bcpls, 256L); return 1; } if ((lock = Lock(name, SHARED_LOCK)) == 0) { FreeMem (bcpls, 256L); return 1; } plock = ParentDir (lock); UnLock (lock); strcpy ((char *)(bcpls + 1), name); *bcpls = strlen (name); dos_packet (task, ACTION_SET_DATE, 0L, plock, (ULONG)bcpls >> 2, date, 0L, 0L, 0L); UnLock (plock); FreeMem (bcpls, 256L); return 0; } /* end setfdate.c */ -- ----- 20th century miracle: "A disk dos not have to be inserted to be examined by DISKED." -- AmigaDOS Technical Reference Manual, 1 & 2ed.
phil@adam.adelaide.edu.au (Phil Kernick) (11/21/90)
huver@amgraf.UUCP (Huver) writes: >If you need to do it from inside a program, Thad Floryan just posted to >comp.sys.amiga (as a follow-up to `compress' spawned question) an example, >in C source, by Jeff Lydiatt. >NOTICE, however, in Lydiatt's setDate() function he used: > arg[1] = (ULONG)IoErr(); /* lock on parent director set by DeviceProc() */ >which is incorrect. ParentDir() should be used for this purpose. I was the one who started the 'compress' discussion, and Lydiatt (and Thad) are correct and you are wrong. Consulting the RKM L&D and looking for DeviceProc() it says that a lock for the parent directory is returned by IoErr() - but remember that if you do any other dos calls inbetween, IoErr() will not return what you think. So the code stub has to go something like... mesg = DeviceProc(<whatever>); stuff the parameters into the struct StandardPacket and using IoErr() to set arg[1], and then call PutMsg. I suspect that you did something else inbetween the DeviceProc and the PutMsg (like maybe a Lock) and this changed the return from IoErr and so you though that this would not work. It does. Phil. -- Phil Kernick EMail: phil@adam.adelaide.edu.au Departmental Engineer Phone: +618 228 5914 Dept. of Psychology Fax: +618 224 0464 University of Adelaide Mail: GPO Box 498 Adelaide SA 5001
ggk@tirith.UUCP (Gregory Kritsch) (11/21/20)
huver@amgraf.UUCP (Huver) writes: >In article <1990Nov18.030410.7819@hoss.unl.edu>, Phil Dietz wrote: >NOTICE, however, in Lydiatt's setDate() function he used: > arg[1] = (ULONG)IoErr(); /* lock on parent director set by DeviceProc() */ >which is incorrect. ParentDir() should be used for this purpose. >A similar function that I use with Manx 3.6/5.0 (under WB 1.3 or 1.3.2), >modified slightly from original PDmake posting, is attached below. On the contrary, using (ULONG)IoErr() is quite correct, and using ParentDir() won't work in most cases. See, DeviceProc() is a somewhat magical function, at the heart of AmigaDOS. You call it with a pointer to a volume:path/filename - it returns in D0 the address of the message port of the associated filesystem, and in IoErr() the parent directory lock relative to the volume:path/filename you passed. This is fully documented in the Tech Ref Man. Calling ParentDir() will only work correctly if there is no volume:path/, or you strip that off before calling ACTION_SET_DATE. It is my understanding that if I pass the name "a/b", the appropriate parent directory lock to pass is the current directory lock, whereas if I pass "a:b/c", the appropriate lock to pass is a lock on a: (obtained from the device list, I think). I've looked through a few filesystems and this seems to be correct. >-huver ...!uunet!amgraf!huver -or- huver%amgraf@uunet.uu.net Gregory Kritsch | University of Waterloo Fido: 1:221/208.11110 [1:163/109.30] | 1A Computer Engineering OCUG: ggk@tirith.ocug.on.ca |---------------------------- UUCP: ggk@tirith.UUCP | The University doesn't get ...!watmath!xenitec!tirith!ggk | a chance to censor me!