home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 January / Chip_1999-01_cd.bin / zkuste / delphi / D1 / UDIR11.ZIP / UDIR.DOC < prev    next >
Text File  |  1995-09-29  |  17KB  |  403 lines

  1.                 ┌───────────────────────────────────┐
  2.                 │   THE ULTIMATE DIRECTORY LISTER   │
  3.                 │               from                │
  4.                 │          The FastAid Co.          │
  5.                 │             (c), 1990             │
  6.                 └───────────────────────────────────┘
  7.  
  8.         The Ultimate Directory Lister lets you ...
  9.         
  10.         --list any, or all, files in a specified directory and its 
  11.           subdirectories.
  12.         
  13.         --stop the listing after the specified directory
  14.         
  15.         --redirect the output to a file or printer
  16.         
  17.         --sort the directory by name, date, size and attribute
  18.         
  19.         --perform a crude but effective "whereis" operation
  20.         
  21.         --find all new files on a disk
  22.         
  23.         --format the output in one of several ways
  24.         
  25.         --perform a pseudo batch operation using an @file
  26.         
  27.         --pause the listing to prevent scrolling
  28.         
  29.         --find the subtotals and grand total of all files chosen
  30.         
  31.         --use wild card searches and search for hidden, system,
  32.           read-only files, and directories.
  33.  
  34.  
  35. Here's how...
  36.  
  37. IF YOU        Type UDIR, at the DOS prompt,...
  38.  
  39. YOU WILL GET  A listing of just the fully qualified names of all
  40.               the files in the current directory AND the fully
  41.               qualified names of all the files in the subdirectories.
  42.  
  43.               You can get the same result if you type UDIR . (UDIR 
  44.               followed by a space and a period)
  45.  
  46. IF YOU        Type UDIR .. at the DOS prompt,...
  47.  
  48. YOU WILL GET  A list of the FQ filenames (i.e. the file name preceded
  49.               by the drive letter and the path) for the parent direc-
  50.               tory of the current directory and all the subdirectories
  51.               attached to the parent.
  52.  
  53. IF YOU        Type UDIR \ at the DOS prompt,...
  54.  
  55. YOU WILL GET  A list of all the FQ filenames for the root directory
  56.               and all the subdirectories on a disk. (This is sort of
  57.               like the result of using CHKDSK /V.)
  58.  
  59. IF YOU        Type UDIR \*.DOC at the DOS prompt,...
  60.  
  61. YOU WILL GET  A list of all the files that end in ".DOC" beginning
  62.               in the root directory and continuing for all subdirec-
  63.               tories. You could also use \ad*.doc as a way to find all
  64.               files that begin with "ad" and end with ".DOC" on the
  65.               disk. Think of this as a substitute for the typical
  66.               "whereis" program.
  67.  
  68. IF YOU        Type UDIR C:\UTIL at the DOS prompt,...
  69.  
  70. YOU WILL GET  A list of all the files in a directory named \UTIL on
  71.               the C:\ drive along with the files in any subdirectories
  72.               attached to C:\UTIL.
  73.  
  74. IF YOU        Type UDIR A: at the DOS prompt,...
  75.  
  76. YOU WILL GET  A list of all the files on the disk in the A: drive.
  77.  
  78. IF YOU        Type UDIR ! at the DOS prompt, where "!" may precede
  79.               or succeed any other parameter such as "\" or "A:\",...
  80.  
  81. YOU WILL GET  A listing of the files in only the directory specified:
  82.               no subdirectories will be accessed.
  83.  
  84. IF YOU        Type UDIR @filename at the DOS prompt and, if you have
  85.               prepared a file with the title "filename" , (more of
  86.               that later)....
  87.  
  88. YOU WILL GET  As many listings of files as have been called for in
  89.               the file with the @filename.
  90.  
  91.  
  92.                           SUMMARY SO FAR
  93.  
  94. The FIRST parameter that follows the UDIR command may contain
  95.  
  96. 1) the drive letter and ":" for any existing drive,
  97.  
  98. 2) the name of any directory that exists on the specified drive
  99.  
  100. 3) the name of a file to search for, or any group of files as
  101.    specified by the wildcards "*" or "?"
  102.  
  103. 4) the exclamation point "!" to stop the listing after the specified
  104.    directory.
  105.  
  106. 5) the "@FileName" parameter which will designate a text file with any
  107.    name. The text file may contain any number of lines of valid
  108.    command-line parameters for the UDIR program. Examples will follow
  109.    after showing what else you can do with UDIR.
  110.  
  111.  
  112. AND NOW FOR THE SECOND, AND SUBSEQUENT, COMMAND LINE PARAMETERS...
  113.  
  114. The second and subsequent command line parameters begin with either the
  115. symbol "/" or "-" . There are many different options from which you may
  116. choose.
  117.  
  118. 1) File attribute options : Archive, System, Hidden, Read-only, Directory
  119.  
  120.    You may call for any, or several of these options by adding the
  121.    command line switch(es) in the form /A /S /H /R  /D.  You may also
  122.    group the switches together as in /AHD.
  123.  
  124.    If you choose to invoke each switch with a preceding / or - sign,
  125.    then there must be a space between the switches.
  126.  
  127.    These switches act as filters for the final output. For example, the
  128.    switch /AR  will show only those files whose Archive bit and/or Read-
  129.    only bit is set.  Similarly the /D switch will show only the direc-
  130.    tories on the disk.  This may appear to be something like a "tree"
  131.    command, but it is different.  For instance, if you give the command
  132.    UDIR \ /D , you will get a listing of all the subdirectories in the
  133.    root directory followed by all of the directories in each of the
  134.    subdirectories contained in the root directory.  UDIR considers
  135.    subdirectories to be the same as files, which, indeed, they are.
  136.  
  137.    The default, when no filter is used, is to show all filenames
  138.    including the names of subdirectories.
  139.  
  140.    If you wish to exclude the names of subdirectories from the
  141.    listing, use the switch /AHRS.
  142.  
  143. 2) Sorting options : name, extension, size, time, attribute
  144.  
  145.    You may call for any ONE of these options by specifying /n /e /s /t /a.
  146.  
  147.    Note that the sorting switches are in lower case whereas the
  148.    attribute switches are in upper case.
  149.  
  150.    You may also add this option to the single parameter for the attri-
  151.    butes. For example, UDIR  /ARs  would produce a listing of all
  152.    files in the current and child subdirectories whose Archive and/or
  153.    Read-only bit are set. The list will be sorted by size.
  154.  
  155.    NOTE that the sorting is done for each directory rather than a
  156.    global sort.
  157.  
  158.    The directories are always presented in alphabetical order.
  159.  
  160. 3) Pause option : p or P
  161.  
  162.    You may use this option by specifying /p or /P or you may add it to
  163.    the list of other switches.  It will stop the listing and say
  164.    ---MORE---  at the bottom of the screen. Press any key to continue
  165.    the listing or press Ctrl-C to stop the listing.
  166.  
  167.    (NOTE: if you have called for a listing of files on a different
  168.    disk, and abend the listing before it's complete, you may wind up
  169.    with an A:\ prompt rather than a C:\ prompt. )
  170.  
  171. 4) The total option: T (Use only upper-case to avoid conflict with the 
  172.    "t" option which is the option to sort by time.)
  173.  
  174.    The /T switch produces a file-count and a byte-sum for the files 
  175.    shown in each directory along with a grand total of the number of 
  176.    files and the total byte count at the end of the listing. The final 
  177.    sum is shown in Kbytes.
  178.    
  179.    The switch may be added to the ever growing list of switches. For
  180.    example UDIR \ /ARsTp
  181.  
  182. 5) Formatting options: 1 2 3 4 5 6 7
  183.  
  184.    /1 is the default display format. It produces a list of only fully
  185.    qualified names. This would be a good choice to use to produce a
  186.    list of all new files on the disk.  For instance \ /A1pn (or /APn)
  187.    would give a list of all files whose Archive bit is set. The list
  188.    would pause to prevent overflowing the screen. It would also be
  189.    sorted by name.
  190.  
  191.    /2 gives a list of fully qualified filenames preceded by "%1 " and
  192.    followed by " %2". This listing could become the basis for a batch
  193.    file. For example if you used the command ! /A2 > newfls.bat, you
  194.    would create a file called "newfls.bat" which would contain lines
  195.    such as
  196.    %1 C:\TP5\TPC\LINKLST.PAS %2
  197.    %1 C:\TP5\TPC\WIN.TPU %2
  198.    %1 C:\TP5\TPC\ADIR.PAS %2
  199.    %1 C:\TP5\TPC\UDIR.DOC %2
  200.  
  201.    You could then run the batch file : NEWFLS COPY A:\TP5\TPC
  202.    "COPY" would replace %1 and "A:\TP5\TPC" would replace %2 on each
  203.    line. Then you could use NEWFLS DEL  to erase all the new files.
  204.  
  205.    Or you could use UDIR !*.pas /A2 > vufls.bat and then use the command
  206.    VUFLS TYPE
  207.  
  208.    This would let you view each of the ".PAS" files whose Archive bit
  209.    is set in just the current directory.
  210.  
  211.    /3 produces a list of fully qualified filename along with their
  212.    size (actual number of bytes). It is most useful when combined with
  213.    the /A and /T switches.  For instance UDIR \ /ATp3s would give a
  214.    paused list of all files on the disk whose Archive bit is set. The
  215.    list would be sorted by size, in each directory, and the sizes of
  216.    the files would be shown along with subtotals and grand total.
  217.    This would be a good option to use when you want to create a
  218.    commented list of files. Just use UDIR /3 > filex . Then you can
  219.    use a text editor to append descriptions of the files to the
  220.    listings.
  221.  
  222.    /4 yields a listing that may be useful in approximating how many 
  223.    files from a hard disk would fit on a partially filled floppy disk. 
  224.    The listing shows the fully qualified filename, the size, in bytes. 
  225.    Then the number of clusters used on the disk are shown, along with 
  226.    the cluster size. Finally the product of the number of clusters and 
  227.    cluster size is displayed followed by the "slack" bytes (the number 
  228.    of bytes wasted due to the way that DOS puts files on the disk.)
  229.  
  230.    Different types of disks have different cluster sizes. 360K and 
  231.    720K disks have cluster sizes of 1024 bytes. 1.2M and 1.44M disks 
  232.    have cluster sizes of 512 bytes. Some hard disks have clusters of 
  233.    either 1024, 2048, or even 4096 bytes.
  234.  
  235.    I have not been able to find a suitable function call that will 
  236.    determine the cluster size of all disks. Thus I have made the 
  237.    cluster size a choice for the user.
  238.  
  239.    You may specify which cluster size you wish to use by using the 
  240.    command line switches, "W","X","Y","Z". These may be used to
  241.    pick a cluster size of either 512, 1024, 2048, or 4096,
  242.    respectively. The default cluster size is 1024.
  243.  
  244.    I leave it to the interested user to figure out how this 
  245.    information might be used to determine the amount of space needed 
  246.    on one disk to accommodate files from another disk.
  247.  
  248.    /5 creates a list showing the FQ filenames along with sizes and
  249.    the age of the files in days. If the file was created on the
  250.    day you produce the list, then "TODAY'S DATE" label will
  251.    appear.  If you are running on a computer which does not have a
  252.    built in clock and you forgot to set the time and date, you may
  253.    get labels showing "FUTURE DATE" or some exorbitant number of
  254.    days.
  255.  
  256.    Try UDIR \ /t4p or UDIR \! /Dtp4  (This is the only way to sort
  257.    the directory names. It will also show which of your
  258.    subdirectories have been around the longest.
  259.  
  260.    /6 produces a listing somewhat like a typical directory listing. It
  261.    shows the fully qualified filename, size, date, time and attribute
  262.    bits set for each of the files specified.
  263.  
  264.    /7 produces a listing just of directories and subdirectories, with
  265.    the number of files and total bytes of each.
  266.  
  267. 6) /? gives you the help screen, which, incidentally, appears 
  268.    whenever you enter an invalid command line parameter.
  269.  
  270.  
  271.                            USING AN @FILE
  272.  
  273. Suppose you wanted to use UDIR several times in succession. Each time
  274. you wanted to use a different set of command line switches.
  275.  
  276. Of course, you could write a batch file that would accomplish this.
  277. However, there is an easier way.
  278.  
  279. Just use an ASCII text editor (or the COPY CON command) to create a
  280. file that is made up of separate lines, each of which would be a look-
  281. alike for a set of switches.
  282.  
  283. For example, here is a file, called PARMFILE
  284.  
  285. \! /D
  286. *.pas /ATt4
  287. \c /RAT5s
  288.  
  289. The first line creates a list of the subdirectories contained in the
  290. root directory.
  291.  
  292. The second line lists only the .PAS file in the current and child
  293. directories whose Archive bit is set. The list is sorted by time and
  294. is shown in format /4.
  295.  
  296. The third line would show the files in the \C subdirectory whose
  297. Archive Or Read-only attributes are set. The list would be sorted by
  298. size and shown in format /5 with totals.
  299.  
  300. Once you have created the file, you may use it as the ONLY command
  301. line parameter for UDIR.  The command, in this instance, would be
  302. UDIR @PARMFILE
  303.  
  304.                            I/O REDIRECTION
  305.  
  306. Since UDIR does not use any fast screen writing techniques, the
  307. lists may be sent to a disk file or the printer using the ordinary DOS
  308. I/O redirection commands: <, >, |
  309.  
  310. The only caution is that I/O redirection will not work in an @file.
  311.  
  312. You can use UDIR \! /D > DIRS at the DOS prompt. You can't use the
  313. same command in PARMFILE.  However, you could use the above PARMFILE
  314. and the command UDIR @PARMFILE > LISTS to send all of the output, for
  315. each of the three lines, to a file called LISTS. In the file each list
  316. will be separated by a blank line.
  317.  
  318.  
  319.                           TECHNICAL STUFF
  320.  
  321. The UDIR program does much of what a directory lister could do.
  322.  
  323. I wrote the program to satisfy my own curiosity about how the
  324. findfirst() and findnext() routines really work in Turbo Pascal and
  325. Turbo C. I also got tired of using several different directory listing
  326. programs to get the information I wanted.
  327.  
  328. WHAT information? Well, which files, on my hard disk, are new. What
  329. are the ages of files and directories on a disk.  What are the sizes
  330. of the files in bytes and in clusters?
  331.  
  332. I wrote a program to solve all the above problems. THEN I got carried
  333. away and wrote a program that may very well be a solution in search of
  334. a problem.
  335.  
  336. The algorithm used in the program is shown in the following diagram.
  337.  
  338.  
  339.                          ╓───────────╖
  340.                          ║ DIRECTORY ║
  341.                          ║  LISTER   ║
  342.                          ╙─────╥─────╜
  343.       ╓────────────╥───────────╨───╥──────────────────╖
  344.       ║            ║               ║                  ║
  345.  ╓────╨─────╖ ╓────╨──────╖ ╓──────╨──────╖ ╓─────────╨─────────╖
  346.  ║INITIALIZE║ ║BUILD A    ║ ║GET DIRECTORY║ ║FOR EACH DIRECTORY ║
  347.  ║VARIABLES ║ ║LINKED     ║ ║NAMES FROM   ║ ║1. ACCUMULATE      ║
  348.  ╙──────────╜ ║LIST OF    ║ ║LINKED LIST  ║ ║   FULLY QUAL'D    ║
  349.               ║DIRECTORIES║ ║             ║ ║   NAMES           ║
  350.               ╙───────────╜ ╙─────────────╜ ║2. SORT,IF DESIRED ║
  351.                                             ║3. FILTER USING A  ║
  352.                                             ║   MASK,IF DESIRED ║
  353.                                             ║4. PRINT, USING    ║
  354.                                             ║   CHOSEN FORMAT   ║
  355.                                             ╙───────────────────╜
  356.  
  357. The liberally commented source code is included for your perusal and
  358. learning.
  359.  
  360. The code is written with only a couple of instances of nested
  361. procedures. This might facilitate translating the program to C code.
  362.  
  363. The only "tricky" part is in the use of the line
  364.  
  365. readln(inf,string(ptr(prefixseg,$80)^));
  366.  
  367. in the "input_from_file" procedure. This line reads a line from an
  368. external file and jams it into the command line buffer. This lets me
  369. use the paramstr() procedure, in Pascal, to do any parsing of the
  370. command line. If you translate this program to C, you might want to
  371. use the strtok() function. I have Neil Rubenking to thank for the
  372. trick with prefixseg.
  373.  
  374.  
  375.                              DISCLAIMERS
  376.  
  377. The UDIR.EXE, UDIR.PAS and UDIR.DOC files are copyrighted by the
  378. FastAid Co. However, they are, hereby placed in the public domain.
  379.  
  380. There is no charge for their use or distribution. There is no support
  381. for any problems encountered (but to the best of my knowledge there
  382. are no glaring bugs.)
  383.  
  384. The copyright implies that, if you distribute the code, executable, or
  385. documentation file, in whole or in major part, you leave the copyright 
  386. notice attached.  If you use parts of the code in your own program, 
  387. then it becomes your code. You copyright it if you want to.
  388.  
  389. The UDIR files are submitted "as is" with no guarantee that they will
  390. do exactly what you want them to do. To the best of my knowledge, the
  391. program will cause no harm to any MS-DOS computer on which it is run.
  392.  
  393. However, since the source code is made available, I can't accept
  394. responsibility for what might happen if you modify and recompile the
  395. program and then run it.
  396.  
  397.                              UPDATE NOTES
  398.  
  399. The 1995 update of this useful program and source code were to (1) fix 
  400. a memory problem in the original that would cause a heap overflow if a 
  401. gigantic number of files were listed and (2) to allow the program to
  402. read directories created with long file names under Win95.  Long file
  403. names are NOT supported, but they no longer confuse the program.