


















                                   FSave
                      A Program to Simplify Filesaves












                           Shareware Version 1.0
                     Documentation Version 1.5 7/29/94
                      Copyright 1994 Kenneth A. Reek
                            All Rights Reserved




FSave is copyrighted software.  It is not in the public domain, nor  is  it
distributed for free.  The author retains all rights to this software.

FSave is distributed as Shareware so you can try it out without risk to see
if you like it.  Use it for two weeks.  If you don't like it, simply delete
it and owe nothing.  If you continue to use FSave after the two week  trial
period, you must register your copy.  The advantages of registration, a fee
schedule, and a registration form may be found in the file  "register.txt";
to  register,  fill  out  this  form  and  mail it with your payment to the
author:

                              Kenneth A. Reek
                              3090 Griffin Rd
                      Churchville, NY USA 14428-9512

Thank you for helping to make the ShareWare concept work.













                                   FSave


                             Table of Contents


1    Preface .........................................................    1
1.1  Printing this Document ..........................................    1
1.2  Preface to the Shareware Version ................................    1
1.3  DISCLAIMER ......................................................    2

2    Installation ....................................................    2
2.1  Where Do I Put It?  .............................................    2
2.2  Installing FSave ................................................    2

3    A Quick Start ...................................................    2
3.1  Who Should Read This Chapter?  ..................................    2
3.2  Step By Step Instructions .......................................    3

4    Design Philosophy ...............................................    5
4.1  Why FSave?  .....................................................    5
4.2  FSave Design Principles .........................................    5

5    Understanding Configurations ....................................    6
5.1  Overview of Operation ...........................................    6
5.2  Configurations ..................................................    6
5.2.1 Global and Local Configurations ................................    6
5.2.2 Elements of a Configuration ....................................    7
5.2.3 Configuration Files ............................................    7
5.3  Common Configuration Problems ...................................    9
5.4  An Example ......................................................    9

6    FSave Operation .................................................   13
6.1  Initialization ..................................................   13
6.2  Processing Files ................................................   14
6.3  Processing Subdirectories .......................................   15
6.4  Output Files ....................................................   15
6.5  Saving the Data .................................................   16
6.6  The Initialization File .........................................   16
6.7  Command Line Arguments ..........................................   19
6.8  Starting FSave ..................................................   21
6.9  Starting FSave from Windows .....................................   22

7    Strategies for Using Configurations .............................   22
7.1  The Root Directory ..............................................   22
7.2  Subdirectories ..................................................   23
7.2.1 Static Directories .............................................   23
7.2.2 Dynamic Directories ............................................   24
7.2.3 Static/Dynamic Directories .....................................   24
7.2.4 The \windows Directory .........................................   25
7.2.5 The \windows\system Directory ..................................   25
7.3  Testing Configurations ..........................................   26

8    Master Backups ..................................................   26
8.1  What Is a Master Backup?  .......................................   26
8.2  Creating a Master Backup ........................................   26


1.5                                - i -                            7/29/94







                                   FSave


8.3  Whole System Master Backup ......................................   27

9    Restoring Files from Backups ....................................   28
9.1  Re-Deleting Deleted Files .......................................   28
9.2  Directory Index .................................................   29
9.3  Restoring Individual Files ......................................   29

10   Incremental Backups .............................................   29
10.1 Incremental and Delta Backups ...................................   29
10.2 Restoring from Incremental Backups ..............................   30

11   Alternate Configurations ........................................   30
11.1 Specifying an Alternate Configuration ...........................   30
11.2 Using Alternate Configurations ..................................   31

12   Unix-Style Filename Patterns ....................................   31
12.1 Overview ........................................................   31
12.2 Examples ........................................................   32





































1.5                               - ii -                            7/29/94







                                   FSave


1.  Preface

     Filesaves are a necessary evil on nearly all computer systems.  Neces-
sary  because  all systems (be it the hardware, the software, or the opera-
tor) eventually fail resulting in loss of  information,  and  evil  because
they  are  usually a pain in the neck to do.  The problem is that filesaves
must be done frequently, but are only  needed  infrequently.   The  natural
human  tendency in this type of situation is to put them off, but then when
the failure occurs you don't have the up-to-date  filesave  that  can  save
you.

     FSave is a program designed specifically for PC-type  systems  running
either  DOS  or Windows that simplifies the task of creating filesaves.  It
does this by saving only that information that  cannot  be  recovered  from
other  sources.   The  result is that your periodic filesaves are quick and
easy, and do not require expensive backup hardware (tape drives)  or  media
(tapes).  By making filesaves less onerous, FSave makes it more likely that
you will do periodic filesaves more frequently than  you  otherwise  would,
for which you will be eternally grateful when your hard disk has crashed or
you have lost data for another reason.

     Note that FSave itself does not do the actual archiving.  Instead,  it
creates  files  containing  lists  of the names of the files that should be
saved, and then invokes your favorite compressor/archiver program to do the
grungy  work.   If your favorite archiver can be told to read a file to get
the list of filenames to save, you can use it with FSave.  This  eliminates
most  religious  arguments about the merits of the various compression pro-
grams that are available.

1.1.  Printing this Document

     If you wish to print this manual, you will get  the  best  results  by
using  an editor that prints exactly 66 lines per page.  Of course, you can
read it into a word processor and fiddle with it if have the time.

1.2.  Preface to the Shareware Version

     The shareware version of FSave is missing some of the  features  found
in  the registered version.  These missing features do not cripple the pro-
gram or impair its basic functionality, so you will be able to  fully  test
FSave to get a feel for how it works and whether you like it.  The disabled
features are what you might call "convenience features:" they don't perform
any vital functions but they do make the program easier to use.

     This document describes the registered version of FSave.   The  symbol
($$$)  is used to identify features which are missing in the shareware ver-
sion.  Note that this symbol is not a part of any command or  keyword  with
which  it  appears; it simply flags something that has been disabled in the
shareware version.






1.5                                - 1 -                            7/29/94







                                   FSave


1.3.  DISCLAIMER

     FSave is supplied as is.  The author disclaims any and all warranties,
expressed or implied, including but not limited to warranties of merchanta-
bility and of fitness for any purpose.  The author assumes  no  liabilities
for  any damages, direct or consequential, which may result from the use of
FSave.

2.  Installation

     Installation is easy, as there are only two files to copy.

2.1.  Where Do I Put It?

     FSave can be put in a directory of its own, but it is more  convenient
to  put  it  in  a  directory that is on your "PATH" because it can then be
invoked without having to type its entire pathname.  The installation  pro-
cedure  below assumes that you will be installing it in the "c:\dos" direc-
tory.  If you wish to put it somewhere  else,  modify  the  commands  below
accordingly.

2.2.  Installing FSave

     Follow these steps to install FSave:

(1)  Copy FSave into your "dos" directory with these commands:

         copy a:fsave.exe c:\dos\fsave.exe
         copy a:fsave.ini c:\dos\fsave.ini

     The "fsave.ini" file contains commands that  use  "pkzip"  to  do  the
     archiving;  if you wish to use another archiver, you must modify these
     entries.  I suggest that you test FSave with  "pkzip"  first;  if  you
     like it, then invest the time to customize the initialization file.

(2)  Create a temporary directory called "c:\tmp".   This  is  where  FSave
     will  write  its lists of filenames and other reports.  If you already
     have   a   temporary   directory   of   a   different    name,    edit
     "c:\dos\fsave.ini"  and  wherever  "c:\tmp"  appears, change it to the
     name of your temporary directory.

(3)  The next step is to create configuration files in your directories  to
     indicate  what  should  be  saved  and  what should be skipped in each
     directory.  Configuration files are completely described later in this
     manual; the next chapter will get you started.

3.  A Quick Start

3.1.  Who Should Read This Chapter?

     For the impatient types who would rather be doing something than read-
ing  about  how  to  do  it,  here are some instructions to get you started
quickly.  But this glimpse of FSave's operation provides a good context  in


1.5                                - 2 -                            7/29/94







                                   FSave


which  to understand the remainder of this manual, so this chapter is worth
reading even if you are the more patient type who does not need to see your
machine busy doing something 24 hours a day.

     These instructions assume that  you  have  "pkzip"  version  2.04g  or
later,  and that it is stored in a directory listed in your "PATH".  If you
do not have "pkzip" but would like it, it is available  in  shareware  form
from  many bulletin boards and ftp sites.  If you prefer to use a different
archiving/compressing program, you will need  to  modify  the  commands  in
"fsave.ini" to invoke your chosen program.

3.2.  Step By Step Instructions

