using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
|
namespace iWare_SCADA_BusinessLogical.Utils
|
{
|
/// <summary>
|
///
|
/// </summary>
|
/// <remarks>
|
/// 调用Win32API方法 FindFirstFile , FindNextFile, FindClose
|
/// </remarks>
|
public class FileDirectoryEnumerator : System.Collections.IEnumerator
|
{
|
#region 属性
|
/// <summary>
|
/// 当前对象文件
|
/// </summary>
|
private object objCurrentObject = null;
|
private bool bolIsEmpty = false;
|
/// <summary>
|
/// 是否找不到文件
|
/// </summary>
|
public bool IsEmpty
|
{
|
get { return bolIsEmpty; }
|
}
|
private int intSearchedCount = 0;
|
/// <summary>
|
/// 找到的文件数
|
/// </summary>
|
public int SearchedCount
|
{
|
get { return intSearchedCount; }
|
}
|
private bool bolIsFile = true;
|
/// <summary>
|
/// 是否为文件
|
/// </summary>
|
public bool IsFile
|
{
|
get { return bolIsFile; }
|
}
|
private int intLastErrorCode = 0;
|
/// <summary>
|
/// 错误代码Win32
|
/// </summary>
|
public int LastErrorCode
|
{
|
get { return intLastErrorCode; }
|
}
|
/// <summary>
|
/// 文件名称
|
/// </summary>
|
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;
|
}
|
}
|
/// <summary>
|
/// 文件属性
|
/// </summary>
|
public System.IO.FileAttributes Attributes
|
{
|
get { return (System.IO.FileAttributes)myData.dwFileAttributes; }
|
}
|
/// <summary>
|
/// 文件创建时间
|
/// </summary>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 文件最后访问时间
|
/// </summary>
|
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);
|
}
|
}
|
/// <summary>
|
/// 文件最后写入时间
|
/// </summary>
|
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);
|
}
|
}
|
/// <summary>
|
/// 文件大小
|
/// </summary>
|
public long FileLength
|
{
|
get
|
{
|
if (this.bolIsFile)
|
return ToLong(myData.nFileSizeHigh, myData.nFileSizeLow);
|
else
|
return 0;
|
}
|
}
|
#endregion
|
#region 查询属性
|
private bool bolThrowIOException = true;
|
/// <summary>
|
/// 是否抛出异常
|
/// </summary>
|
public bool ThrowIOException
|
{
|
get { return this.bolThrowIOException; }
|
set { this.bolThrowIOException = value; }
|
}
|
private bool bolReturnStringType = true;
|
/// <summary>
|
/// 返回类型
|
/// </summary>
|
public bool ReturnStringType
|
{
|
get { return bolReturnStringType; }
|
set { bolReturnStringType = value; }
|
}
|
private string strSearchPattern = "*";
|
/// <summary>
|
/// 查询文件名
|
/// </summary>
|
public string SearchPattern
|
{
|
get { return strSearchPattern; }
|
set { strSearchPattern = value; }
|
}
|
private string strSearchPath = null;
|
/// <summary>
|
/// 查询路径
|
/// </summary>
|
public string SearchPath
|
{
|
get { return strSearchPath; }
|
set { strSearchPath = value; }
|
}
|
private bool bolSearchForFile = true;
|
/// <summary>
|
/// 查询文件
|
/// </summary>
|
public bool SearchForFile
|
{
|
get { return bolSearchForFile; }
|
set { bolSearchForFile = value; }
|
}
|
private bool bolSearchForDirectory = true;
|
/// <summary>
|
/// 查询文件夹
|
/// </summary>
|
public bool SearchForDirectory
|
{
|
get { return bolSearchForDirectory; }
|
set { bolSearchForDirectory = value; }
|
}
|
//private int? searchCreationTime_High;
|
//private int? searchCreationTime_Low;
|
private DateTime? searchCreationTime;
|
/// <summary>
|
/// 查询文件创建时间在设置时间之后的文件
|
/// </summary>
|
public DateTime? SearchCreationTime
|
{
|
get { return searchCreationTime; }
|
set
|
{
|
searchCreationTime = value;
|
}
|
}
|
|
|
private DateTime? searchCreationEndTime;
|
/// <summary>
|
/// 查询文件创建时间在设置时间之前的文件
|
/// </summary>
|
public DateTime? SearchCreationEndTime
|
{
|
get { return searchCreationEndTime; }
|
set
|
{
|
searchCreationEndTime = value;
|
}
|
}
|
|
private DateTime? searchModifyTime;
|
/// <summary>
|
/// 查询文件修改时间在设置时间之后的文件
|
/// </summary>
|
public DateTime? SearchModifyTime
|
{
|
get { return searchModifyTime; }
|
set
|
{
|
searchModifyTime = value;
|
}
|
}
|
|
|
private DateTime? searchModifyEndTime;
|
/// <summary>
|
/// 查询文件修改时间在设置时间之前的文件
|
/// </summary>
|
public DateTime? SearchModifyEndTime
|
{
|
get { return searchModifyEndTime; }
|
set
|
{
|
searchModifyEndTime = value;
|
}
|
}
|
#endregion
|
/// <summary>
|
/// 关闭文件
|
/// </summary>
|
public void Close()
|
{
|
this.CloseHandler();
|
}
|
#region IEnumerator
|
/// <summary>
|
/// 当前文件
|
/// </summary>
|
public object Current
|
{
|
get { return objCurrentObject; }
|
}
|
/// <summary>
|
/// 查询下一文件
|
/// </summary>
|
/// <returns>是否成功</returns>
|
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;
|
}
|
}
|
}
|
/// <summary>
|
/// 重设
|
/// </summary>
|
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);
|
/// <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(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;
|
}
|
/// <summary>
|
/// 查询下一文件
|
/// </summary>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 更新当前文件信息
|
/// </summary>
|
/// <returns></returns>
|
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
|
}
|
|
}
|