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
}
}