(1)  Create a "configuration" file called "c:\fsave.cnf", containing  these
     lines:

         DateAll = date
         SkipDirs = directory names
         SkipFiles = file names

     In the first line, enter the date you purchased your  system  (or  the
     date  you loaded your first software package) for the word "date".  In
     the second line, type the names of  all  subdirectories  in  the  root
     directory  that  you  do  NOT want to back up.  This would include any
     temporary directories that do not contain any files of lasting  value,
     and  subdirectories that contain only files that can be recovered from
     other sources.  This usually includes the "c:\tmp" directory.  On  the
     third  line,  type the names of any files in the root directory you do
     not wish to back up.  These would include files that contain no useful
     information  (e.g.  the  Windows  swap  file,  though this is normally
     skipped because it is a hidden file), or files that can  be  recovered
     from  other  sources.   If  there  are none, the entry may be omitted.
     Here is a typical root configuration file:

         DateAll = 1/1/93
         SkipDirs = recovery tmp video bin

     There are more things that may be specified  in  configuration  files,
     and they are fully covered in section 5.

     One final note: only files and directories in  the  current  directory
     may  be  mentioned  in  a configuration file.  To skip files or direc-
     tories contained in another directory, another configuration  file  is
     created  in  that  directory.   For  example,  to specify skipping the
     "windows\system" directory, "c:\windows\fsave.cnf" would  include  the
     line

         SkipDirs = system


(2)  Now change to the root directory and do a test-mode save, like this:

         cd c:\


1.5                                - 3 -                            7/29/94







                                   FSave


         fsave /t

     FSave will look through your entire "c:" drive (except the things  you
     have  told it to skip) to find all files that were last modified on or
     after the date you specified in your configuration file.   A  list  of
     these  filenames  will be written to the file "c:\tmp\saved.txt"; each
     line of this file includes the size, modification date, and name of  a
     file that would be backed up.

     Examine this list to find files that should not be backed up; any file
     that  you can recover from any other source (bulletin board, distribu-
     tion diskette, master backup of that directory, etc.) need  be  backed
     up  only  if  your file is newer than the version on the other source.
     In each directory containing files or directories  that  need  not  be
     saved, create a configuration file called "fsave.cnf" containing lines
     such as those shown above.  Note that the entries in  a  configuration
     file  are  all optional; those that are not needed may be omitted.  If
     all the entries are omitted, no configuration file is needed.

     The first thing to look for in each directory is  whether  a  specific
     date  marks  the  beginning  of the files to be saved.  If so, specify
     this date with "DateAll" in the directory's configuration file.  Then,
     if  there  are  subdirectories that should not be backed up, add their
     names to the "SkipDirs" entry in the configuration file.  Finally, add
     the  names of specific files that need not be saved to the "SkipFiles"
     entry.

(3)  After   doing   this   for   each   directory   that    appeared    in
     "c:\tmp\saved.txt", do another test save just like the first one.  The
     "saved.txt" file will be recreated, and you can  see  the  results  of
     your  efforts.   If you find additional files or directories that need
     not be saved, add or modify the  appropriate  configuration  files  as
     needed to skip them.

(4)  When you have eliminated everything that can be eliminated, do a  real
     filesave.   The  quick  start initialization file specifies "pkzip" to
     create the backup files on "a:".  If this is not appropriate for  your
     system,  modify  the entries in "c:\dos\fsave.ini" as needed (you will
     need to look ahead to other sections of this manual to figure out what
     is needed).  Then get a bunch of blank diskettes ready.  How many will
     you need?  That depends on what compression program you are using, and
     the  specific  contents  of the files you are saving.  With "pkzip", I
     regularly save 3 megabytes of information on a  single  1.44  megabyte
     diskette.  Start the filesave by typing

         cd c:\
         fsave

     FSave creates one or more lists of files to be saved, and writes these
     lists  to "a:" for future use as a table of contents.  It then invokes
     "pkzip" to compress the files themselves to "a:".  The  initialization
     file  provided  specifies the "pkzip" option that continues a zip file
     on another diskette if the current one should fill up.


1.5                                - 4 -                            7/29/94







                                   FSave


(5)  That's it - you've backed up your system.  If your system is  anything
     like mine, you needed to back up only a few megabytes out of many tens
     or perhaps hundreds of megabytes of stuff on your hard disk.

(6)  The hope is that you will never to restore files from a backup, but if
     the  worst  happens  you will be prepared.  After a failure, you would
     reload your operating system and all of your  purchased  or  shareware
     software  from their original media.  Then you would restore the files
     FSave had saved to recover all of the information you had modified.

4.  Design Philosophy

4.1.  Why FSave?

     The are two main problems with doing filesaves  on  PC  systems.   The
first is the large size of modern hard disks.  Backing up a several hundred
megabyte hard disk to 1.44 megabyte floppies  is  just  not  practical;  it
could  easily  take  a hundred or more diskettes, not to mention many, many
hours to do.

     The second problem is the price of tape backup hardware.  Not everyone
is  willing  to spend a couple of hundred dollars for a tape system capable
of holding an entire hard disk's  data.   Just  the  tapes  themselves  can
become  a  considerable expense.  This is a high price to pay for something
that, like insurance, you hope you never have to use.

4.2.  FSave Design Principles

     FSave was designed around three basic principles.  The first  is  sim-
ple:

    If it is not quick and easy to do filesaves, you will do them  less
    often than you should, maybe never.


This fact of human nature is the challenge that FSave addresses:  it  makes
filesaves much quicker and easier.

     How is this done?  Quite simply, by not saving everything on the  hard
disk.  The second basic principle is this:

    You will keep the media from which commercial or other software was
    originally obtained.


The importance of this is easily explained: any files on your  system  that
are  unchanged  since they were first installed need not be backed up regu-
larly because they can be recovered from the original installation media.

     This is perhaps the one that is most likely to cause problems, but  is
also  easily  remedied.   Programs  downloaded  from bulletin boards or ftp
sites are often installed and then the downloaded file  is  discarded.   If
you  can retrieve the program again later, then there is no problem (though


1.5                                - 5 -                            7/29/94







                                   FSave


keeping a list of which programs you have gotten and  where  you  got  them
from  will  simplify this task).  If for some reason you cannot get another
copy of some program on your system, simply archive that  entire  directory
to  a  diskette  (or  set of diskettes) and label that as a "master backup"
(described more fully in a later chapter).  Now, only those files that have
changed since you created this backup need be saved regularly.

     The drawback to this approach is that restoring files after a crash is
more time consuming.  First, your operating system must be reloaded.  Then,
all your packages must be reloaded from  their  original  media  or  master
backups.   Finally,  your  modified  files  are reloaded from your filesave
diskettes.  It is the third and final principle that makes this palatable:

    You will be backing your system up far more often than you will  be
    restoring it.


If this is not true of your system, FSave is not for you,  but  you  should
seriously  consider  getting  a more reliable system.  But if, like me, you
have never had a hardware problem (knock on  wood!)  and  need  to  restore
files primarily due to occasional operator stupidity, then FSave will serve
your needs perfectly.

5.  Understanding Configurations

5.1.  Overview of Operation

     FSave does a simple job:

(1)  it decides which files on your system need to be backed up,  based  on
     information obtained from your configuration files;

(2)  it writes the names of these files to one or more files in a temporary
     directory; and

(3)  it invokes a compressor/archiver program such as "pkzip"  to  actually
     save the files in each list to a diskette or other destination.

5.2.  Configurations

     The foundation underlying this  process  is  the  "configuration";  it
specifies  which  files to save and which to skip, and which directories to
process and which to ignore.

5.2.1.  Global and Local Configurations

     There are two  configurations,  the  "global  configuration"  and  the
"local configuration." Only the local configuration determines what to save
and what to skip in a directory; the local configuration gets  its  initial
values from the global configuration.

     Here is exactly how this is done.  When FSave enters a  new  subdirec-
tory,  the  local  and  global  configurations  for that directory are both


1.5                                - 6 -                            7/29/94







                                   FSave


initialized from the parent directory's global configuration.   The  confi-
guration  file,  if one exists in the directory, is then read; its contents
may modify the local or global configuration.  Modifications to  the  local
configuration affect decisions about whether files in this directory should
be saved or skipped.  Modifications  to  the  global  configuration  affect
decisions about files in subdirectories of this directory.

5.2.2.  Elements of a Configuration

     The local and global configurations contain the same things: one date,
and  six  lists  of  file  names or filename patterns.  The date determines
which files will be skipped; files whose  modification  times  are  earlier
than this date are not saved.

     There are six filename lists that specify:

(1)  files to save,

(2)  files to skip,

(3)  files to delete,

(4)  files that should not be reported if they have been modified but  were
     not saved,

(5)  subdirectories to process, and

(6)  subdirectories to skip.

The   redundant   specification   of   files/directories   to   save    and
files/directories  to skip makes configuration files easier to write; some-
times it is more straightforward to list a few files to skip than it is  to
list all of the files to save.  However, the redundancy allows for contrad-
ictory specifications: what if the same name appears on the list  of  files
to  save  and  the list of files to skip?  To eliminate this ambiguity, the
"skip" lists take precedence over the "save" lists; a complete  description
of  the  manner in which the configuration is processed is given in a later
chapter.

5.2.3.  Configuration Files

     Every directory may contain  a  configuration  file,  though  this  is
rarely  needed because of the inheritance of configurations from the parent
directory.  Configuration files are usually named "fsave.cnf", but this may
be  modified  through  a command line option.  Whatever their names, confi-
guration files all contain one or more entries of the form:

    keyword = values

