using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace iWare_SCADA_BusinessLogical.Utils { /// /// /// /// /// 调用Win32API方法 FindFirstFile , FindNextFile, FindClose /// public class FileDirectoryEnumerator : System.Collections.IEnumerator { #region 属性 /// /// 当前对象文件 /// private object objCurrentObject = null; private bool bolIsEmpty = false; /// /// 是否找不到文件 /// public bool IsEmpty { get { return bolIsEmpty; } } private int intSearchedCount = 0; /// /// 找到的文件数 /// public int SearchedCount { get { return intSearchedCount; } } private bool bolIsFile = true; /// /// 是否为文件 /// public bool IsFile { get { return bolIsFile; } } private int intLastErrorCode = 0; /// /// 错误代码Win32 /// public int LastErrorCode { get { return intLastErrorCode; } } /// /// 文件名称 /// public string Name { get { if (this.objCurrentObject != null) { if (objCurrentObject is string) return (string)this.objCurrentObject; else return ((System.IO.FileSystemInfo)this.objCurrentObject).Name; } return null; } } /// /// 文件属性 /// public System.IO.FileAttributes Attributes { get { return (System.IO.FileAttributes)myData.dwFileAttributes; } } /// /// 文件创建时间 /// public System.DateTime CreationTime { get { //long time = ToLong(myData.ftCreationTime_dwHighDateTime, // myData.ftCreationTime_dwLowDateTime); //System.DateTime dtm = System.DateTime.FromFileTimeUtc(time); //return dtm.ToLocalTime(); return ToDateTime(myData.ftCreationTime); } } /// /// 文件最后访问时间 /// public System.DateTime LastAccessTime { get { //long time = ToLong(myData.ftLastAccessTime_dwHighDateTime, // myData.ftLastAccessTime_dwLowDateTime); //System.DateTime dtm = System.DateTime.FromFileTimeUtc(time); //return dtm.ToLocalTime(); return ToDateTime(myData.ftLastAccessTime); } } /// /// 文件最后写入时间 /// public System.DateTime LastWriteTime { get { //long time = ToLong(myData.ftLastWriteTime_dwHighDateTime, // myData.ftLastWriteTime_dwLowDateTime); //System.DateTime dtm = System.DateTime.FromFileTimeUtc(time); //return dtm.ToLocalTime(); return ToDateTime(myData.ftLastWriteTime); } } /// /// 文件大小 /// public long FileLength { get { if (this.bolIsFile) return ToLong(myData.nFileSizeHigh, myData.nFileSizeLow); else return 0; } } #endregion #region 查询属性 private bool bolThrowIOException = true; /// /// 是否抛出异常 /// public bool ThrowIOException { get { return this.bolThrowIOException; } set { this.bolThrowIOException = value; } } private bool bolReturnStringType = true; /// /// 返回类型 /// public bool ReturnStringType { get { return bolReturnStringType; } set { bolReturnStringType = value; } } private string strSearchPattern = "*"; /// /// 查询文件名 /// public string SearchPattern { get { return strSearchPattern; } set { strSearchPattern = value; } } private string strSearchPath = null; /// /// 查询路径 /// public string SearchPath { get { return strSearchPath; } set { strSearchPath = value; } } private bool bolSearchForFile = true; /// /// 查询文件 /// public bool SearchForFile { get { return bolSearchForFile; } set { bolSearchForFile = value; } } private bool bolSearchForDirectory = true; /// /// 查询文件夹 /// public bool SearchForDirectory { get { return bolSearchForDirectory; } set { bolSearchForDirectory = value; } } //private int? searchCreationTime_High; //private int? searchCreationTime_Low; private DateTime? searchCreationTime; /// /// 查询文件创建时间在设置时间之后的文件 /// public DateTime? SearchCreationTime { get { return searchCreationTime; } set { searchCreationTime = value; } } private DateTime? searchCreationEndTime; /// /// 查询文件创建时间在设置时间之前的文件 /// public DateTime? SearchCreationEndTime { get { return searchCreationEndTime; } set { searchCreationEndTime = value; } } private DateTime? searchModifyTime; /// /// 查询文件修改时间在设置时间之后的文件 /// public DateTime? SearchModifyTime { get { return searchModifyTime; } set { searchModifyTime = value; } } private DateTime? searchModifyEndTime; /// /// 查询文件修改时间在设置时间之前的文件 /// public DateTime? SearchModifyEndTime { get { return searchModifyEndTime; } set { searchModifyEndTime = value; } } #endregion /// /// 关闭文件 /// public void Close() { this.CloseHandler(); } #region IEnumerator /// /// 当前文件 /// public object Current { get { return objCurrentObject; } } /// /// 查询下一文件 /// /// 是否成功 public bool MoveNext() { bool success = false; while (true) { if (this.bolStartSearchFlag) success = this.SearchNext(); else success = this.StartSearch(); if (success) { var time = ToDateTime(myData.ftCreationTime); if (searchCreationTime.HasValue) if (time <= searchCreationTime.Value) continue; if (searchCreationEndTime.HasValue) if (time > searchCreationEndTime.Value) continue; time = ToDateTime(myData.ftLastWriteTime); if (searchModifyTime.HasValue) if (time <= searchModifyTime.Value) continue; if (searchModifyEndTime.HasValue) if (time > searchModifyEndTime.Value) continue; if (this.UpdateCurrentObject()) return true; } else { this.objCurrentObject = null; return false; } } } /// /// 重设 /// public void Reset() { if (this.strSearchPath == null) throw new System.ArgumentNullException("SearchPath can not null"); if (this.strSearchPattern == null || this.strSearchPattern.Length == 0) this.strSearchPattern = "*"; this.intSearchedCount = 0; this.objCurrentObject = null; this.CloseHandler(); this.bolStartSearchFlag = false; this.bolIsEmpty = false; this.intLastErrorCode = 0; } #endregion #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; //} [Serializable, System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Auto), System.Runtime.InteropServices.BestFitMapping(false)] public struct FILETIME { public int dwLowDateTime; public int dwHighDateTime; } //[Serializable, System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Auto), System.Runtime.InteropServices.BestFitMapping(false)] //public struct WIN32_FIND_DATA //{ // public int dwFileAttributes; // public FILETIME ftCreationTime; // public FILETIME ftLastAccessTime; // public FILETIME ftLastWriteTime; // public int nFileSizeHigh; // public int nFileSizeLow; // public int dwOID; // [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; //} [Serializable, System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Auto), System.Runtime.InteropServices.BestFitMapping(false)] public struct WIN32_FIND_DATA { public int dwFileAttributes; public FILETIME ftCreationTime; public FILETIME ftLastAccessTime; public FILETIME ftLastWriteTime; 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(IntPtr 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; } public static DateTime ToDateTime(FILETIME time) { return DateTime.FromFileTime(ToLong(time.dwHighDateTime, time.dwLowDateTime)); } 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); } private static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); /// /// 无效句柄 /// private System.IntPtr intSearchHandler = INVALID_HANDLE_VALUE; private WIN32_FIND_DATA myData = new WIN32_FIND_DATA(); /// /// 是否已经开始查询 /// private bool bolStartSearchFlag = false; /// /// 关闭 /// private void CloseHandler() { if (this.intSearchHandler != INVALID_HANDLE_VALUE) { FindClose(this.intSearchHandler); this.intSearchHandler = INVALID_HANDLE_VALUE; } } /// /// 开始查询 /// /// private bool StartSearch() { bolStartSearchFlag = true; bolIsEmpty = false; objCurrentObject = null; intLastErrorCode = 0; string strPath = System.IO.Path.Combine(strSearchPath, this.strSearchPattern); this.CloseHandler(); intSearchHandler = FindFirstFile(System.Runtime.InteropServices.Marshal.StringToHGlobalAuto(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; } /// /// 查询下一文件 /// /// private bool SearchNext() { if (bolStartSearchFlag == false) return false; if (bolIsEmpty) return false; if (intSearchHandler == INVALID_HANDLE_VALUE) return false; intLastErrorCode = 0; if (FindNextFile(intSearchHandler, ref myData) == false) { intLastErrorCode = System.Runtime.InteropServices.Marshal.GetLastWin32Error(); this.CloseHandler(); if (intLastErrorCode != 0 && intLastErrorCode != 0x12) { if (this.bolThrowIOException) WinIOError(intLastErrorCode, strSearchPath); else return false; } return false; } return true; } /// /// 更新当前文件信息 /// /// private bool UpdateCurrentObject() { if (intSearchHandler == INVALID_HANDLE_VALUE) return false; bool Result = false; this.objCurrentObject = null; if ((myData.dwFileAttributes & 0x10) == 0) { // this.bolIsFile = true; if (this.bolSearchForFile) Result = true; } else { // this.bolIsFile = false; if (this.bolSearchForDirectory) { if (myData.cFileName == "." || myData.cFileName == "..") Result = false; else Result = true; } } if (Result) { if (this.bolReturnStringType) this.objCurrentObject = myData.cFileName; else { string p = System.IO.Path.Combine(this.strSearchPath, myData.cFileName); if (this.bolIsFile) { this.objCurrentObject = new System.IO.FileInfo(p); } else { this.objCurrentObject = new System.IO.DirectoryInfo(p); } } this.intSearchedCount++; } return Result; } #endregion } }