lsd.c
来自「国外网站上的一些精典的C程序」· C语言 代码 · 共 209 行
C
209 行
/*** LSD - A simple directory lister** A public domain C demo program by Bob Stout*/ #include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include "dirport.h"#include "sniptype.h"char *sprintfc(char *, long);char *capitalize(const char *);int one_column(char *, char *, long, unsigned, DOSFileDate, DOSFileTime);int five_column(char *, char *); /*** DOS DIR improved work-alike w/ improved formatting & attribute display**** supports /W switch*/ main(int argc, char *argv[]){ int i, files = 0, dirs = 0, argptr = 0, errflag = False_, cols, drive; long siz_tot = 0L; char *p, *fname, *ext, name[13], buf[67], numbuf[12]; DOSFileData ff;#ifndef __ZTC__ struct diskfree_t df;#endif int (*display)() = one_column; strcpy(buf, fname = "*.*"); if(argc != 1) for (i = 1; i < argc; ++i) { if ('/' == argv[i][0]) { if ('W' == toupper(argv[i][1])) display = five_column; else { puts("\aUsage: LSD [/W] [file]"); errflag = True_; } } else if (!argptr) argptr = i; } if (argptr) { fname = argv[argptr]; strcpy(buf, fname); if ('\\' == LAST_CHAR(buf) || ':' == LAST_CHAR(buf)) strcat(buf, "*.*"); else { if (Success_ == FIND_FIRST(buf, _A_SUBDIR, &ff)) { if (ff_attr(&ff) & _A_SUBDIR && '.' != *ff_name(&ff)) { if ('\\' != LAST_CHAR(buf)) strcat(buf, "\\"); strcat(buf, "*.*"); } } else errflag = True_; } } if (':' == buf[1]) drive = toupper(*buf) - '@'; else drive = 0; if (!errflag && !(FIND_FIRST(buf, _A_ANY, &ff))) do { siz_tot += ff_size(&ff); if (ff_attr(&ff) & _A_SUBDIR) ++dirs; else ++files; strcpy(name, ff_name(&ff)); if (NULL != (p = strchr(name, '.')) && p != name) { *p = '\0'; ext = ++p; } else ext = ""; cols = (*display)(name, ext, ff_size(&ff), ff_attr(&ff), ff_date(&ff), ff_time(&ff)); } while (Success_ == FIND_NEXT(&ff)); else { fprintf(stderr, "Cannot do directory on '%s'\n", fname); exit(-1); } FIND_END(&ff); if (cols) fputc('\n', stdout); sprintfc(numbuf,siz_tot); printf("\n%3d Files totalling %s bytes\n", files, numbuf); printf("%3d Director%s\n", dirs, (1 == dirs) ? "y" : "ies");#ifndef __ZTC__ _dos_getdiskfree(drive, &df); sprintfc(numbuf, (long)df.avail_clusters * df.sectors_per_cluster * df.bytes_per_sector);#else /* if ZTC */ sprintfc(numbuf, dos_getdiskfreespace(drive));#endif printf("%s bytes free\n", numbuf); return 0;} /*** The single column directory entry display function*/ int one_column(char *name, char *ext, long size, unsigned attribs, DOSFileDate date, DOSFileTime time){ register int i, mask; static char *atr = "RHSVDA", szbuf[12]; sprintfc(szbuf, size); printf("%-8s %-3s %12s ", capitalize(name), capitalize(ext), szbuf); for (i = 0, mask = 1; i < 6; ++i, mask <<= 1) fputc((attribs & mask) ? atr[i] : '.', stdout); printf("%4d-%02d-%02d%4d:%02d:%02d\n", date.month, date.day, (date.year + 80) % 100, time.hours, time.mins, time.tsecs * 2); return 0;} /*** The five column directory entry display function*/ int five_column(char *name, char *ext){ static int cols = 0; printf("%-8s %-3s%s", capitalize(name), capitalize(ext), (5 > ++cols) ? " " : ""); if (0 == (cols %= 5)) putchar('\n'); return (cols);} /*** Display a long int using commas as thousands separators*/ char *sprintfc(char *string, long num){ if (num > 999999L) { sprintf(string, "%d,%03d,%03d", (int)(num / 1000000L), (int)((num % 1000000L) / 1000L), (int)(num % 1000L)); } else { if (num > 999L) { sprintf(string, "%d,%03d", (int)(num / 1000L), (int)(num % 1000L)); } else sprintf(string, "%d", (int)num); } return string;} /*** Capitalize a name or extension in place*/ char *capitalize(const char *string){ int flag = 0; char *ptr = (char *)string; do { if (isalpha(*ptr)) { if (flag) *ptr = (char)tolower(*ptr); else { flag = 1; *ptr = (char)toupper(*ptr); } } else flag = 0; } while (*++ptr); return (char *)string;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?