The following keywords are provided:





1.5                                - 7 -                            7/29/94







                                   FSave


               Date                  DateAll
               SaveFiles             SaveAllFiles
               SaveDirs              SaveAllDirs
               SkipFiles             SkipAllFiles
               SkipDirs              SkipAllDirs
               DeleteFiles ($$$)     DeleteAllFiles ($$$)
               IgnoreUnsaved ($$$)   IgnoreAllUnsaved ($$$)

Each entry must be on its own line.  Lines beginning with a "#"  and  blank
lines  are  all  ignored  as comments.  Configuration file entries are read
without regard to capitalization, so "SaveFiles", "savefiles", "SAVEFILES",
and "SaVeFiLeS" are all equivalent.

     Keywords listed in the left column above affect only the local  confi-
guration;  those  in  the right column affect both the local and the global
configurations.  Because of this, the "All" entries usually appear first in
configuration files, followed by the other entries.

     Date entries may be given in either of these forms:

    Date = mm/dd/yy
    Date = mm/dd/yyyy

Two-digit years 80-99 are interpreted as 1980-1999, with 00-79 being inter-
preted as 2000-2079.  Four digits may be used to specify any year from 1980
to 2108, the range of dates allowed by MS-DOS.

     The values for all other entries are given as a list of zero  or  more
(yes,  the  list may be empty) Unix-style filename patterns, separated from
each other by one or more spaces and/or tabs.   These  Unix-style  patterns
are more powerful than MS-DOS filename patterns, and are fully explained in
the last chapter.  It suffices here to say that most MS-DOS  patterns  will
work  exactly  as you expect them to; the major incompatibility is with the
"?" character, which in a Unix-style pattern  always  matches  exactly  one
character.

     Of course, full filenames and directory names may  also  be  given  in
filename  lists.  However, the entries in a configuration refer only to the
files and subdirectories contained in that directory, so filenames or  pat-
terns containing "\" will have no effect and should not be used.

     With all except the Date entries, the "=" may be replaced with  either
"+"  or  "-".   Using "=" sets the list to the given values, using "+" adds
the given values to the list, and using "-" removes the given values to the
list.  Adding something that is already on a list has no effect, and trying
to remove something that is not on a list is silently ignored.

     Finally, a configuration file may contain  several  entries  with  the
same  keyword, and the entries in a configuration file are processed in the
order in which they appear.  This means that

    SaveAllFiles = *.cpp



1.5                                - 8 -                            7/29/94







                                   FSave


    SaveAllFiles + *.h

has the same effect as

    SaveAllFiles = *.cpp *.h

But be careful, if you do this:

    SaveAllFiles = *.cpp
    SaveAllFiles = *.h

the second entry replaces the value set by the first entry.

5.3.  Common Configuration Problems

     Here are some common mistakes that people make in configuration files.

(1)  The All entries modify both the global and local configurations, which
     leads to this common error:

         SaveFiles = *.exe
         SaveAllFiles = *.txt

     In this example, the first line does not accomplish anything.  It sets
     the  local configuration, but the second line also sets the local con-
     figuration, replacing the value given in the first  line.   The  solu-
     tion:  put  the All entries before other entries in your configuration
     files.

(2)  Using the equal sign replaces the old list with  the  newly  specified
     list.   For example, if the configuration file in the parent directory
     specified a bunch of different kinds of files to save, the  configura-
     tion

         SaveFiles = *.exe

     discards all of that and specifies that only  files  ending  with  exe
     should  be  saved.  If that is really what you want, there is no prob-
     lem.  If what you wanted to do was to _a_d_d this to the  list  given  in
     the parent directory, this is not the way to do it.  The solution: use
     the plus to add new things to an existing list.

5.4.  An Example

     The listings and  files  below  come  from  my  own  system,  and  are
presented  as an example of one way that FSave can be used.  To keep things
to a manageable size, only a subset of my whole disk is shown.  The  direc-
tory listings were all made with the command

    "dir/o:d"

which orders the entries by their date.



1.5                                - 9 -                            7/29/94







                                   FSave


     The root directory looks like this:

     Directory of C:\

    WINA20   386      9349 05-09-91  12:00p
    RECOVERY     <DIR>     08-25-92  12:00p
    DOS          <DIR>     08-25-92  12:00p
    PS1TOOLS     <DIR>     08-25-92  12:00p
    WINDOWS      <DIR>     08-25-92  12:00p
    MSWORKS      <DIR>     08-25-92  12:00p
    QUICKENW     <DIR>     01-24-93  11:03a
    BIN          <DIR>     02-02-93   6:02p
    USR          <DIR>     06-07-93   9:56a
    SRC          <DIR>     12-24-93   3:33p
    CONFIG   SYS       191 12-30-93   3:06p
    PROFILE  SH        387 01-22-94   9:59p
    VIDEO        <DIR>     01-29-94   8:17a
    BC4          <DIR>     05-19-94  10:59a
    AUTOEXEC BAT       759 05-19-94  11:40a
    FSAVE    CNF       109 05-20-94   6:45a
    TMP          <DIR>     05-28-94   7:57a

My configuration in this directory looks like this:

    DateAll = 1/1/93
    SkipDirs = recovery tmp video
    IgnoreUnsaved = 386spart.par

I chose the date because that is when I purchased  the  system;  everything
that was on the system when I bought it can be recovered from the diskettes
that came with it, so there is no need to back up any of it.  I do not back
up  the directories "recovery" and "video" because they do not contain any-
thing that ever changes.  I do not back up the directory  "tmp"  because  I
never  put  anything of lasting value in it; that is my "scratchpad" direc-
tory.

     Let's look  next  at  the  "QUICKENW"  directory,  which  contains  an
installed package.

     Directory of C:\QUICKENW

    HMXPORT  DLL      8256 11-13-92  10:17a
    QDDE     XLS      4898 11-13-92  10:18a
    QDDE     WK3      9651 11-13-92  10:18a
    INTELLIC CAT     12619 09-07-93  12:00a
    QCHECK   EXE      9344 09-07-93  12:00a
    CCT100   DLL    222032 09-07-93  12:00a
    QWPR     DLL    253696 11-03-93   2:51p
    WPRINTCK EXE     61718 12-09-93  12:00a
    QW       EXE   2256256 12-09-93  10:47a
    QW       HLP   1561240 12-09-93  10:47a
    QOWPR    DLL    252000 12-09-93  10:48a
    QOFONT   FON      4096 12-09-93  10:48a


1.5                               - 10 -                            7/29/94







                                   FSave


    BACKUP       <DIR>     05-01-94  10:12a
    FSAVE    CNF        20 06-06-94   9:53p
    QDATA    QNX     92982 07-27-94   9:12a
    QDATA    QDI      5192 07-27-94   9:12a
    QDATA    QDT    484736 07-27-94   9:14a
    QDATA    QMT     31236 07-27-94   9:14a

This is not a complete listing, but is enough to be representative.  When I
installed  this  package,  the  latest  date appearing in the directory was
12/9/93.  Therefore, the configuration file in this directory contains only
this line:

    DateAll = 12/10/93

This prevents anything from  the  original  installation  (which  could  be
recovered  by  re-installing  the package) from being backed up.  Any files
that are _m_o_d_i_f_i_e_d will have dates later than this, and they will be  backed
up.

     In the preceding example, the "QUICKENW" directory  contained  a  sub-
directory called "BACKUP".  Its contents are shown below:

     Directory of C:\QUICKENW\BACKUP

    FSAVE    CNF        18 05-01-94  10:14a
    QDATA1   QNX     92982 07-27-94   9:12a
    QDATA1   QDT    484736 07-27-94   9:12a
    QDATA1   QMT     31236 07-27-94   9:12a
    QDATA1   QDI      5192 07-27-94   9:12a
    QDATA1   QST     39505 07-27-94   9:12a

Quicken periodically copies its data files to this directory  as  a  safety
measure.   I  don't particularly like this, as I back the files up to flop-
pies as often as I think is necessary; as  far  as  I  am  concerned,  this
backup  directory  simply  wastes disk space.  Therefore, the configuration
file in this directory specifies this:

    DeleteFiles = *.q*

so that FSave will automatically delete all the quicken files in the backup
directory.

     Here is one final directory, called "SRC"; this is where  I  keep  the
source code to programs that I write (such as FSave).

     Directory of C:\SRC

    CRYPTO       <DIR>     01-04-94   8:32p
    UTILITY      <DIR>     01-05-94   8:01p
    FINDSYM  SH        270 01-30-94  11:40a
    WENSCRIP     <DIR>     02-20-94   6:26a
    TIMECLK      <DIR>     02-25-94   1:34p
    DU           <DIR>     02-27-94  12:50p


1.5                               - 11 -                            7/29/94







                                   FSave


    LIB          <DIR>     03-03-94   7:38a
    BC4ERRAT TXT       241 04-08-94   5:34p
    CLASSLIB     <DIR>     04-24-94   2:40p
    FSAVE        <DIR>     04-30-94  10:51a
    CLEANSRC SH       1062 06-28-94   6:21p
    FSAVE    CNF       126 06-28-94   6:21p

