|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.