CppFiles.cpp
上传用户:sz0451
上传日期:2022-07-29
资源大小:256k
文件大小:5k
源码类别:

.net编程

开发平台:

Visual C++

  1. // This is the main project file for VC++ application project 
  2. // generated using an Application Wizard.
  3. #include "stdafx.h"
  4. #using <mscorlib.dll>
  5. using namespace System;
  6. using namespace System::IO;
  7. // This is the entry point for this application
  8. #ifdef _UNICODE
  9. int wmain(void)
  10. #else
  11. int main(int argc, char* argv[])
  12. #endif
  13. {
  14.     // Check for required arguments
  15.     if (argc < 2)
  16.     {
  17.         Console::WriteLine(S"Usage: CppFiles [options] [path]");
  18.         return 0;
  19.     }
  20.     String* options = 0;
  21.     String* path = 0;
  22.     bool bGotOptions = false;
  23.     // Split out the arguments
  24.     if (argc == 3)
  25.     {
  26.         bGotOptions = true;
  27.         options = new String(argv[1]);
  28.         path = new String(argv[2]);
  29.     }
  30.     else if (argc == 2) 
  31.         path = new String(argv[1]);
  32.     bool bSize = false;
  33.     bool bDate = false;
  34.     bool bAtts = false;
  35.     // If we have options, check them. The default is to list the name only
  36.     // Possible options are:
  37.     //   v      verbose listing, gives name, size & access time
  38.     //   s      list size
  39.     //   d      list last access date
  40.     //   a      list attributes
  41.     if (bGotOptions)
  42.     {
  43.         options = options->ToLower();
  44.         if (options->IndexOf('v') != -1) 
  45.         {
  46.             bSize = true;
  47.             bDate = true;
  48.             bAtts = true;
  49.         }
  50.         else 
  51.         {
  52.             if (options->IndexOf('s') != -1) bSize = true;
  53.             if (options->IndexOf('d') != -1) bDate = true;
  54.             if (options->IndexOf('a') != -1) bAtts = true;
  55.         }
  56.     }
  57.     bool bItsAFile = false;
  58.     bool bItsADirectory = false;
  59.     FileInfo* fi = new FileInfo(path);
  60.     DirectoryInfo* di = new DirectoryInfo(path);
  61.     if (fi->Exists)
  62.         bItsAFile = true;
  63.     else if (di->Exists)
  64.         bItsADirectory = true;
  65.     if (!bItsAFile && !bItsADirectory)
  66.     {
  67.         Console::WriteLine(S"No such file or directory");
  68.         return(-1);
  69.     }
  70.     if (bItsAFile)
  71.     {
  72.         Console::Write(fi->Name);
  73.         if (bSize) Console::Write("  {0}", __box(fi->Length));
  74.         if (bDate) Console::Write("  {0}", 
  75.             File::GetLastAccessTime(fi->ToString()).ToString());
  76.         if (bAtts) 
  77.         {
  78.             FileAttributes fa = File::GetAttributes(fi->ToString());
  79.             Console::Write("  ");
  80.             if (fa & FileAttributes::Normal)
  81.                 Console::Write("<normal>");
  82.             else
  83.             {
  84.                 if (fa & FileAttributes::Archive) Console::Write("a");
  85.                 if (fa & FileAttributes::Hidden) Console::Write("h");
  86.                 if (fa & FileAttributes::System) Console::Write("s");
  87.                 if (fa & FileAttributes::ReadOnly) Console::Write("r");
  88.             }
  89.         }
  90.         Console::WriteLine();
  91.     }
  92.     else if (bItsADirectory)
  93.     {
  94.         // List the directory contents - subdirs first, then files
  95.         String* dirs[] = Directory::GetDirectories(di->ToString());
  96.         for(int i=0; i<dirs->Count; i++)
  97.         {
  98.             DirectoryInfo* sdi = 
  99.                 new DirectoryInfo(dirs->get_Item(i)->ToString());
  100.             // Directories list in upper case
  101.             String* dirName = sdi->Name->ToUpper();
  102.             Console::Write("{0,30}",dirName);
  103.             // no size, so put a few blanks
  104.             String* ss = S"--";
  105.             Console::Write("{0,12}",ss);
  106.             // last mod date is OK
  107.             if (bDate) Console::Write("  {0}", 
  108.                 Directory::GetLastAccessTime(sdi->ToString()).ToString());
  109.             // no attributes, either
  110.             // finish the line
  111.             Console::WriteLine();
  112.         }
  113.         // Now do the files
  114.         String* files[] = Directory::GetFiles(di->ToString());
  115.         for(i=0; i<files->Count; i++)
  116.         {
  117.             FileInfo* fci = new FileInfo(files->get_Item(i)->ToString());
  118.             // Files list in lower case
  119.             String* fileName = fci->Name->ToLower();
  120.             Console::Write("{0,30}",fileName);
  121.             if (bSize) Console::Write("{0,12}", __box(fci->Length));
  122.             if (bDate) Console::Write("  {0}", 
  123.                 File::GetLastAccessTime(fci->ToString()).ToString());
  124.             // Attributes
  125.             if (bAtts) 
  126.             {
  127.                 FileAttributes fa = File::GetAttributes(fci->ToString());
  128.                 Console::Write("  ");
  129.                 if (fa & FileAttributes::Normal)
  130.                     Console::Write("<normal>");
  131.                 else
  132.                 {
  133.                     if (fa & FileAttributes::Archive) Console::Write("a");
  134.                     if (fa & FileAttributes::Hidden) Console::Write("h");
  135.                     if (fa & FileAttributes::System) Console::Write("s");
  136.                     if (fa & FileAttributes::ReadOnly) Console::Write("r");
  137.                 }
  138.             }
  139.             // finish the line
  140.             Console::WriteLine();
  141.         }
  142.     }
  143.     return 0;
  144. }