The configuration file for this directory contains these entries:

    SkipAllFiles = *.dsw *.exe
    DeleteAllFiles = *.~* *.obj *.csm *.bak
    DeleteAllFiles + *.map *.rws *.res *.obr
    IgnoreAllUnsaved = *.dsw

Files with extensions "dsw" and "exe" are not backed up; the former are not
terribly  important,  and  can be recreated with little trouble if they are
lost.  The latter are executable programs.  The only executables  in  these
directories  are  the  ones  generated  from the source code, so they exist
there only while being tested.

     A large number of file types are deleted: these are all  backup  files
created  by the compiler, or things such as object code or linker maps that
have no long-term value.  Finally, the last entry specifies that the  "dsw"
files  which were skipped should not be reported in the "unsaved.txt" file,
as I don't care about them anyway.

     A test-mode filesave  on  these  directories  produced  the  following
results.   Again, I have deleted many entries, especially those from direc-
tories other than the ones discussed above, but have left enough to show  a
representative sampling.  The following files were selected to be saved:

          191 12/30/93 CONFIG.SYS
          387 01/22/94 PROFILE.SH
        1,371 07/27/94 HISTORY.SH
          109 05/20/94 FSAVE.CNF
          759 05/19/94 AUTOEXEC.BAT
       92,982 07/27/94 QUICKENW\QDATA.QNX
      484,736 07/27/94 QUICKENW\QDATA.QDT
       31,236 07/27/94 QUICKENW\QDATA.QMT
        5,192 07/27/94 QUICKENW\QDATA.QDI
           20 06/06/94 QUICKENW\FSAVE.CNF
           18 05/01/94 QUICKENW\BACKUP\FSAVE.CNF
          241 04/08/94 SRC\BC4ERRAT.TXT
        1,062 06/28/94 SRC\CLEANSRC.SH
          270 01/30/94 SRC\FINDSYM.SH
          126 06/28/94 SRC\FSAVE.CNF
          718 06/25/94 SRC\FSAVE\PERRNO.CPP
          411 06/25/94 SRC\FSAVE\PERRNO.H
        9,592 07/27/94 SRC\FSAVE\FSAVE.CPP
        1,380 05/20/94 SRC\FSAVE\CONFIG.H
        7,862 07/27/94 SRC\FSAVE\CONFIG.CPP
       77,206 07/27/94 SRC\FSAVE\FSAVE.IDE
       (and many more)


1.5                               - 12 -                            7/29/94







                                   FSave


    354 files (2,921,018 bytes) to be saved.

The following files would have been deleted:

       92,982 QUICKENW\BACKUP\QDATA1.QNX
      484,736 QUICKENW\BACKUP\QDATA1.QDT
       31,236 QUICKENW\BACKUP\QDATA1.QMT
        5,192 QUICKENW\BACKUP\QDATA1.QDI
       39,505 QUICKENW\BACKUP\QDATA1.QST
        9,556 SRC\FSAVE\FSAVE.BAK
        7,883 SRC\FSAVE\CONFIG.BAK
    2,128,147 SRC\FSAVE\FSAVE.CSM
       78,074 SRC\FSAVE\FSAVE.~DE
       64,598 SRC\FSAVE\CONFIG.OBJ
       75,608 SRC\FSAVE\FSAVE.OBJ
       13,389 SRC\FSAVE\PERRNO.OBJ
      112,021 SRC\FSAVE\FSAVE.MAP
      (and many more)
    31 files (6,283,049 bytes) to be deleted.

The quicken backup files would be zapped, as well as over  5  megabytes  of
other  garbage.   Finally, the following files were reported as having been
modified yet not saved:

      115,608 07/27/94 SRC\FSAVE\FSAVE.EXE
       42,496 07/18/94 SRC\WENSCRIP\WENSCRIP.EXE
    2 modified files unsaved.

These executables in the source directory exist only for testing,  so  they
do  not  concern  me.   If I wanted, I could add the pattern "*.exe" to the
"IgnoreAllUnsaved" line in the  "SRC"  directory's  configuration  file  to
eliminate these messages.

6.  FSave Operation

6.1.  Initialization

     When FSave begins,  it  first  reads  an  initialization  file  called
"fsave.ini".   This  file contains several things that affect the operation
of FSave, for example,

(1)  the command to invoke to actually save a list of files, and

(2)  the directory in which to write lists of filenames.

The format of the initialization file is completely described later in this
chapter.

     FSave then  reads  its  command-line  arguments.   These  may  contain
options  that  select different modes of operation or modify how configura-
tions are interpreted.  The options are followed by zero or more  directory
names,  these are specific subdirectories in which to begin working.  If no
directory names are given, work  begins  in  the  current  directory.   The


1.5                               - 13 -                            7/29/94







                                   FSave


available options are completely described later in this chapter.

     FSave then sets the local and global configuration  to  the  following
default values:

                       DateAll            = 1/1/1980
                       SaveAllFiles       = *
                       SaveAllDirs        = *
                       SkipAllFiles       =
                       SkipAllDirs        =
                       DeleteAllFiles     =
                       IgnoreAllUnsaved   =

This will save all files on the disk, as 1/1/1980 is the earliest date that
MS-DOS can store on a file.

     Normal processing now begins;  it  consists  of  the  following  three
steps:

(1)  If a configuration file is found in the current directory, read it.

(2)  Process each file found in the current directory.

(3)  Recursively process each subdirectory found in the current directory.

6.2.  Processing Files

     "Processing" a file is simply comparing its name and modification date
to  the local configuration to decide whether it should be saved.  Here are
the steps in this process:

(1)  If the name matches any pattern in the "DeleteFiles" list, the file is
     deleted.

(2)  If the modification date of the file is older  than  the  "Date",  the
     file is skipped (i.e. not saved).

(3)  If the filename matches anything on the "SkipFiles" list, the file  is
     skipped.

(4)  If the filename does not match anything on the "SaveFiles"  list,  the
     file is skipped.

(5)  If the file has not been deleted or skipped, its name is added to  the
     list of files to be saved.

     The default configuration makes use of one common strategy of specify-
ing files to be saved: the "Save" list says to save everything, and we rely
on the "Skip" list to omit those files we do not want.  The other  strategy
is  for  the "Save" list to enumerate only those files we want saved; some-
times this is easier to specify.




1.5                               - 14 -                            7/29/94







                                   FSave


6.3.  Processing Subdirectories

     After the files in a directory have been completed, the subdirectories
are  processed.   "Processing"  a  subdirectory  involves matching its name
against the configuration; FSave enters each directory that is not  skipped
and processes its contents recursively (that is, in the same way that first
directory was processed).

     Here are the steps followed for a subdirectory:

(1)  If the subdirectory name matches anything on the "SkipDirs"  list,  it
     is skipped.

(2)  If the subdirectory name does not match  anything  on  the  "SaveDirs"
     list, it is skipped.

(3)  If the subdirectory has not been skipped, then it is recursively  pro-
     cessed.

     Directories that are "skipped" are truly ignored by FSave.   It  makes
no difference whether they contain configuration files that specify work to
be done; if they are skipped, these configuration  files  are  never  acted
upon.

6.4.  Output Files

     FSave writes all of its output files in the temporary directory speci-
fied in the initialization file.  These files include the following:

fsave1.txt, fsave2.txt, etc.
     These files contain lists of the names of files that need to be saved.
     There  may  be  many  of them because some archiving programs impose a
     limit on the size of list files.  When the current list  file  exceeds
     the  "FileSize" given in the initialization file, then FSave closes it
     and begins the next sequentially numbered list file.

saved.txt
     When operating in "test mode", FSave creates one large list file  that
     also  includes  the  size and modification date of each file.  Examine
     this file to see what is going to be backed up; this is the first step
     in figuring out appropriate configurations.

unsaved.txt
     If enabled in the initialization file, FSave will record in this  file
     the  names,  dates  and sizes of all files whose archive bit is on but
     that were not saved.  This is a dangerous combination  -  the  archive
     bit  shows  that  the  file  has been modified, therefore it cannot be
     recovered from the installation media, yet it was not saved.  This may
     indicate  that  the  configuration  file  needs to be changed.  On the
     other hand, there are files for which this  is  not  a  problem.   For
     example,  object  files  produced by compiling source code need not be
     backed up if you have the source files.  Patterns can be added to  the
     "IgnoreUnsaved"  list  in  the  configuration  to  prevent  FSave from


1.5                               - 15 -                            7/29/94







                                   FSave


     yelling about these files every time.

     Note that FSave does not report  unsaved/modified  files  residing  in
     directories  that  have been skipped.  To detect these, run FSave like
     this:

         fsave /a ($$$)

     (Remember that the ($$$)  symbol  denotes  features  disabled  in  the
     shareware  version.)  This  option  is described in more detail below;
     briefly, it instructs FSave look for all files whose  archive  bit  is
     set, even if they would normally not be saved or reside in directories
     that would normally be skipped.  Doing this  just  after  an  ordinary
     filesave  will produce a list of all modified but unsaved files on the
     disk.

