F.G.H. 3/26/85 LispCourse #16: Files and Directories œ Part 2 LispCourse #16: Files and Directories œ Part 2 Update on Processes When dealing with processes, I neglected to mention the following situation: For each formatting menu that is used in TEdit, a new TEdit process is started. Thus if you have one TEdit running with the Paragraph-Looks Menu open above that window, you will see 2 Tedit processes running in your PSW. The process called TEdit will refer to the TEdit itself, and the process called TEDIT#2 will refer to the process operating the Paragraph Menu. This situation can sometimes be confusing!! ˈˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€""""""""""""""""""""""""" """"""""""""""""""""""""" ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€""""""""""""""""""""""""" """"""""""""""""""""""""" ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€ € €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ€€@€€>xpऄ>@ € D!¤ @ € D!ô @€€Dpâ‡Ï‘ @€€@ €@ €@€€@€€ñóÁG@ €ˆB!H€@ €ˆB'è€@€€ðB"@€€ C‚@ €BÄ@ €ˆB@€€ˆB€@€€@ €@ €@€€@€€ãç€@ €„@@ €„@@€€à„@@€€@‡€@ € „@ €„@€€„@€€@ €@ €@€€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆÀ€€|ø@Ž@ €""""2¢2""³""""@ €€ÑÇÑ@€€ˆˆˆˆ˜ù¸ÊŠˆˆˆˆÀ€€B@ €""""2£2b?ª""""@ €0BJ@€€ˆˆˆˆ˜øØÉŠŸˆˆˆˆÀ€€@ €""""""""""""""@ €@€€@€€"D!H|@ €"DaH@@ €"(gè@@€€>(¢ˆx@€€"¢ˆ"@@ €"¯È>@@ €"¥"@@€€"øâ%Ÿ"@@€€@ €@ €@€€@€€Dá‡Ç>x@ €"l‘A‘ D@ €l‘QA‘ D@€€TñQAD@€€@ €@ €@€€@€€ˆâ#€@ €Ù$H@ €Ù$H@€€©#@€€© ˆ@ €©$H@ €©$H@€€ˆáÀ@€€@ €@ €@€€@€€|ùƒˆ|q@ €±A‰@ €±A‰@€€ñQAð@€€R!"@ €Sá >‰@ €R! "‰@€€Èù#Š"q@€€@ €@ €@€€@€€8ˆLJ>8p@ €‘"D$H‘ Dˆ@ €‘"D $H‘ Dˆ@à€"@à'ˆ<0`@À€"@Å @ €’"Dˆ‘ Dˆ@ €‘"DˆBH‘ Dˆ@À€8ˆBG>8p@À€@ €@ €@À€@À€ùð €@ €! @ €!£@À€!â`„@À€! „@ €! „@ €!`„€@à€!ñ ƒ@€€@€€@€€@€€@€€"|p@€€"@ˆ@€€@ˆ@€€x€@€€@€@€€@ˆ@€€"@ˆ@€€"|p@€€@€€@€€@€€@€€Žùò‡>Dùà@€€ ‘"(!„ d@€€ ‘"(!„ d@€€ Œ (!âDù@€€@€€@€€@€€@€€ ñÂ>@pãçÈŸ<@€€ ‰$E @!„ "@€€‰$E @!„ "@€€‰$<@ À‡Šž<@€€ñÅÈ„ @ „ (@€€O„ @!„ $@€€H„ @!„ "@€€€âˆ„>|pà‡ÈŸ"@€€@€€@€€@€€@€€AñÄOžxðáÇÇ@€€@@†ÈD‰$‘@€€ @†ÈD‰$‘@€€ @…ODñ† @€€@…Hx¡@€€@…H@‘$‘@€€@…H@‰$‘@€€AÄO‘@ˆáÇÇ@€€@€€@€€@€€@€€xq'€@€€Bˆ’"D‰$@@€€Bˆ”"D‰$@@€€ˆ x‰¤@@€€$H.P‰¤@@€€'È’"H‰d@@€€$H‘"D‰d@@€€ÄGDpâ'€@€€@€€@€€@€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀ€€€€€€€€€Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù€ € €ãø‰<H €@‰B$H €@‰$ H €à@ Qü@H €@ Q H €@ QH €@!BH €à@!<OÏÀ € € € € €üAÇÀøþ>?„适A$ €AA €‚"$@€@ A €ü"Ä€ü< A €‚$øø€ €‚$€€A €‚ˆ$ @€A A €üOÇÀþ> A € € € € €ãú@ Ÿ‡€#Aþ €B P0@#A€ €Aà( #¡ € €àAP$Ÿ  ¡@ü €@ @$ ¡ € €@ " ¡ñ€ €@@!@B € €à@@ €B þ € € € € àñý@øü€ñ|| Ÿ €!@‚@ ‚B@0‰€ ˆ@‚@ €B@(I€ð ˆ@ø‚~ áxB~$I€ P@ü@|@$I€ P@‚@ @@"I€ ‚@ € ‚@@!‰€ð @ø‚ @ðø|@ Ÿ €@ € €Ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ˆˆˆˆ˜A(@$J„ Dð@ˆˆˆˆ˜AH$@$I„"D€@""""8AH"@ $I„"D€@""""8!ãã‘"| È„8€@ˆˆˆˆ˜ ˆˆˆˆ˜ Dealing with Directories The Connected Directory At any given time you are connected to some device and directory. Connecting to a device and directory means that that device/directory is used as the default whenever a file name is specified with no device and/or directory. Whenever a file name is specified without a device and path name, the device/pathname is assumed to be the current connected directory. Essentially, the connected directory is appended to the beginning of every file name that you type in without a device and path name. If a file name is specified with a path name but without a device, then the device part of the current connected directory is used as the device. Examples: Connected Directory: {Phylum}lisp> File Name: init == {Phylum}lisp>init File Name: new>init == {Phylum}lisp>new>init File Name: lisp>init == {Phylum}lisp>init File Name: {Eris}lisp>init == {Eris}lisp>init Form: (DELFILE 'ABC) == (DELFILE '{Phylum}lisp>ABC) Form: (DELFILE '{Eris}lisp>init) == (DELFILE '{Eris}lisp>init) LOGINHOST/DIR The value of the variable LOGINHOST/DIR is the default connected directory. GREET sets your connected directory to this value (e.g., whenever you load a new sysout). CONN and CNDIR also use this variable (see below). Usually LOGINHOST/DIR is set in your INIT file to your "home" directory. If not set in your INIT file, it will default to {DSK}. Connecting to a directory: There are two equivalent ways to change the current connected directory: CONN device/pathname œ a P.A. command to change the currently connect directory. device/pathname is the directory to connect to. (CNDIR device/pathname) œ a function to change the current connected directory. device/pathname is the directory to connect to. CNDIR returns the full path name of the directory being connected to. Examples: 10_ CONN {phylum} {phylum} 11_ (CNDIR '{phylum}lisp>) {phylum}lisp> 12_ (CNDIR 'lisp>) {phylum}lisp> Notes: 1. If device/pathname is NIL, the value of the variable LOGINHOST/DIR will be used. 2. If pathname is NIL but there is a device specified, then for any device that supports directories, the directory will be set to the user's login name. Examples: CONN {phylum} => CONN {phylum} CONN {dsk} => CONN {dsk} 3. CONN is UNDOable, but CNDIR is not. 4. As described above, certain devices require that a directory be created before you can connect to it. Other devices further require that all of the sub-directories in a path name exist before you can connect to the directory specified by that path name. Examples: CONN {phylum} == error CONN {phylum}foo == okay CONN {FLOPPY} == okay Asking "what is the current connected directory?" The function DIRECTORYNAME can be used to find out about LOGINHOST/DIR and about the current connect directory. (DIRECTORYNAME) returns the value of LOGINHOST/DIR (DIRECTORYNAME T) returns the current connected directory. The DIRECTORIES List Whenever you specify a file name that can't be found, DWIM tries to "correct" the spelling of the name. If there is no device/pathname specified and the file does not exist in the currently connected directory, then DWIM will consult the value of the variable DIRECTORIES. DIRECTORIES is a ordered list of device/pathnames for DWIM to look on for any file that it cannot find. DWIM will "temporarily connect" to each device/pathname on this list until it finds one that contains the file name it is looking for. Example: 14_ (SETQ DIRECTORIES '({phylum} {phylum}lisp> {phylum} {eris})) ({phylum} {phylum}lisp> {phylum} {eris}) 15_ CONN {eris} {eris} 16_ (TEDIT 'INIT) ={PHYLUM}LISP>INIT {process}#6,24304 [Since there was no file called INIT on the connected directory, {eris}, DWIM tried to find the file. Using the DIRECTORIES list, it first looked for the file {phylum}init. Since that file doesn't exists, it looked for the file {PHYLUM}LISP>INIT, which does exist. So it used that as the "corrected" file name. 17_ (TEDIT '{ERIS}INIT] FILE NOT FOUND {ERIS}INIT [DWIM did not use the DIRECTORIES list here because the Device/Pathname was already specified.] DIRECTORIES should be set in your INIT file to a list of the directories where you typically keep files of general interest. The DIRECTORIES list is initialized in the system INIT file to include directories like {eris} and {eris}harmony>library>. Therefore, your INIT file should use the ADDVARS file package command. My INIT file contains the following clause: (ADDVARS (DIRECTORIES {DSK} {DSK2} {PHYLUM}LISP> {PHYLUM} {PHYLUM}RELEASE1.2>LIBRARY> {PHYLUM}RELEASE1.1>)) Finding out what files are in a directory œ DIR, FILDIR etc. One of the most common operations in using files is finding out what files you have in a given directory. For example, "what files do I have on {phylum}?". The functions FILDIR, DIR, and DIRECTORY can be used to get this information. (FILDIR FileNamePattern) œ a function that returns a list of all of the full file names matching the the FileNamePattern. The FileNamePattern can be any part of a full file name. It may contain the * and ? wildcards, standing for any number of any character and any one character, respectively. The parts of the full file name are defaulted as follows: If the device name is left out, the device name in the current connected directory will be used. If the device/pathname is left out, then the current connect directory will be used. If no file name is specified, then the name is assumed to be *.*;*. If the extension is left off, then the extension and version is assumed to be *;*. For example, FOO == FOO.*;* If the version is left off, then the version is assumed to be *. For example, FOO.BAR == FOO.BAR;* Examples: (FILDIR) == all files in the connected directory (FILDIR '*.DCOM) == all files in the connected directory that have a DCOM extension (FILDIR '{ERIS}LIBRARY>) == all files on {eris}library> (FILDIR '{phylum}library>*.DCOM) == all files in {phylum}library> that have a DCOM extension. (FILDIR '{phylum}*outline*) == all files on {phylum} and its subdirectories that contain the string "outline". Result is: ({PHYLUM}LISPCOURSE>OUTLINE.FORM;1 {PHYLUM}LISPCOURSE>OUTLINE01.TED;7 {PHYLUM}LISPCOURSE>OUTLINE01.TED;8 {PHYLUM}LISPCOURSE>OUTLINE01.TED;9 {PHYLUM}LISPCOURSE>OUTLINE02.TED;2 {PHYLUM}LISPCOURSE>OUTLINE02.TED;3 {PHYLUM}LISPCOURSE>OUTLINE02.TED;4 {PHYLUM}LISPCOURSE>OUTLINE03.TED;1 {PHYLUM}LISPCOURSE>OUTLINE04.TED;1 {PHYLUM}LISPCOURSE>OUTLINE04.TED;2 {PHYLUM}LISPCOURSE>OUTLINE05.TED;1 {PHYLUM}LISPCOURSE>OUTLINE06.TED;1 {PHYLUM}LISPCOURSE>OUTLINE07.TED;13 {PHYLUM}LISPCOURSE>OUTLINE07.TED;14 {PHYLUM}LISPCOURSE>OUTLINE07.TED;15 {PHYLUM}LISPCOURSE>OUTLINE08.TED;1 {PHYLUM}LISPCOURSE>OUTLINE09.TED;1 {PHYLUM}LISPCOURSE>OUTLINE10.TED;3 {PHYLUM}LISPCOURSE>OUTLINE10.TED;4 {PHYLUM}LISPCOURSE>OUTLINE10.TED;5 {PHYLUM}LISPCOURSE>OUTLINE11.TED;7 {PHYLUM}LISPCOURSE>OUTLINE11.TED;8 {PHYLUM}LISPCOURSE>OUTLINE11.TED;9 {PHYLUM}LISPCOURSE>OUTLINE12.TED;9 {PHYLUM}LISPCOURSE>OUTLINE12.TED;10 {PHYLUM}LISPCOURSE>OUTLINE12.TED;11 {PHYLUM}LISPCOURSE>OUTLINE13.TED;12 {PHYLUM}LISPCOURSE>OUTLINE13.TED;13 {PHYLUM}LISPCOURSE>OUTLINE13.TED;14 {PHYLUM}LISPCOURSE>OUTLINE14.TED;1 {PHYLUM}LISPCOURSE>OUTLINE15.TED;1) DIR FileNamePattern Commands œ a P.A. command that returns a list of all of the full file names matching the the FileNamePattern. The FileNamePattern is exactly as in FILDIR. The Commands consists of one of more atoms that specify the additional attributes that should be printed for each file AND/OR an action that should be carried out on each file listed. The possible atoms are: READDATE œ print the date/time each file was last read WRITEDATE œ print the date/time each file was last written on CREATIONDATE œ print the date/time each file was created SIZE œ print the size (in pages) of each file LENGTH œ print the length (in bytes) of each file AUTHOR œ print the author of each file DELETE œ delete each file PROMPT msg œ print msg then wait for the user to type "Y" or "N". If the suer types "N" skip the rest of the commands for the current file. Examples: Print the names and creation dates of all the DCOM files in the connected directory: DIR *.DCOM CREATIONDATE Result: {PHYLUM}RELEASE1.2>LIBRARY> INTERVALTEST.DCOM;1 25-Mar-85 0:10:21 PST NCCHAIN.DCOM;1 2-Jan-85 3:00:34 PST NCCLUSTER.DCOM;1 12-Feb-85 3:11:14 PST NCCLUSTER.DCOM;2 25-Mar-85 0:13:02 PST NCFILECARD.DCOM;9 12-Feb-85 23:32:47 PST NCFILECARD.DCOM;10 12-Feb-85 23:47:14 PST NCFILECARD.DCOM;11 12-Mar-85 18:49:23 PST NCFILESUBSTANCE.DCOM;1 12-Feb-85 23:33:04 PST NCFILESUBSTANCE.DCOM;2 12-Feb-85 23:48:39 PST NCFILESUBSTANCE.DCOM;3 12-Mar-85 18:48:46 PST NCKEYS.DCOM;1 7-Feb-85 20:33:25 PST NCKEYS.DCOM;2 22-Mar-85 11:06:40 PST NCSCREEN.DCOM;1 11-Feb-85 14:38:00 PST NCSCREEN.DCOM;2 25-Mar-85 0:15:05 PST Print the names, creation dates and authors of all the files in {phylum}release1.1>library>: DIR {phylum}release1.1>library> CREATIONDATE AUTHOR Result: {PHYLUM}RELEASE1.1>LIBRARY> NCCHAIN.;6 2-Dec-84 13:23:32 PST trigg.PA NCCHAIN.;7 10-Dec-84 17:37:45 PST trigg.PA NCCHAIN.;8 3-Jan-85 3:00:17 PST trigg.PA NCCHAIN.DCOM;4 3-Jan-85 3:00:34 PST trigg.PA NCCLUSTER.;11 3-Jan-85 3:01:00 PST trigg.PA NCCLUSTER.;12 3-Jan-85 19:58:09 PST trigg.PA NCCLUSTER.;13 3-Jan-85 23:52:03 PST trigg.PA NCCLUSTER.;14 12-Feb-85 3:10:55 PST trigg.PA NCCLUSTER.DCOM;9 3-Jan-85 23:52:55 PST trigg.PA NCCLUSTER.DCOM;10 12-Feb-85 3:11:14 PST trigg.PA NCKEYS.;3 4-Feb-85 13:08:12 PST Halasz.PA NCKEYS.;4 4-Feb-85 13:10:46 PST Halasz.PA NCKEYS.;5 4-Feb-85 13:12:35 PST Halasz.PA NCKEYS.;6 4-Feb-85 19:32:46 PST Halasz.PA NCKEYS.;7 4-Feb-85 22:16:11 PST Halasz.PA NCKEYS.DCOM;3 4-Feb-85 19:33:05 PST Halasz.PA NCKEYS.DCOM;4 4-Feb-85 22:16:34 PST Halasz.PA NCKEYS.TED;2 4-Feb-85 18:05:06 PST Halasz.PA NCKEYS.TED;3 4-Feb-85 18:14:39 PST Halasz.PA NCKEYS.TED;4 4-Feb-85 18:15:39 PST Halasz.PA NCKEYS.TED;5 4-Feb-85 18:24:10 PST Halasz.PA NCKEYS.TED;6 4-Feb-85 18:26:46 PST Halasz.PA NCSCREEN.;3 3-Jan-85 3:02:39 PST trigg.PA NCSCREEN.;4 3-Jan-85 20:00:18 PST trigg.PA NCSCREEN.;5 4-Jan-85 2:40:02 PST trigg.PA NCSCREEN.;6 11-Feb-85 14:37:29 PST Trigg.PA NCSCREEN.DCOM;4 4-Jan-85 2:40:59 PST trigg.PA NCSCREEN.DCOM;5 11-Feb-85 14:38:00 PST Trigg.PA VIDEOTAPE.;1 11-Feb-85 16:24:01 PST Halasz.PA DELETE all of the files on the local disk's partition 5: DIR {DSK5} DELETE Result: {DSK5} ALTOD1MC.EB;1 c deleted Com.cm;1 deleted DiskDescriptor.;1 deleted DORADOLISPMC.EB;1 deleted Dumper.boot;1 deleted Executive.Run;1 deleted FONTS.WIDTHS;1 deleted HOLD.NOTEFILE;1 deleted INIT.LISP;1 deleted LISP.RUN;1 deleted LISP.SYMS;1 deleted LISP.VIRTUALMEM;1 deleted REM.CM;1 deleted Swat.;1 deleted Swatee.;1 deleted Sys.Boot;1 deleted SYS.ERRORS;1 deleted SysDir.;1 deleted SysFont.Al;1 deleted User.Cm;1 deleted Go thru all the files on {DSK5} and ask the user if they should be deleted: DIR {DSK5} PROMPT "Delete? " DELETE Result: {DSK5} ALTOD1MC.EB;1 Delete? Yes deleted Com.cm;1 Delete? Yes deleted DiskDescriptor.;1 Delete? No DORADOLISPMC.EB;1 Delete? No Dumper.boot;1 Delete? No Executive.Run;1 Delete? Yes deleted FONTS.WIDTHS;1 Delete? Yes deleted HOLD.NOTEFILE;1 Delete? Yes deleted INIT.LISP;1 Delete? Yes deleted LISP.RUN;1 Delete? Yes deleted LISP.SYMS;1 Delete? Yes deleted LISP.VIRTUALMEM;1 Delete? No REM.CM;1 Delete? Yes deleted Swat.;1 Delete? Yes deleted Swatee.;1 Delete? Yes deleted Sys.Boot;1 Delete? Yes deleted SYS.ERRORS;1 Delete? Yes deleted SysDir.;1 Delete? Yes deleted SysFont.Al;1 Delete? Yes deleted User.Cm;1 Delete? Yes deleted Note: The Italics indicate the users response. (DIRECTORY FileNamePattern Commands) œ is a function that acts just like the DIR P.A. command. The only difference is that DIRECTORY doesn't automatically list the file names. There is an additional command (P) to do this. Example: (DIRECTORY '{PHYLUM} 'P 'AUTHOR) is equivalent to DIR {PHYLUM} AUTHOR Documentation of FILDIR, DIR, and DIRECTORY œ can be found in Section 14.3 of the IRM. Manipulating Files Basic Lisp File Manipulation Functions There are a number of functions that allow you to manipulated files in Interlisp, e.g., to copy, move, and delete files. These functions work on the file per se and not on the information in the file. Therefore, they apply to all flavors of files. Each function takes one or two file name arguments. These arguments can not contain wildcard characters. They can however, leave off the device/pathname of the full file name. In this case, the connected directory and the DIRECTORIES list will be used as described above. If the version number is not specified, all function assume the HIGHEST version is intended (except DELFILE, which assumes the lowest version). (DELFILE FileName) œ deletes FileName (i.e., gets rid of it forever and ever!!!) Example: (DELFILE 'LISP>INIT) (COPYFILE FromFile ToFile) œ makes a copy of FromFile and places on ToFile. If a file named ToFile already exists, the copied file becomes the next higher version number. Example: (COPYFILE 'LISP>INIT '{ERIS}LISP>INIT) (RENAMEFILE OldName NewName) œ renames the file OldName to be NewName. If a file named NewName already exists, the copied file becomes the next higher version number. On some devices, RENAMEFILE actually does a rename (and hence is relatively fast). On other devices, RENAMEFILE actually does a COPYFILE from OldName to NewName and then a DELFILE of OldName (and hence is relatively slow). RENAMEFILE from one device to another device always does a COPYFILE followed by a DELFILE. Example: (RENAMEFILE '{phylum}lisp>init;5 'init) Example: (RENAMEFILE '{phylum}lisp>init '{eris}init) (SEE FileName) [Note: SEE is an NLAMBDA function] œ prints FileName to the TTY window so that you can examine it. SEE does no formatting, it just dumps it on your screen character by character. Example: (SEE '{phylum}lisp>test) Result printed in TTY window: 69_SEE LISP>TEST (FILECREATED "21-Feb-85 15:50:09" {PHYLUM}LISP>TEST.;3 1096 changes to: (FILEPKGCOMS ANNOUNCEDFILES) (VARS TESTCOMS) previous date: "21-Feb-85 15:48:38" {PHYLUM}LISP>TEST.;2) **COMMENT** (PRETTYCOMPRINT TESTCOMS) (RPAQQ TESTCOMS ((ANNOUNCEDFILES ONE TWO THREE) (FILEPKGCOMS ANNOUNCEDFILES))) (PRINT "Loading ONE") (FILESLOAD ONE) (PRINT "Loading TWO") (FILESLOAD TWO) (PRINT "Loading THREE") (FILESLOAD THREE) (PUTDEF (QUOTE ANNOUNCEDFILES) (QUOTE FILEPKGCOMS) (QUOTE ((COM MACRO (X (P * (FOR File in (QUOTE X) join (LIST (BQUOTE (PRINT , (CONCAT "Loading " File))) (BQUOTE (FILESLOAD , File)))))) CONTENTS (LAMBDA (COM NAME TYPE) (AND (EQ TYPE (QUOTE ANNOUNCEDFILES)) (SUBSET (INFILECOMTAIL COM) (FUNCTION LITATOM)))))))) (PUTPROPS TEST COPYRIGHT ("Xerox Corporation" 1985)) (DECLARE: DONTCOPY (FILEMAP (NIL))) STOP NIL 70_ (LISTFILES FileName1 FileName2 ... ) [Note: LISTFILES is an NLAMBDA function] œ prints hardcopies of FileName1, FileName2, etc. on the DEFAULTPRINTINGHOST. LISTFILES is not strictly independent of file flavors. LISTFILES actually determines what flavor of file each FileNamei is and then calls the appropriate hardcopy function for that flavor of file. COPYFILES LispUsers Package The COPYFILES LispUsers package makes it easy to copy or move groups of files from one place to another using wildcard facilities like those in DIR and FILDIR. (COPYFILES source destination options) œ Copies the files designated by source to the place designated by destination. source is a pattern such as given to DIRECTORY or DIR; it can also be a list of file names. destination is either a directory name, or a file-name pattern, with a 1-1 match of "*"s in to to "*"s in source. (The number of *'s in each source pattern needs to match the number of *'s in each destination pattern.) The argument options is a (list of) options (if you have only one and its an atom, you can supply it as an atom), as follows: You can specify whether COPYFILES should ask before each transfer. Default is not to ask. ASK œ ask each time before moving/copying a file (default is to not ask). (ASK N) œ Ask, with default to No after DWIMWAIT seconds. (ASK Y) œ Ask, with default to Yes after DWIMWAIT seconds. COPYFILES normally uses COPYFILE to create a new file. It also usually only copies the "highest version", and creates a new version at the destination. Alternatively, you can specify any of the following: RENAME or MOVE œ use RENAMEFILE instead of COPYFILE, i.e., the source is deleted afterwards. ALLVERSIONS œ Copy all versions, and preserve version numbers. REPLACE œ If a file by the same name exists on the destination, overwrite it (don't create a new version) After COPYFILES gets done, it can be instructed to delete some files afterward: PURGE œ This involves a separate pass (afterwards): any file on the *destination* which doesn't have a counterpart on the *source* is deleted. PURGESOURCE œ converse of PURGE (and used by it): if the file is on the source and not on the destination, delete it. Examples: (COPYFILES '{ERIS}*.MAIL '{PHYLUM}OLD-*.MAIL) will copy the any mail file on {Eris} to {Phylum}, renaming FOO.MAIL to OLD-FOO.MAIL. (COPYFILES '{ERIS}*.MAIL '{PHYLUM}OLD-*.MAIL 'RENAME) will use RENAMEFILE instead. (COPYFILES '({DSK}TEST {DSK}WEST) '{PHYLUM}) will move the files TEST and WEST from {DSK} to {PHYLUM}. COPYFILES({DSK}*.; {FLOPPY}) will copy all files on {DSK} with no extension to {FLOPPY}. (COPYFILES '{ERIS} '{PHYLUM} '(PURGE)) will make {Phylum} look like {ERIS}; bringing over any file that isn't already on Phylum and then deleting the ones that were on {PHYLUM} and aren't on {ERIS} any more. Still to come about files and directories: Using the FileBrowser CHATing to an IFS Dealing with Devices Using Floppies on the Dlion Archiving Files Opening and closeing Files References Connected directories are covered in Section 18.16.6 of the IRM. The DIRECTORIES list is covered in Section 18.16.6 and page 15.20 of the IRM. DIR, FILDIR and DIRECTORY are covered in Section 14.3 of the IRM. The file manipulation functions are documented on pages 6.3 and 18.10-11 of the IRM. COPYFILES is documented on {eris}harmony>library>CopyFiles.TEdit. (LIST ((PAGE NIL NIL (0 0 612 792) ((HEADING NIL (HEADINGTYPE YYY) (19050 26670 2540 1270) NIL) (TEXT NIL NIL (2540 2540 16510 22860) NIL))) (PAGE NIL NIL (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 SIZE 12 FAMILY TIMESROMAN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM)) (16510 26670 2540 1270) NIL) (HEADING NIL (HEADINGTYPE XXX) (2540 26670 2540 1270) NIL) (TEXT NIL NIL (2540 2540 16510 22860) NIL))) (PAGE NIL NIL (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 SIZE 12 FAMILY TIMESROMAN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM)) (16510 26670 2540 1270) NIL) (HEADING NIL (HEADINGTYPE XXX) (2540 26670 2540 1270) NIL) (TEXT NIL NIL (2540 2540 16510 22860) NIL)))))H PAGEHEADINGYYY TIMESROMAN ˆ PAGEHEADINGXXX0 TIMESROMAN NILNIL0 TIMESROMANNILNIL TIMESROMAN$$ NILNIL> TIMESROMAN  TIMESROMAN 8 TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN Z TIMESROMAN HH NILNIL$ BMOBJ.GETFN2 TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN$$ NILNIL TIMESROMAN TIMESROMAN TIMESROMANHH NILNIL TIMESROMAN TIMESROMAN À TIMESROMAN llNILNIL@ TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN TIMESROMAN  TIMESROMAN TIMESROMAN  TIMESROMAN NILNIL‡ TIMESROMAN llNILNIL’ TIMESROMAN llNILNIL TIMESROMAN NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN üüNILNIL# TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN TIMESROMAN  TIMESROMAN  TIMESROMAN üüNILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN HH NILNIL TIMESROMAN llNILNILÛ TIMESROMAN ll NILNILH TIMESROMAN  TIMESROMAN 8 TIMESROMAN  TIMESROMAN  TIMESROMAN HH NILNIL TIMESROMAN llNILNILG TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN  TIMESROMAN > TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN 9 TIMESROMAN  TIMESROMAN  TIMESROMAN g TIMESROMAN NILNIL TIMESROMAN ´´NILNIL TIMESROMAN ´´NILNIL TIMESROMAN  TIMESROMAN ´´NILNIL# TIMESROMAN ´´NILNIL TIMESROMAN ´´NILNIL TIMESROMAN ´´NILNIL TIMESROMAN NILNIL TIMESROMAN ´´NILNIL TIMESROMAN  TIMESROMAN # TIMESROMAN TIMESROMAN  TIMESROMAN ´´ NILNILœ TIMESROMAN ØØNILNIL TIMESROMAN ØØNILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN ØØNILNIL TIMESROMAN  TIMESROMAN TIMESROMAN  TIMESROMAN ´´ NILNIL( TIMESROMAN ´´ NILNIL TIMESROMAN ØØNILNIL TIMESROMAN ØØNILNIL TIMESROMAN  TIMESROMAN ØØNILNIL TIMESROMAN  TIMESROMAN ØØNILNIL TIMESROMAN  TIMESROMAN HH NILNIL2 TIMESROMAN ll NILNIL TIMESROMAN TIMESROMAN  TIMESROMAN U TIMESROMAN  NILNIL3 TIMESROMAN  NILNIL: TIMESROMAN  TIMESROMAN $$NILNIL TIMESROMANHH NILNILf TIMESROMAN  TIMESROMAN HHNILNIL© TIMESROMAN HHNILNIL TIMESROMAN  TIMESROMAN Ø TIMESROMAN HHNILNIL TIMESROMAN llNILNILg TIMESROMAN llNILNILO TIMESROMAN llNILNIL TIMESROMAN llNILNIL TIMESROMAN llNILNIL TIMESROMAN llNILNIL TIMESROMAN llNILNIL TIMESROMAN NILNILQ TIMESROMAN llNILNIL TIMESROMAN llNILNIL TIMESROMAN llNILNIL TIMESROMAN NILNIL` TIMESROMAN HH NILNILÖ TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN I TIMESROMAN HHNILNIL, TIMESROMAN llNILNIL TIMESROMAN NILNIL TIMESROMAN ´´NILNIL TIMESROMAN ´´NILNIL TIMESROMAN ´´NILNIL TIMESROMAN ´´NILNIL TIMESROMAN ´´NILNIL( TIMESROMAN ´´NILNIL! TIMESROMAN $$NILNIL= TIMESROMANHH NILNILh TIMESROMAN > TIMESROMAN HH NILNILO TIMESROMAN HH NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN N TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN Z TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN llNILNIL: TIMESROMAN NILNILa TIMESROMAN NILNILU TIMESROMAN NILNILD TIMESROMAN NILNIL TIMESROMAN E TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN NILNILO TIMESROMAN  TIMESROMAN  TIMESROMAN TIMESROMAN  TIMESROMAN ll NILNIL TIMESROMAN  NILNIL TIMESROMAN ) TIMESROMAN NILNIL TIMESROMAN D TIMESROMAN NILNIL TIMESROMAN % TIMESROMAN NILNIL+ TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN NILNIL$ TIMESROMAN [ TIMESROMAN ´´NILNIL TIMESROMAN  TIMESROMAN ´´NILNIL>GACHA ØØNILNIL TIMESROMAN HH NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN R TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN HHNILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN ª TIMESROMAN  TIMESROMAN llNILNIL7 TIMESROMAN llNILNIL> TIMESROMAN llNILNIL9 TIMESROMAN llNILNIL. TIMESROMAN llNILNIL2 TIMESROMAN llNILNIL' TIMESROMAN llNILNIL TIMESROMAN llNILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN w TIMESROMAN HHNILNIL TIMESROMAN llNILNILW TIMESROMAN  TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN NILNIL*GACHA NILNIL1GACHA NILNIL1GACHA NILNIL1GACHA NILNIL1GACHA NILNIL1GACHA NILNIL1GACHA NILNIL1GACHA NILNIL1GACHA NILNIL1GACHA NILNIL1GACHA NILNIL1GACHA NILNIL1GACHA NILNIL1GACHA NILNIL1GACHA llNILNILS TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN llNILNIL? TIMESROMAN NILNIL TIMESROMAN NILNIL*GACHA NILNIL2GACHA NILNIL2GACHA NILNIL2GACHA NILNIL2GACHA NILNIL2GACHA NILNIL2GACHA NILNIL2GACHA NILNIL2GACHA NILNIL2GACHA NILNIL2GACHA NILNIL3GACHA NILNIL3GACHA NILNIL3GACHA NILNIL3GACHA NILNIL3GACHA NILNIL3GACHA NILNIL3GACHA NILNIL3GACHA NILNIL3GACHA NILNIL3GACHA NILNIL3GACHA NILNIL3GACHA NILNIL2GACHA NILNIL2GACHA NILNIL2GACHA NILNIL2GACHA NILNIL2GACHA NILNIL2GACHA NILNIL3GACHA llNILNIL9 TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN NILNIL GACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA NILNILGACHA llNILNILN TIMESROMAN # TIMESROMAN  TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN NILNIL GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA GACHA NILNILGACHA GACHA GACHA NILNILGACHA GACHA GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNILGACHA GACHA  GACHA NILNIL/ TIMESROMAN HH NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN « TIMESROMAN  TIMESROMAN  TIMESROMAN TIMESROMAN ll NILNIL TIMESROMAN ( TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN HH NILNIL+ TIMESROMAN  TIMESROMAN ) TIMESROMAN NILNIL TIMESROMAN$$ NILNIL' TIMESROMAN HH NILNILy TIMESROMAN HH NILNIL! TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN 3 TIMESROMAN HH NILNILI TIMESROMAN  TIMESROMAN X TIMESROMAN HH NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN , TIMESROMAN ll NILNIL' TIMESROMAN HH NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN I TIMESROMAN llNILNIL@ TIMESROMAN HH NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN H TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN } TIMESROMAN llNILNILB TIMESROMAN llNILNILE TIMESROMAN HH NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN # TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN llNILNIL+ TIMESROMAN llNILNIL TIMESROMAN llNILNILGACHAllNILNILDGACHAllNILNIL,GACHAllNILNILGACHAllNILNILTGACHAllNILNILGACHAllNILNIL0GACHAllNILNIL(GACHAllNILNILGACHAllNILNILGACHAllNILNILGACHAllNILNILGACHAllNILNILGACHAllNILNILGACHAllNILNIL:GACHAllNILNIL!GACHAllNILNIL"GACHAllNILNILGACHAllNILNIL GACHAllNILNIL GACHAllNILNIL5GACHAllNILNIL&GACHAllNILNIL8GACHAllNILNIL3GACHAllNILNILbGACHAllNILNIL7GACHAllNILNILDGACHAllNILNIL%GACHAllNILNIL4GACHAllNILNILFGACHAllNILNIL?GACHAllNILNILAGACHAllNILNIL5GACHAllNILNILGACHAllNILNILGACHAllNILNILGACHAllNILNILGACHAllNILNILGACHAHH NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN ) TIMESROMAN  TIMESROMAN TIMESROMAN  TIMESROMAN " TIMESROMAN p TIMESROMAN TIMESROMAN M TIMESROMAN  TIMESROMAN $$NILNIL TIMESROMAN MODERNHHNILNIL  TIMESROMAN HHNILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN TIMESROMAN  TIMESROMAN  TIMESROMAN V TIMESROMAN TIMESROMAN Q TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN 2 TIMESROMAN TIMESROMAN  TIMESROMAN  TIMESROMAN j TIMESROMAN llNILNILZ TIMESROMAN „´NILNIL TIMESROMAN G TIMESROMAN „´NILNIL TIMESROMAN 3 TIMESROMAN „´NILNIL TIMESROMAN 4 TIMESROMAN `` NILNILÍ TIMESROMAN NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN O TIMESROMAN NILNIL TIMESROMAN 4 TIMESROMAN NILNIL TIMESROMAN c TIMESROMAN `` NILNILP TIMESROMAN NILNIL TIMESROMAN Š TIMESROMAN NILNIL TIMESROMAN k TIMESROMAN HH$NILNIL TIMESROMAN HHNILNILAGACHA k TIMESROMAN HHNILNILJGACHA  TIMESROMAN HHNILNIL3GACHA C TIMESROMAN HHNILNILGACHA = TIMESROMAN HHNILNIL=GACHA À TIMESROMAN NILNIL+ TIMESROMAN$$NILNIL TIMESROMAN $$NILNIL TIMESROMAN $$NILNIL TIMESROMAN $$NILNIL TIMESROMAN $$NILNIL TIMESROMAN $$NILNIL TIMESROMAN NILNIL TIMESROMAN$$NILNILA TIMESROMAN $$NILNILN TIMESROMAN $$NILNILB TIMESROMAN $$NILNILU TIMESROMAN $$NILNILH TIMESROMAN kì†z¸