home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / os2sdk / os2sdk10 / apps / filelist / filelist.c next >
Encoding:
C/C++ Source or Header  |  1988-08-11  |  4.9 KB  |  201 lines

  1. /*
  2.  * This example illustrates the use of DOSFINDFIRST, DOSFINDNEXT, and
  3.  * DOSFINDCLOSE.  The program lists the contents of a directory.
  4.  * the parameter format is: FILELIST [-1al] names...
  5.  */
  6.  
  7. #include <malloc.h>
  8. #include <stdio.h>
  9. #include <time.h>
  10. #include <doscalls.h>
  11. #include <subcalls.h>
  12.  
  13. #define    TRUE    0
  14. #define    FALSE    1
  15.  
  16. /* error codes */
  17.  
  18. #define ERROR_NO_MORE_FILES    18
  19.  
  20. /* file attribute constants */
  21.  
  22. #define    ATTR_READONLY    0x001    /* read only file */
  23. #define    ATTR_HIDDEN    0x002    /* hidden file */
  24. #define    ATTR_SYSTEM    0x004    /* system file */
  25. #define    ATTR_DIRECTORY    0x010    /* subdirectory entry */
  26. #define    ATTR_ARCHIVE    0x020    /* archive bit */
  27.  
  28. /* type of list */
  29.  
  30. #define    NAME_MULTICOLM    0    /* list name only in multipule columns */
  31. #define    NAME_SINGCOLM    1    /* list name only in a single column */
  32. #define    LONG_LIST    2    /* list all data on file */
  33. #define    TOTALCOLMS    4    /* number of colms when listing name only */
  34.  
  35. #define    RESULTBUFLEN    sizeof(struct FileFindBuf)    /* size of ResultBuf */
  36.  
  37. #define    SEARCHALL    "*.*"    /* default - search for everything */
  38. #define    MAXPATHSIZE    128
  39. #define    FILEPATHSIZE    MAXPATHSIZE + sizeof(SEARCHALL) + 1
  40.  
  41. main(argc, argv)
  42.     int    argc;
  43.     char    *argv[];
  44. {
  45.     unsigned    DirHandle = -1;    /* use any available directory handle */
  46.     unsigned    SearchCount;    /* number of files to search for */
  47.     unsigned     Attribute = ATTR_DIRECTORY;     /* default attribute */
  48.     unsigned    rc;                /* return code */
  49.     unsigned    listType = NAME_MULTICOLM;     /* default output */
  50.     char         FilePath[FILEPATHSIZE];
  51.     char        *s;
  52.     struct FileFindBuf *ResultBuf;       /* pointer to returned data */
  53.  
  54.     /* parse command line for switches */
  55.  
  56.     while ((--argc > 0) && (**++argv == '-')) {
  57.         for (s = argv[0]+1; *s != '\0'; s++)
  58.  
  59.         switch(*s) {
  60.  
  61.         case 'a': Attribute |= (ATTR_HIDDEN | ATTR_SYSTEM);
  62.               break;
  63.  
  64.         case 'l': listType = LONG_LIST;
  65.               Attribute |= (ATTR_HIDDEN | ATTR_SYSTEM);
  66.               break;
  67.     
  68.         case '1': listType = NAME_SINGCOLM;
  69.               break;
  70.  
  71.         default: printf("usage: filelist [ -1al ] name...\n");
  72.              DOSEXIT(1, 0);
  73.         }
  74.     }
  75.  
  76.     /* allocate buffer for file data returned from find calls */
  77.  
  78.     if ((ResultBuf =
  79.         (struct FileFindBuf *) malloc(RESULTBUFLEN)) == NULL) {
  80.  
  81.         printf("error, not enough memory\n");
  82.         DOSEXIT(1, 0);
  83.     }
  84.  
  85.     do {
  86.  
  87.         if (argc > 0) {
  88.         if (strlen(*argv) > MAXPATHSIZE) {
  89.             printf("error, path too large\n");
  90.             DOSEXIT(1, 1);
  91.         }
  92.         else {
  93.             /* if path ends with a \, append "*.*" */
  94.  
  95.             strcpy(FilePath, *argv);
  96.             if (FilePath[strlen(*argv) - 1] == '\\')
  97.                 strcat(FilePath, SEARCHALL);
  98.         }
  99.         }
  100.         else
  101.         strcpy(FilePath, SEARCHALL);    /* search using "*.*" */
  102.  
  103.         SearchCount = 1;        /* search for one at a time */
  104.  
  105.         /* search for first occurance of file search pattern */
  106.  
  107.         if (rc = DOSFINDFIRST( (char far *) FilePath,
  108.                    (unsigned far *) &DirHandle,
  109.                    Attribute,
  110.                      ResultBuf,    /* ptr to returned data */
  111.                    RESULTBUFLEN,
  112.                    (unsigned far *) &SearchCount,
  113.                     0L )) {
  114.  
  115.         if (rc != ERROR_NO_MORE_FILES) {
  116.             printf("\nFindFirst failed, error %d\n", rc);
  117.             DOSEXIT(1, 1);
  118.         }
  119.  
  120.         } else {
  121.  
  122.         printDirEntry( ResultBuf, listType );    /* print file data */
  123.  
  124.         do {
  125.  
  126.             /* search for next occurance of search pattern */
  127.  
  128.             if (rc = DOSFINDNEXT( DirHandle,
  129.                           ResultBuf,
  130.                           RESULTBUFLEN,
  131.                           (unsigned far *) &SearchCount )) {
  132.  
  133.                 if (rc != ERROR_NO_MORE_FILES)  {
  134.                 printf("DosFindNext failed, error: %d\n", rc);
  135.                 DOSEXIT(1, 1);
  136.                 }
  137.             }
  138.             else
  139.             /* print file data */
  140.  
  141.                 printDirEntry( ResultBuf, listType );
  142.         
  143.             } while (SearchCount > 0);    /* when 0, no more files */
  144.         }
  145.  
  146.         DOSFINDCLOSE( DirHandle );        /* free directory handle */
  147.  
  148.         if (argc > 1)    /* if any more arguments */
  149.         argv++;        /* point to next one */
  150.  
  151.     } while (--argc > 0);            /* for all filenames */
  152. }
  153.     
  154.  
  155. /*
  156.  * This routine prints the data on the file found.
  157.  */
  158.  
  159. printDirEntry(dirEntry, ltype)
  160.     struct FileFindBuf *dirEntry;
  161.     unsigned        ltype;
  162. {
  163.     static int    colm = 0;
  164.     char        attStr[6];
  165.     long        dateTime;
  166.  
  167.  
  168.     if (ltype == NAME_SINGCOLM)
  169.         printf("%s\n", dirEntry->file_name);
  170.  
  171.     else if (ltype == NAME_MULTICOLM) {
  172.  
  173.         printf("%-15s", dirEntry->file_name);
  174.  
  175.         if (++colm == TOTALCOLMS) {
  176.         printf("\n");
  177.         colm = 0;
  178.         }
  179.     }
  180.     else {
  181.  
  182.        /* build attribute string */
  183.  
  184.        strcpy(attStr, "-----");
  185.        if (dirEntry->attributes & ATTR_DIRECTORY)
  186.         attStr[0] = 'd';
  187.        if (dirEntry->attributes * ATTR_ARCHIVE)
  188.         attStr[1] = 'a';
  189.        if (dirEntry->attributes & ATTR_SYSTEM)
  190.         attStr[2] = 's';
  191.        if (dirEntry->attributes & ATTR_HIDDEN)
  192.         attStr[3] = 'h';
  193.        if (dirEntry->attributes & ATTR_READONLY)
  194.         attStr[4] = 'r';
  195.  
  196.        printf("%-7s", attStr);            /* print attribute */
  197.        printf("%7lu", dirEntry->file_size);        /* print file size */
  198.        printf("  %s\n", dirEntry->file_name);/* print filename */
  199.     }
  200. }
  201.