deleted.txt ($$$)
     If enabled in the initialization file, FSave will record in this  file
     the  names and sizes of all files it has deleted.  This information is
     useful when running FSave in test mode after modifying  configurations
     to  ensure  that  you  have  not  been  too  aggressive  in specifying
     "DeleteFiles".

6.5.  Saving the Data

     After creating the lists of names of files to  be  saved,  FSave  then
invokes  your  chosen  archiving/compression  program  to actually save the
files.  The current version of "pkzip" (2.04g) is unable to  process  lists
of  filenames which are longer than several thousand bytes, so FSave writes
as many short list files as needed to hold the names of all the files to be
saved.   This  causes  an irritating problem when the archives are actually
being created for backups that take more than two diskettes.  What  happens
is  that  "pkzip"  is  invoked  separately  for  each  list file, so when a
diskette becomes full, "pkzip" has no way of  knowing  how  many  diskettes
were  used  by  the  previous  archive  files.  It therefore prompts you to
insert diskette #2 _e_v_e_r_y time it needs a new diskette, which can be confus-
ing if you are not expecting it.

     A representative of PKWARE has informed me that the  next  version  of
"pkzip" will be able to handle much larger list files, which will make this
problem much less annoying.

     If you can afford the luxury of writing your backups to your hard disk
rather  than to floppy disks, this problem goes away.  In addition, restor-
ing files becomes easier as there is never any confusion as to which floppy
to insert.

6.6.  The Initialization File

     The initialization file  specifies  values  that  affect  the  general
operation  of FSave.  By default this file is named "fsave.ini" and resides
in the same directory as "fsave.exe"; if you  prefer  to  use  a  different
name, or keep the file in a different directory, you may set an environment


1.5                               - 16 -                            7/29/94







                                   FSave


variable called "FSAVE" with the absolute pathname  to  the  initialization
file.

     This file begins with a line containing "[fsave]" followed by  one  or
more of the following entries:

ConfigName = value ($$$)
     Indicates the default name of the configuration file.  If  not  given,
     the  value  fsave.cnf is used.  The extension .cnf may not be changed.
     If you prefer your configuration files to appear either first or  last
     in  a  sorted directory listing, you may use this option to modify the
     name appropriately (e.g. 000fsave.cnf).

ConfirmDelete = value ($$$)
     Indicates whether a confirmation is needed before  deleting  files  as
     specified  by  the  configuration.   The  value may be either "yes" or
     "no", with the default being "yes." If this option is selected,  FSave
     will  prompt  with the name of each file it is about to delete; if the
     reply does not begin with "y" or "Y" the file will not be deleted.

DirectoryIndex = value ($$$)
     Specifies whether an index of the files in each  directory  should  be
     created and saved along with the files.  The value may be either "yes"
     or "no", and defaults to "no."  The  directory  index  allows  you  to
     easily find what has changed in a directory since the last backup.  It
     is also useful after restoring from a backup to remove files that  had
     been  deleted  before the filesave was made.  This option is discussed
     in more detail in a later chapter.

Dump = (command)
IncrementalDump = (command)
     These entries are required, and specify the MS-DOS command to be  exe-
     cuted  to  archive  the  files whose names appear in a list file.  The
     name of the list file can be referenced in the  command  by  the  con-
     struct  "%list%", and the number of the list file can be referenced by
     "%number%".  The number refers to the sequence number of a list  file,
     e.g., 1 for "fsave1.txt", 2 for "fsave2.txt", etc.  The examples below
     are from the quick start initialization file provided on the distribu-
     tion diskette, and use "pkzip".

         Dump = pkzip a:\fsave%number% -ex -P -r- -whs -& -a+ @%list%
         IncrementalDump = pkzip a:\fsave%number% -ex -P -r- -whs -& @%list%

     These both create  compressed  archives  on  the  "a:"  diskette;  the
     archive files are named "fsave1.zip", "fsave2.zip", and so forth; max-
     imum compression is used; the complete pathname for each saved file is
     kept; subdirectories are not recursively processed (because FSave does
     that); "hidden" and "system" files (if selected  by  FSave)  are  also
     saved; the zip files may span multiple diskettes; and the names of the
     files to save are taken from "fsave1.txt", "fsave2.txt" and  so  forth
     in  the temporary directory.  The only difference between the two com-
     mands is that the archive bits of the saved files are not  turned  off
     after  an  incremental  dump.   This  is  a  personal preference whose


1.5                               - 17 -                            7/29/94







                                   FSave


     ramifications are discussed more fully in a later chapter.

FileSize = nnn
     If given, this entry limits the size of the files containing the  list
     of  names  to  back  up to the number of bytes specified.  Once a list
     file goes over this size, a new one is started. For  example,  "pkzip"
     cannot process list files that are larger than a certain maximum size.
     "nnn" represents an integer byte size.  If omitted, the list  file  is
     not limited in size. Example:

         FileSize = 5000


ReportDeleted = value ($$$)
ReportUnsaved = value ($$$)
     These entries specify how you want FSave to  report  files  that  have
     been  deleted,  and  files  that  were not saved though they have been
     modified.  "value" may be any of the following:

                    none     No reporting is done.
                    file     Report to a file (default).
                    screen   Report to the screen.
                    both     Report to a file and the screen

     Report files are written in the temporary  directory,  and  are  named
     "deleted.txt"  and "unsaved.txt" respectively.  When not in test mode,
     the report of deleted files is usually of academic interest (how  much
     disk  space  did  it reclaim?), but the report of modified-but-unsaved
     files can point out files that ought to be saved but  are  not.   This
     file should be examined often to see whether the addition of new files
     has required a change in a configuration.

     ($$$) The shareware  version  does  not  delete  files,  so  none  are
     reported.   Reporting  of  unsaved files is limited only to the "file"
     type.

SaveHidden = value ($$$)
     This entry specifies  whether  hidden,  system,  and  read-only  files
     should be examined by FSave.  "value" may be either "yes" or "no"; the
     default value is "no", meaning that these files  are  always  skipped.
     If  "yes"  is  specified,  then these files will be saved if they meet
     whatever other criteria are given in the current configuration.

SaveList = (directory)
     If given, this entry specifies a directory to  which  the  list  files
     should  be  copied  before the archiving takes place.  This provides a
     convenient way to copy the list files to  the  archive  media  itself,
     where  they  can  be  used  as a table of contents later if individual
     files must be retrieved.  "(directory)" is an absolute pathname.   The
     example  below  is used with the dump commands above, that write their
     output to "a:".




1.5                               - 18 -                            7/29/94







                                   FSave


         SaveList = a:\


SwitchChar = value ($$$)
     This determines which character is used on the command line  to  indi-
     cate  options.   The  value  may be either "/" or "-", and defaults to
     "/".

Temp = (directory)
     Specifies a temporary directory in which the list and report files are
     written.  This should probably not be a directory that you are backing
     up.  "(directory)" is an absolute  pathname.   If  the  entry  is  not
     given, "c:\tmp" will be used.  Example:

         Temp = d:\temp


6.7.  Command Line Arguments

     There are many command line arguments that can be given to modify  how
FSave  does  it  work.  Any number of these may be used on the command line
when FSave is invoked.

     Options  are  introduced  with  either  the  "/"   character,   unless
"fsave.ini"  specifies  that  "-"  be used instead.  The options are listed
alphabetically below.

/a ($$$)
     Starting at the current directory, find all files whose archive bit is
     set and record their names and sizes in the "unsaved.txt" file.

/c   Causes the configuration to be printed on the  screen  for  each  sub-
     directory  processed.   This is useful in debugging your configuration
     files, although it does generate much output when FSave looks  at  the
     whole disk.

/d ($$$)
     This is "delete mode" - FSave scans the directories it normally would,
     but  all  it  does  is to delete the files specified in the configura-
     tions.  This is a convenient way of cleaning the litter off your  disk
     when space starts getting tight.

/D mm/dd/yyyy
/D mm/dd/yy
     Overrides the date set in the configuration files with the given date.
     This  may be used to create a master backup of a specific directory to
     reduce the amount of data that must be saved in an ordinary filesave.

/f name ($$$)
     The default base name for the list files is  "fsave",  unless  a  dif-
     ferent  value  was specified in the initialization file with the "Con-
     figName" ($$$) entry.  This option overrides that and  allows  a  dif-
     ferent  base  name  to  be  specified.   The base name should be short


1.5                               - 19 -                            7/29/94







                                   FSave


     enough to allow the list file number to be appended to it.  For  exam-
     ple,  if  your  backup requires fifteen list files, the maximum length
     allowed for the base name would be six characters.  This is useful  to
     store many small backups on the same diskette.

