From a88289500caa5736e845280435d762d8adb9fc40 Mon Sep 17 00:00:00 2001 From: Jason Edmeades Date: Mon, 29 Apr 2002 23:33:09 +0000 Subject: [PATCH] - Support for dir /w and /b flags - Fixed a couple of unclosed FindFirst/FindNext pairs --- programs/wcmd/builtins.c | 2 + programs/wcmd/directory.c | 206 ++++++++++++++++++++++++++++++-------- 2 files changed, 164 insertions(+), 44 deletions(-) diff --git a/programs/wcmd/builtins.c b/programs/wcmd/builtins.c index 6559139c2b7..00abdfd8d38 100644 --- a/programs/wcmd/builtins.c +++ b/programs/wcmd/builtins.c @@ -172,6 +172,7 @@ char *p; if ((strchr(param1,'*') == NULL) && (strchr(param1,'?') == NULL) && (!recurse) && (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { strcat (param1, "\\*"); + FindClose(hff); WCMD_delete (1); return; } @@ -192,6 +193,7 @@ char *p; } else { if (!DeleteFile (param1)) WCMD_print_error (); + FindClose (hff); } } diff --git a/programs/wcmd/directory.c b/programs/wcmd/directory.c index 9da2cc87ba9..317df7bc846 100644 --- a/programs/wcmd/directory.c +++ b/programs/wcmd/directory.c @@ -41,7 +41,8 @@ extern int echo_mode; extern char quals[MAX_PATH], param1[MAX_PATH], param2[MAX_PATH]; extern DWORD errorlevel; -int file_total, dir_total, line_count, page_mode, recurse; +int file_total, dir_total, line_count, page_mode, recurse, wide, bare, + max_width; __int64 byte_total; /***************************************************************************** @@ -56,12 +57,26 @@ void WCMD_directory () { char path[MAX_PATH], drive[8]; int status; ULARGE_INTEGER avail, total, free; +CONSOLE_SCREEN_BUFFER_INFO consoleInfo; line_count = 5; byte_total = 0; file_total = dir_total = 0; + + /* Handle args */ page_mode = (strstr(quals, "/P") != NULL); recurse = (strstr(quals, "/S") != NULL); + wide = (strstr(quals, "/W") != NULL); + bare = (strstr(quals, "/B") != NULL); + + /* Handle conflicting args and initialization */ + if (bare) wide = FALSE; + + if (wide) { + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &consoleInfo); + max_width = consoleInfo.dwSize.X; + } + if (param1[0] == '\0') strcpy (param1, "."); status = GetFullPathName (param1, sizeof(path), path, NULL); if (!status) { @@ -69,17 +84,27 @@ ULARGE_INTEGER avail, total, free; return; } lstrcpyn (drive, path, 3); - status = WCMD_volume (0, drive); - if (!status) { - return; + + if (!bare) { + status = WCMD_volume (0, drive); + if (!status) { + return; + } } + WCMD_list_directory (path, 0); lstrcpyn (drive, path, 4); GetDiskFreeSpaceEx (drive, &avail, &total, &free); - WCMD_output (" %18s bytes free\n\n", WCMD_filesize64 (free.QuadPart)); - if (recurse) { - WCMD_output ("Total files listed:\n%8d files%25s bytes\n%8d directories\n\n", - file_total, WCMD_filesize64 (byte_total), dir_total); + + if (!bare) { + if (recurse) { + WCMD_output ("\n\n Total files listed:\n%8d files%25s bytes\n", + file_total, WCMD_filesize64 (byte_total)); + WCMD_output ("%8d directories %18s bytes free\n\n", + dir_total, WCMD_filesize64 (free.QuadPart)); + } else { + WCMD_output (" %18s bytes free\n\n", WCMD_filesize64 (free.QuadPart)); + } } } @@ -100,18 +125,22 @@ void WCMD_list_directory (char *search_path, int level) { char string[1024], datestring[32], timestring[32]; char mem_err[] = "Memory Allocation Error"; char *p; +char real_path[MAX_PATH]; DWORD count; WIN32_FIND_DATA *fd; FILETIME ft; SYSTEMTIME st; HANDLE hff; -int status, dir_count, file_count, entry_count, i; +int status, dir_count, file_count, entry_count, i, widest, linesout, cur_width, tmp_width; ULARGE_INTEGER byte_count, file_size; dir_count = 0; file_count = 0; entry_count = 0; byte_count.QuadPart = 0; + widest = 0; + linesout = 0; + cur_width = 0; /* * If the path supplied does not include a wildcard, and the endpoint of the @@ -131,6 +160,12 @@ ULARGE_INTEGER byte_count, file_size; } } + /* Work out the actual current directory name */ + p = strrchr (search_path, '\\'); + memset(real_path, 0x00, sizeof(real_path)); + lstrcpyn (real_path, search_path, (p-search_path+2)); + + /* Load all files into an in memory structure */ fd = malloc (sizeof(WIN32_FIND_DATA)); hff = FindFirstFile (search_path, fd); if (hff == INVALID_HANDLE_VALUE) { @@ -141,6 +176,14 @@ ULARGE_INTEGER byte_count, file_size; } do { entry_count++; + + /* Keep running track of longest filename for wide output */ + if (wide) { + int tmpLen = strlen((fd+(entry_count-1))->cFileName) + 3; + if ((fd+(entry_count-1))->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) tmpLen = tmpLen + 2; + if (tmpLen > widest) widest = tmpLen; + } + fd = realloc (fd, (entry_count+1)*sizeof(WIN32_FIND_DATA)); if (fd == NULL) { FindClose (hff); @@ -149,17 +192,24 @@ ULARGE_INTEGER byte_count, file_size; } } while (FindNextFile(hff, (fd+entry_count)) != 0); FindClose (hff); + + /* Sort the list of files */ qsort (fd, entry_count, sizeof(WIN32_FIND_DATA), WCMD_dir_sort); - if (level != 0) WCMD_output ("\n\n"); - WCMD_output ("Directory of %s\n\n", search_path); - if (page_mode) { - line_count += 2; - if (line_count > 23) { - line_count = 0; - WCMD_output (anykey); - ReadFile (GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string), &count, NULL); - } + + /* Output the results */ + if (!bare) { + if (level != 0) WCMD_output ("\n\n"); + WCMD_output ("Directory of %s\n\n", real_path); + if (page_mode) { + line_count += 2; + if (line_count > 23) { + line_count = 0; + WCMD_output (anykey); + ReadFile (GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string), &count, NULL); + } + } } + for (i=0; iftLastWriteTime, &ft); FileTimeToSystemTime (&ft, &st); @@ -167,10 +217,53 @@ ULARGE_INTEGER byte_count, file_size; sizeof(datestring)); GetTimeFormat (0, TIME_NOSECONDS, &st, NULL, timestring, sizeof(timestring)); - if ((fd+i)->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + + if (wide) { + + tmp_width = cur_width; + if ((fd+i)->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + WCMD_output ("["); + WCMD_output ("%s", (fd+i)->cFileName); + WCMD_output ("]"); + dir_count++; + tmp_width = tmp_width + strlen((fd+i)->cFileName) + 2; + } else { + WCMD_output ("%s", (fd+i)->cFileName); + tmp_width = tmp_width + strlen((fd+i)->cFileName) ; + file_count++; +#ifndef NONAMELESSSTRUCT + file_size.LowPart = (fd+i)->nFileSizeLow; + file_size.HighPart = (fd+i)->nFileSizeHigh; +#else + file_size.s.LowPart = (fd+i)->nFileSizeLow; + file_size.s.HighPart = (fd+i)->nFileSizeHigh; +#endif + byte_count.QuadPart += file_size.QuadPart; + } + cur_width = cur_width + widest; + + if ((cur_width + widest) > max_width) { + WCMD_output ("\n"); + cur_width = 0; + linesout++; + } else { + WCMD_output ("%*.s", (tmp_width - cur_width) ,""); + } + + } else if ((fd+i)->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { dir_count++; - WCMD_output ("%8s %8s %s\n", - datestring, timestring, (fd+i)->cFileName); + + if (!bare) { + WCMD_output ("%8s %8s %s\n", + datestring, timestring, (fd+i)->cFileName); + linesout++; + } else { + if (!((strcmp((fd+i)->cFileName, ".") == 0) || + (strcmp((fd+i)->cFileName, "..") == 0))) { + WCMD_output ("%s%s\n", recurse?real_path:"", (fd+i)->cFileName); + linesout++; + } + } } else { file_count++; @@ -182,42 +275,67 @@ ULARGE_INTEGER byte_count, file_size; file_size.s.HighPart = (fd+i)->nFileSizeHigh; #endif byte_count.QuadPart += file_size.QuadPart; - WCMD_output ("%8s %8s %10s %s\n", - datestring, timestring, - WCMD_filesize64(file_size.QuadPart), (fd+i)->cFileName); + if (!bare) { + WCMD_output ("%8s %8s %10s %s\n", + datestring, timestring, + WCMD_filesize64(file_size.QuadPart), (fd+i)->cFileName); + linesout++; + } else { + WCMD_output ("%s%s\n", recurse?real_path:"", (fd+i)->cFileName); + linesout++; + } } if (page_mode) { - if (++line_count > 23) { + line_count = line_count + linesout; + linesout = 0; + if (line_count > 23) { line_count = 0; WCMD_output (anykey); ReadFile (GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string), &count, NULL); } } } - if (file_count == 1) { - WCMD_output (" 1 file %25s bytes\n", WCMD_filesize64 (byte_count.QuadPart)); + + if (wide && cur_width>0) { + WCMD_output ("\n"); + if (page_mode) { + if (++line_count > 23) { + line_count = 0; + WCMD_output (anykey); + ReadFile (GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string), &count, NULL); + } + } } - else { - WCMD_output ("%8d files %24s bytes\n", file_count, WCMD_filesize64 (byte_count.QuadPart)); - } - if (page_mode) { - if (++line_count > 23) { - line_count = 0; - WCMD_output (anykey); - ReadFile (GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string), &count, NULL); - } + + if (!bare) { + if (file_count == 1) { + WCMD_output (" 1 file %25s bytes\n", WCMD_filesize64 (byte_count.QuadPart)); + } + else { + WCMD_output ("%8d files %24s bytes\n", file_count, WCMD_filesize64 (byte_count.QuadPart)); + } + if (page_mode) { + if (++line_count > 23) { + line_count = 0; + WCMD_output (anykey); + ReadFile (GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string), &count, NULL); + } + } } byte_total = byte_total + byte_count.QuadPart; file_total = file_total + file_count; dir_total = dir_total + dir_count; - if (dir_count == 1) WCMD_output ("1 directory "); - else WCMD_output ("%8d directories", dir_count); - if (page_mode) { - if (++line_count > 23) { - line_count = 0; - WCMD_output (anykey); - ReadFile (GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string), &count, NULL); - } + + if (!bare) { + if (dir_count == 1) WCMD_output ("1 directory "); + else WCMD_output ("%8d directories", dir_count); + if (page_mode) { + if (++line_count > 23) { + line_count = 0; + WCMD_output (anykey); + ReadFile (GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string), &count, NULL); + } + } } for (i=0; i