科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道C#使用WIN32API来遍历文件和目录 4

C#使用WIN32API来遍历文件和目录 4

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

#region 声明WIN32API函数以及结构 ************************************** [Serializable, System

作者:中国IT实验室 来源:中国IT实验室 2007年9月10日

关键字: 使用 C# 编程

  • 评论
  • 分享微博
  • 分享邮件
  

  #region 声明WIN32API函数以及结构 **************************************
  
   [Serializable,
   System.Runtime.InteropServices.StructLayout
   (System.Runtime.InteropServices.LayoutKind.Sequential,
   CharSet = System.Runtime.InteropServices.CharSet.Auto
   ),
   System.Runtime.InteropServices.BestFitMapping(false)]
   private struct WIN32_FIND_DATA
   {
   public int dwFileAttributes;
   public int ftCreationTime_dwLowDateTime;
   public int ftCreationTime_dwHighDateTime;
   public int ftLastAccessTime_dwLowDateTime;
   public int ftLastAccessTime_dwHighDateTime;
   public int ftLastWriteTime_dwLowDateTime;
   public int ftLastWriteTime_dwHighDateTime;
   public int nFileSizeHigh;
   public int nFileSizeLow;
   public int dwReserved0;
   public int dwReserved1;
   [System.Runtime.InteropServices.MarshalAs
   (System.Runtime.InteropServices.UnmanagedType.ByValTStr,
   SizeConst = 260)]
   public string cFileName;
   [System.Runtime.InteropServices.MarshalAs
   (System.Runtime.InteropServices.UnmanagedType.ByValTStr,
   SizeConst = 14)]
   public string cAlternateFileName;
   }
  
   [System.Runtime.InteropServices.DllImport
   ("kernel32.dll",
   CharSet = System.Runtime.InteropServices.CharSet.Auto,
   SetLastError = true)]
   private static extern IntPtr FindFirstFile(string pFileName, ref WIN32_FIND_DATA pFindFileData);
  
   [System.Runtime.InteropServices.DllImport
   ("kernel32.dll",
   CharSet = System.Runtime.InteropServices.CharSet.Auto,
   SetLastError = true)]
   private static extern bool FindNextFile(IntPtr hndFindFile, ref WIN32_FIND_DATA lpFindFileData);
  
   [System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
   private static extern bool FindClose(IntPtr hndFindFile);
  
   private static long ToLong( int height , int low)
   {
   long v = ( uint ) height ;
   v = v << 0x20;
   v = v | ( ( uint )low );
   return v;
   }
  
   private static void WinIOError(int errorCode, string str)
   {
   switch (errorCode)
   {
   case 80:
   throw new System.IO.IOException("IO_FileExists :" + str);
   case 0x57:
   throw new System.IO.IOException("IOError:" + MakeHRFromErrorCode(errorCode));
   case 0xce:
   throw new System.IO.PathTooLongException("PathTooLong:" + str );
   case 2:
   throw new System.IO.FileNotFoundException("FileNotFound:" + str);
   case 3:
   throw new System.IO.DirectoryNotFoundException("PathNotFound:" + str);
   case 5:
   throw new UnauthorizedAccessException("UnauthorizedAccess:" + str);
   case 0x20:
   throw new System.IO.IOException("IO_SharingViolation:" + str);
   }
   throw new System.IO.IOException("IOError:" + MakeHRFromErrorCode(errorCode));
   }
  
   private static int MakeHRFromErrorCode(int errorCode)
   {
   return (-2147024896 | errorCode);
   }
  
   #endregion
  
   #region 内部代码群 ****************************************************
  
   private static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
   /// <summary>
   /// 查找处理的底层句柄
   /// </summary>
   private System.IntPtr intSearchHandler = INVALID_HANDLE_VALUE;
  
   private WIN32_FIND_DATA myData = new WIN32_FIND_DATA();
   /// <summary>
   /// 开始搜索标志
   /// </summary>
   private bool bolStartSearchFlag = false;
   /// <summary>
   /// 关闭内部句柄
   /// </summary>
   private void CloseHandler()
   {
   if (this.intSearchHandler != INVALID_HANDLE_VALUE)
   {
   FindClose(this.intSearchHandler);
   this.intSearchHandler = INVALID_HANDLE_VALUE;
   }
   }
   /// <summary>
   /// 开始搜索
   /// </summary>
   /// <returns>操作是否成功</returns>
   private bool StartSearch()
   {
   bolStartSearchFlag = true;
   bolIsEmpty = false;
   objCurrentObject = null;
   intLastErrorCode = 0;
  
   string strPath = System.IO.Path.Combine(strSearchPath, this.strSearchPattern);
   this.CloseHandler();
   intSearchHandler = FindFirstFile(strPath, ref myData);
   if (intSearchHandler == INVALID_HANDLE_VALUE)
   {
   intLastErrorCode = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
   if (intLastErrorCode == 2)
   {
   bolIsEmpty = true;
   return false;
   }
   if( this.bolThrowIOException )
   WinIOError( intLastErrorCode , strSearchPath);
   else
   return false;
   }
   return true;
   } 
 

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章