/i   This does an "incremental" backup.  Files are  selected  according  to
     the configuration as usual, except only those whose archive bit is set
     are added to the list of files to be saved.  The default is to back up
     all  files that match the configuration criteria, whether or not their
     archive bit is set.  Full and incremental backups are  discussed  more
     fully in a later chapter.

/n name ($$$)
/N name ($$$)
     These options specify the name of the configuration file to  use  when
     an  alternate configuration is desired.  The suffix ".cnf" is appended
     to the given name.  If "/n" is used, only configuration files with the
     specified  name will be read.  If "/N" is used, FSave attempts to read
     a configuration file with the specified name; if none  is  found,  the
     default configuration file is read instead.

/o number ($$$)
     This option overrides various aspects of the configuration files.  The
     following numbers are implemented:


           1   Save files even if their modification dates are earlier than
               the configuration.
           2   Save files even if their names match a pattern in the "Skip-
               Files" list.
           4   Save files even if their names match a pattern in the "Skip-
               Files"  list,  OR if their names do not match any pattern in
               the "SaveFiles" list.
           8   Recursively process subdirectories even if their  names  ap-
               pear in the "SkipDirs" list.
          16   Recursively process subdirectories even if their  names  ap-
               pear  in  the "SkipDirs" list OR if their names do not match
               any pattern in the "SaveDirs" list.
          32   Do not delete files specified in the "DeleteFiles" list.
          64   Do not create a "saved.txt" or the "fsave1.txt" files.  This
               means that nothing will be backed up.
         128   Do not create an "unsaved.txt" file, despite what  the  ini-
               tialization file indicates.
         256   Do not create a "deleted.txt" file, despite  what  the  ini-
               tialization file indicates.
         512   Invert the meaning of the configuration date, that is,  save
               only  files  whose  dates are earlier than the configuration
               date.
        1024   Ignore the "IgnoreUnsaved" list; report all unsaved modified
               files in the "unsaved.txt" file.





1.5                               - 20 -                            7/29/94







                                   FSave


     More than one of these overrides may  be  specified  by  adding  their
     numbers together.  For example,

         /o 7

     specifies the first three overrides.  Alternatively, you may give mul-
     tiple "/o" options on the command line:

         /o 1 /o 2 /o 4

     also specifies the first three overrides.

/t   This is the "testing" mode.  FSave creates the list  of  files  to  be
     saved  in  a file "saved.txt" in the temporary directory, but does not
     invoke the archiving program to save them.  In addition, the size  and
     modification  date of each file are also written to the file, allowing
     you to discover files that should not be saved so that you can  modify
     the configuration accordingly.  Unsaved files are reported normally as
     well.

6.8.  Starting FSave

     By default, FSave begins its work in the directory from  which  it  is
started;  pathnames  for  saved  files  are given relative to this starting
directory.  The normal way of running FSave is from the root  directory  of
your hard disk, like this:

    cd c:\
    fsave


     You may also start FSave from a subdirectory, like this:

    cd c:\quickenw
    fsave

The directory from which FSave is started will be treated as if it were the
"root"  directory;  specifically,  pathnames  for saved files will be given
relative to it, and the configuration files in parent directories will  not
be  processed.   Sometimes  this is useful, for example, to create a master
backup of a specific directory without regard to the dates of its files.

     The third way of starting FSave is from the root directory,  but  with
pathnames  to  one or more specific subdirectories given as arguments after
the options, like this:

    cd c:\
    fsave quickenw

For each pathname given, FSave starts with its default configuration, reads
the  configuration files in each subdirectory on the way down to the speci-
fied one, and then begins operating in that directory.  Pathnames of  saved
files  will  be  given  relative  to  the target directory.  The difference


1.5                               - 21 -                            7/29/94







                                   FSave


between this method and the second method above is that  the  configuration
information developed from the root down to that directory is processed.

6.9.  Starting FSave from Windows

     Once you have finalized your  personal  filesave  procedure,  you  can
avoid  the  need  to open a DOS window by starting FSave directly from Win-
dows.  This is easily done with these steps.

(1)  Copy the batch file "wfsave.bat" and the icon "fsave.ico" to the  same
     directory in which you put "fsave.exe".  The batch file contains these
     commands:

         @echo off
         rem Batch file to run fsave.exe from Windows
         fsave %1 %2 %3 %4 %5 %6 %7 %8 %9
         pause


(2)  Now go to the Program Manager and select "File|New", then select "Pro-
     gram  Item"  and  click  "OK".   Enter "Filesave" for the description,
     "wfsave.bat" for the command line, and "\." for the working directory.
     You may use the icon in "fsave.ico" if you wish.  Then click on "OK".

(3)  To do a  filesave,  simply  double-click  this  item  in  the  Program
     Manager.   If  Windows  complains that it cannot find "wfsave.bat" you
     will need to use "File|Properties" and  change  the  command  line  to
     include the complete pathname to it.

     The "pause" command in the batch file allows you to read  the  results
of  FSave  before the DOS screen disappears.  The batch file can be invoked
with different arguments; for instance you can create another program  item
whose command line is

    wfsave.bat /t

to do a test save, and a third whose command line is

    wfsave.bat /a

($$$) to look for modified but unsaved files.

7.  Strategies for Using Configurations

     With its default configuration, FSave  will  save  everything  on  the
disk.   The  name  of the game is to create configurations that prevent any
files from being saved that could be recovered from other media.

7.1.  The Root Directory

     The quick start chapter illustrated the most basic strategy: the  con-
figuration  file  in  the  root directory specifies an overall date for the
system.  On many PCs, using the date that the machine was  purchased  is  a


1.5                               - 22 -                            7/29/94







                                   FSave


good  start,  as the software that came with the machine is obviously older
than that.

     Of course this implies that you still have the  diskettes  from  which
that  software  was  loaded.   If  you do not, or if your machine came with
preloaded software and you have no backup media, you will have to create  a
master  backup.   This  process  is  described  in  more  detail in a later
chapter.

     In addition, the configuration file in the root directory can  mention
any specific files or directories that need not be saved.  For example, the
configuration file in the root directory on my hard disk looks like this:

    DateAll = 3/1/93
    SkipDirs = tmp video

This indicates that no files dated earlier than  3/1/93  should  be  saved;
"DateAll" was specified so this date applies in this directory and all sub-
directories (until overridden by another configuration file in a  subdirec-
tory  somewhere).   I  also  have  specified that the directories "tmp" and
"video" are to be skipped; this is because "tmp" is a  temporary  directory
that  contains  only  scratch  files,  and nothing in "video" ever changes.
Note that these names were specified in the local  configuration  only,  so
they  apply  only  to this directory.  Once FSave enters a subdirectory the
specification to skip "tmp" and "video" is discarded.  On the  other  hand,
the  keyword  "DateAll"  put the date in the global configuration, so it is
carried into all subdirectories until  modified  by  another  configuration
file.

7.2.  Subdirectories

     The type of configuration needed in a subdirectory  depends  upon  how
the  files  that it contains are used.  Several possibilities are discussed
below; there are probably additional cases  that  I've  missed,  but  these
examples  should  be  enough  to give you ideas for handling other types of
directories.

7.2.1.  Static Directories

     Some directories contain files  that  simply  never  change,  or  that
change  only trivially.  Here, "trivially" means that the changes are unim-
portant; if the file were lost, a restored copy of the file in its original
form would be perfectly acceptable.

     Directories such as these  can  simply  be  skipped.   Be  very  sure,
though,  that  any  modifications  that  subsequently occur to files in the
directory are indeed trivial as described above.

     You might ask, "What harm is  there  in  FSave  looking  through  this
directory  -  if  nothing is saved, it costs little to look." This is true,
and it is easy to argue that this approach is safer as well; should a  file
in this directory change unexpectedly, then it will be saved.



1.5                               - 23 -                            7/29/94







                                   FSave


     It does take a small amount of time for FSave to process a  directory.
A  bigger  cost,  though, is that the directory index (described fully in a
later chapter) that must be created, backed up, and then  deleted.   For  a
directory  that truly has no activity, this effort is wasted.  FSave allows
you to specify whichever option you think is best.

7.2.2.  Dynamic Directories

     If a directory contains files that are all constantly  changing,  then
everything  in  the directory should be saved.  This is easily accomplished
by setting the configuration date to 1/1/80 (or any date earlier  than  the
oldest file you wish to save).

7.2.3.  Static/Dynamic Directories

     These previous two cases are easy to handle; these dirctories are more
interesting.

     Some directories contain files that are constantly being modified  and
files  that  never  change.   A  directory that contains a software package
probably contains files that are unchanged since the installation and files
that  are  modified  every  time  the package is used.  The straightforward
approach to configuring these directories is to  specify  a  date  that  is
later than any of the unchanged files but before all of the modified files.
In principle, there may be overlap between  these  date  ranges,  but  this
rarely occurs in practice.

     The obvious choice for this date is the day after  you  installed  the
software:  anything you have changed since the installation cannot be dated
before the installation.  If portions of the software  or  its  data  files
reside  in  subdirectories, setting the global date in the configuration of
the main directory causes it to be used in each subdirectory as well.   For
many directories, this is all that will be needed.

     Things become more interesting when updates are applied  to  the  pro-
grams in such a directory.  After being patched, the modified programs will
have dates that are more recent than many data files that are being  saved.
The question is, do you want to save the modified program?

     It depends.  Suppose you don't want save the  program.   This  can  be
accomplished  by  changing  its  date  with  the  "setftime"  ($$$) utility
included with FSave, or by changing the date  in  the  configuration  file.
Should  you  need  to  reload it later, though, the program will have to be
patched again so you must save the patch information and take the  time  to
apply the patch again after reloading.  However, the filesave remains small
and fast because this program does not get saved each time you back up your
system.

     On the other hand, suppose you do  want  to  save  the  program.   The
filesave gets larger and slower, but it is easier to restore the program if
you need it because the patched version was being  saved  all  along.   The
problem  is  that  the filesave, which occurs frequently (we hope), becomes
less convenient to make restoring the file, which occurs  infrequently  (we


1.5                               - 24 -                            7/29/94







                                   FSave


hope!) more convenient: this is backwards.

     There is a simple compromise between these extremes.  First,  set  the
date  in  the  configuration file as you normally would to ensure that your
modified files are saved.  Then, when the amount of data being  saved  from
the  directory  grows enough to justify the effort, make a master backup of
everything in the directory.  Then change the  date  in  the  configuration
file to be the day after you created the master backup.

     By taking the time to back up the entire directory once, your periodic
filesaves  become  quicker  and easier because only the files changed since
you created your master backup will be saved.  Later,  when  an  inordinate
amount  of  data  is  again  being  saved from this directory, a new master
backup can be created and the process starts anew.

7.2.4.  The \windows Directory

     The "\windows" directory is an example of a static/dynamic  directory:
it contains program manager group files that change almost constantly; ini-
tialization files that change, some frequently and  some  less  frequently;
and  executables  and  other  files  that  change rarely, if at all.  It is
tempting to classify changes to the program manager files  and  initializa-
tion  files as trivial and skip this directory, but I prefer to back it up:
the amount of data is small enough that it is not a  bother,  and  I  won't
have to go through each of my applications after reloading and get them all
set up again.

7.2.5.  The \windows\system Directory

     Interestingly, the "\windows\system" directory is a  different  story.
The  files  it  contains (device drivers and dynamic link libraries) do not
change, while new files may be added to the  directory  every  time  a  new
package  is  installed.   The  difficulty  here is that the newly installed
files may be dated months or years in the past, making it impossible to use
dates  to  discriminate  between "old, unmodified" files and "new, changed"
files.

     One approach to this dilemma is  to  skip  the  directory  completely.
After all, it can be reconstructed by reloading the original operating sys-
tem and then reloading each application one by one.   On  the  other  hand,
suppose  you accidentally deleted just this one directory.  You would prob-
ably not be thrilled by the prospect of reloading all of your software (and
possibly   reapplying   patches)  just  to  recover  the  contents  of  the
"\windows\system" directory.

     A more conservative strategy is to create  a  master  backup  of  this
directory (which is unpleasant due to its size), and clear the archive bits
of all files in the directory.  Then periodically examine it  to  see  what
files  have  been  added  or  changed.  Imagine having to reload all of the
software packages (and reapply whatever patches are appropriate)  to  which
these files belong: when this prospect begins to make you shudder, create a
new master backup.  Again, you cannot rely upon modification dates for this
directory   because   files  added  to  the  directory  during  a  software


1.5                               - 25 -                            7/29/94







                                   FSave


installation might have any modification date.

7.3.  Testing Configurations

     The test mode of FSave provides a  quick  and  easy  way  to  see  the
results  of new or modified configurations.  Simply examine the "saved.txt"
and "unsaved.txt" files to see which files are saved and the modified files
that are not saved.

     If you think that FSave is not saving the  files  you  specified,  try
checking  your  configuration with the "/c" option.  This causes the confi-
guration to be printed for each directory FSave processes; by examining the
progression  of  configurations from the root directory to the one in which
the problem is occurring, you can locate the erroneous configuration file.

8.  Master Backups

8.1.  What Is a Master Backup?

     What is a "master backup", how do you create one, and  why  would  you
want  to  create one?  Simply stated, a master backup is a backup of all of
the files in a particular directory.  The interesting part of this  is  the
word "all", as you shall soon see.

     Why would you want such a thing?  A  master  backup  can  serve  as  a
replacement  for  the  installation  medium  for  software  whose  original
diskettes have been lost, damaged or discarded.  Additionally,  creating  a
master  backup  reduces  the  amount  of  data  that  must be saved in your
periodic filesaves.  After creating the master backup, the date in the con-
figuration  for  the  directory  can be changed to the day after the master
backup; only files modified after the master backup  need  be  periodically
saved.

8.2.  Creating a Master Backup

     A master backup can be created in either of two ways.  The easiest way
is  to  simply use "pkzip" (or your favorite compressing/archiving program)
in its usual way to save everything in the directory.  This  is  easy,  but
has  the disadvantage of including all files in the backup.  Now I can hear
you saying, "but the whole point was to get all the files!"  True,  but  if
the  directory  contains  large data files that are frequently modified and
thus will be saved in your ordinary filesaves, you may find  it  more  con-
venient to omit them from the master backup to reduce its size.

     A slightly more involved method way is to  create  the  master  backup
using FSave.  Special options are used to override the configuration in the
directory.  For example:

    cd c:\quickenw
    fsave /D 1/1/80

will save files in the "quickenw" directory regardless  of  date.   If  the
configuration  in this directory specifies files to skip, you may prefer to


1.5                               - 26 -                            7/29/94







                                   FSave


use

    cd c:\quickenw
    fsave /D 1/1/80 /o 4

which will save files even if they appear in the  "Skip"  list  or  do  not
appear in the "Save" list.

     If the directory contains subdirectories that should be on the  master
backup  but  are skipped by the configuration, the following commands would
be used:

    cd c:\quickenw
    fsave /D 1/1/80 /o 16


     Another alternative is to set the date in the  configuration  file  to
today's date, and then use this command:

    fsave /o 4 /o 16 /o 512

Besides saving files and directories regardless of the  "Save"  and  "Skip"
lists, this command inverts the meaning of the configuration date, so FSave
backs up only those files whose date is  earlier  than  the  configuration.
Now  an  ordinary filesave will back up all the remaining files, so between
the master backup and an ordinary backup every file has been saved.

     Here is another technique that can be  useful.   Create  an  alternate
configuration  file  (see  chapter  11)  containing the date that separates
files unchanged since they were installed from the  files  that  have  been
modified,  and  use this to create the master backup.  Then set the date in
the regular configuration file to the  day  after  the  master  backup  was
created.   Your  regular  filesaves  will  back up only those files changed
since the master backup was taken, but the master  backup  itself  will  be
shorter  because  it will not include any files which can be recovered from
the original distribution media.

8.3.  Whole System Master Backup

     This final technique will appeal to those who are nervous about  being
able  to  restore  everything  properly  from  distribution disks and other
sources.  First, make a master backup of your entire disk.  You can do this
with  FSave  using  any of the methods described above, or you can just use
"pkzip" or your favorite archiving  program  in  the  usual  manner.   (You
should  get  a  _l_a_r_g_e stack of floppy disks ready, however.) Then, create a
configuration file in the root directory of the disk and specify  "DateAll"
to be the day after you created the master backup.

     That's all there is to it.  You don't even need to  create  any  other
configuration  files  unless certain directories need not be saved, or con-
tain files that need not be saved.  When your backups become  large  enough
to  be  a  nuisance,  make  a  new master backup of the whole disk and then
modify the "DateAll" appropriately.


1.5                               - 27 -                            7/29/94







                                   FSave


9.  Restoring Files from Backups

     Restoring files after a hard disk failure is straightforward, if tedi-
ous:  reload  the operating system, reload all software packages from their
installation media or your master backups, then reload the latest backup.

     It is impossible to give specific instructions on how to  "reload  the
latest  backup",  as  the exact procedure depends on what archiving program
you used to create the backup.  However, here are some general hints.

(1)  FSave stores the pathname for each saved file relative to  the  direc-
     tory  you  were in when you made the backup.  In order to restore your
     files to their proper locations, change to that same directory  before
     beginning to restore files.

(2)  Use whatever program is appropriate to extract files, for example,  if
     you  used  "pkzip"  to create the archive, then use pkunzip to extract
     files from it.  Run this program on each archive  file,  one  by  one,
     until you have restored them all.

(3)  If the extraction program has an option that preserves  the  directory
     structure  of  the  restored  files, use it.  If this is not done, all
     your files will end up in the root directory.

(4)  It is irritating to restore files from a backup that takes  more  than
     one  diskette  when  you  are  using  a  program such as pkunzip which
     requires you to begin by inserting the last disk of an archive.   This
     is  because you need to know whether each archive file is split across
     two or more diskettes, and if so, which diskettes it resides on.  This
     is  most  easily  handled  by  printing  the directory listing of each
     diskette before beginning to restore your files; when you are asked to
     insert  the last diskette for an archive, simply consult the directory
     listings beginning with the one for the current diskette to  find  the
     one  that  contains  the  last part of the archive.  For archive files
     which are contained entirely on the current diskette, there is no need
     to insert any other one.

     If you are lucky enough to have the space to be able  to  create  your
backup  files right on the hard disk, restoring files is much easier.  This
is because the entire archive file is on the disk, so there is no  need  to
be swapping diskettes in and out.

9.1.  Re-Deleting Deleted Files

     This is tedious, but not difficult.   But  there  is  a  complication.
Suppose  you  bought a brand new application, loaded it on your system, and
then decided to delete the several files containing tutorials and examples.
After  backing up this directory several times, the disk fails.  Now you've
gotten your disk repaired and want to reload it, so you  follow  the  steps
listed  above.  When you are finished, you will find that the tutorials and
examples have reappeared.  This problem is solved with the directory index.




1.5                               - 28 -                            7/29/94







                                   FSave


9.2.  Directory Index

     A "directory index" ($$$) is just a list of all the files in a  direc-
tory, whether they are saved or not; it is written to the file "fsave.idx",
and  saved  in  the  backup.   After  restoring  a  directory  from  backup
diskettes,  it  may contain files had been deleted.  The "reconcil" program
($$$) provided with FSave can then be run to reconcile the  directory  con-
tents with the index.  This program deletes files that should not be there,
and reports differences between the actual directory contents and the  con-
tents  as  specified  in the index file.  When this is completed, the index
file itself is deleted.

     Directory index files are not created by default because of the  addi-
tional  time and space that they require.  The "DirectoryIndex" ($$$) entry
in the initialization file is used to enable directory indices.

9.3.  Restoring Individual Files

     Restoring a specific file from a backup is takes two easy steps.

(1)  Determine which archive the file is in.  This can be done by using  an
     editor  to  examine  the  list  files  which  are written to the first
     diskette.  Or, you can use your archive extracting program to print  a
     list of what is in each archive file.

(2)  When you know which archive the desired file is in, use  your  archive
     extracting program to extract it.

     If you wish to put the file to where it originally resided, change  to
the directory you were in when you created the backup before restoring, and
if your extracting program has an option to preserve the  directory  struc-
ture  of  the  restored  file, use it.  If you want the file to be restored
somewhere else, either do the restore from a different  directory,  do  not
use the option to preserve the directory structure, or both.

10.  Incremental Backups

     When even FSave backups begin to get cumbersome, consider doing incre-
mental  backups  interspersed with an occasional full backup.  In an incre-
mental backup, files are selected for backup in the usual manner, and  then
one additional constraint is imposed: the archive bit must be set.

     For this to work, the archiving command used  for  full  backups  must
clear  the  archive  bits of the files saved.  Then, as files are modified,
their archive bits are set; the next  incremental  backup  will  save  only
those files that have been modified since the last full backup.

10.1.  Incremental and Delta Backups

     An incremental backup saves everything modified since  the  last  full
backup  was  taken.  To do this, the archiving command used for incremental
backups must not clear the archive bits of files saved.  Thus, each  incre-
mental  backup contains all of the files on the preceding one, and possibly


1.5                               - 29 -                            7/29/94







                                   FSave


some new ones.

     Incremental backups get larger and larger,  then,  as  time  goes  by.
When  they get uncomfortably large, a full backup is done.  The next incre-
mental backup will be small again.

     An alternative strategy is what I call "delta" backups.  This  is  the
same  as  an  incremental  backup except for one thing: the archive bits of
files saved in a delta backup are cleared after the  backup  is  completed.
This  means that each delta backup saves only those files that were changed
since the last delta backup, so they do not continue  to  grow  larger  and
larger.

     On the other hand, no single delta backup contains all  of  the  files
that  have  changed  since the last full backup.  This makes restoring from
delta backups more tedious, as described below.

     FSave allows you to choose either incremental or delta backups.   This
is  specified indirectly in the command you provide to do incremental back-
ups: if the command causes the archive bits to be cleared,  you  get  delta
backups.  If the command does not clear the archive bits, you get incremen-
tal backups.  Be aware, however: this is just another tradeoff.  The  price
paid  for the benefit of the smaller and faster incremental backups is that
restoring your disk will take more time.

10.2.  Restoring from Incremental Backups

     To restore from incremental backups, you begin by doing all  the  same
steps  described earlier, but then the latest incremental backup (or all of
the delta backups, in order) must also be reloaded.  Even restoring a  sin-
gle  file  is more complex: to get the latest version of a file, the latest
incremental backup must be checked to see if it contains the file; if  not,
the  latest  full backup is used.  Delta backups are even worse: all of the
delta backups done after the most recent full backup must  be  examined  in
reverse order; the first one that contains the desired file is used.

     If this sounds bad, remember that we hope to be restoring  files  much
less  often  than we back them up.  If restores are needed frequently, your
configuration files should probably specify backing up more files, and  you
should avoid incremental or delta backups to simplify restorations.

11.  Alternate Configurations

     FSave allows several different sets of configurations to exist on  the
same disk.  This is done by storing the configurations with different names
and using command line options to select from among them.

11.1.  Specifying an Alternate Configuration

     The default configuration is always stored in files named  "fsave.cnf"
in various directories on the disk.  With the "/n" option, a different name
can be specified.  For example, the command:



1.5                               - 30 -                            7/29/94







                                   FSave


    fsave /n fsaveall ($$$)

would do the usual filesave activity,  but  would  look  for  configuration
information in files named "fsaveall.cnf".

     The "/N" ($$$) option works in much the same way,  except  that  if  a
directory  does  not  contain a configuration with the specified name, then
FSave tries to read the default configuration file instead.

11.2.  Using Alternate Configurations

     Multiple configurations may be used in many ways.  First, they provide
a  simple  way to create master backups of specified directories: while the
ordinary configuration specifies a date and directories to skip, an  alter-
nate configuration might specify none of these, thus saving the entire disk
or directory.

     Second, they can be used to set up  a  multilevel  incremental  backup
scheme,  in  which  different configurations specify different dates and/or
file/directory combinations.

     One final example uses different configurations to back  up  different
subsets  of  the disk.  For example, you might wish to save the contents of
one set of directories on 1.44 Mb floppy disks, but save a different set of
directories on 1.2 Mb floppies.  Or perhaps each different user of a system
might wish to use their own configurations to back up their own  subset  of
the data on the system.

12.  Unix-Style Filename Patterns

12.1.  Overview

     Filename patterns on Unix systems are for the most part a superset  of
MS-DOS filename patterns.  Unix-style patterns may contain ordinary charac-
ters and wildcard characters.

     Ordinary characters appearing in a pattern must match the next charac-
ter  in  the  filename.   On  Unix  systems,  case  is  significant; MS-DOS
filenames are all monocase, so FSave translates all filenames and  filename
patterns  to  upper  case when they are read.  Note that the period is con-
sidered to be an ordinary character.

     The first wildcard character is the asterisk, which  matches  zero  or
more of any characters, including the period.

     The second wildcard character is  the  question  mark,  which  matches
exactly  one  character.   This is different from the MS-DOS interpretation
which, in some circumstances, allows the question mark to match either zero
or one character.

     Finally, the square brackets enclose a character class:  this  matches
any  one  of  the characters contained in the class.  Character classes may
contain character ranges such as "a-z" and "0-9;"  this  is  equivalent  to


1.5                               - 31 -                            7/29/94







                                   FSave


specifying  each  of  the  individual characters in the range.  A character
class that begins with a caret (^) is interpreted as containing only  those
characters that are not contained in the brackets.

12.2.  Examples

     Several examples given below.

*    Matches zero or more characters.  Because the dot  is  treated  as  an
     ordinary character in a filename, this pattern matches all names.

*.txt
     Matches all filenames with the extension "txt".

*.*  Matches zero or more chars, then a dot, then zero or  more  additional
     chars.   This  matches  all  filenames that have an extension (with no
     extension, there is no dot).

a*   Matches all files that begin with an "a".

a*b  Matches all files that begin with an "a" and end with a "b",  such  as
     "ab", "a.b", and "abcde.dcb".

???  Each question mark matches exactly  one  character,  so  this  pattern
     matches all filenames containing exactly three characters.  This would
     include "abc" and "a.b", but not "a.txt" (remember that the dot counts
     as a character).

a?b  Matches all names that begin with an "a", end with  a  "b",  and  have
     exactly  one  character  between.  This would include "a.b" and "acb",
     but not "ab", "a.bb", or "a.ba" .

[abc]
     Matches only the filenames "a", "b", and "c".

[abc]*
     Matches all filenames that begin with "a", "b", or "c".

[^abc]*
     Matches all filenames that begin with any character  other  than  "a",
     "b", or "c".

*[ab][cd]*
     Matches all filenames that contain "ac", "ad", "bc", or "bd"  anywhere
     in their name.










1.5                               - 32 -                            7/29/94



