厚积薄发,丰富的公用类库积累,助你高效进行系统开发(4)----CSV、Excel、INI文件、独立存储等文件相关

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力。
继续前面的随笔系列,介绍公用类库的详细使用,既上篇介绍了数据库相关的操作内容后,本篇主要介绍文件相关的处理辅助类。本篇介绍的辅助类包括CSV操作辅助类,非VBA操作的Excel辅助类、常用文件操作辅助类、常用目录操作辅助类、打开及保存文件对话框操作辅助类、INI文件操作辅助类、监视文件变化的类、独立存储操作辅助类等文件相关的辅助类。

1、CSV文件和DataTable对象转换辅助类 CSVHelper 

实现效果

    1)本辅助类主要是用来方便实现CSV文件和DataTable对象的相互转换。

    2)逗号分隔型取值格式(英文全称为Comma Separated Values,简称CSV),是一种纯文本格式,用来存储数据。在CSV中,数据的字段由逗号分开,程序通过读取文件重新创建正确的字段,方法是每次遇到逗号时开始新一段数据。CSV除了可以用记事本等文本工具打开外,还可以用Excel打开,其效果和Excel很类似,因此二维表格数据一般也可以导出成CSV格式的文件。由于CSV文件可以使用Excel打开并操作,但导出CSV文件不需要客户端安装Excel软件,因此非常方便易用。  

 

实现代码

  1)辅助类提供的方法接口如下所示:

 /// <summary>   
///
 CSV转换成DataTable(OleDb数据库访问方式)    
/// </summary>    
/// <param name="csvPath">csv文件路径</param>    
/// <returns></returns>    
public static DataTable CSVToDataTableByOledb(string csvPath)    
   
/// <summary>    
/// CSV转换成DataTable(文件流方式)    
/// </summary>    
/// <param name="csvPath">csv文件路径</param>    
/// <returns></returns>    
public static DataTable CSVToDataTableByStreamReader(string csvPath)    
   
/// <summary>    
/// DataTable 生成 CSV    
/// </summary>    
/// <param name="dt">DataTable</param>    
/// <param name="csvPath">csv文件路径</param>    
public static void DataTableToCSV(DataTable dt, string csvPath)  

  2) 辅助类CSVHelper的使用例子代码如下所示

string access = @"C:\Orderwater.mdb";    
OleDbHelper helper 
= new OleDbHelper(access);    
string sql = string.Format("Select * from All_Customer ");    
DataTable dt 
= helper.ExecuteDataSet(sql).Tables[0];    
   
//导出到CSV文件    
string fileName = Path.Combine(Application.StartupPath, "customer.csv");    
CSVHelper.DataTableToCSV(dt, fileName);    
   
//从CSV文件导入到DataTable    
DataTable dtNew = CSVHelper.CSVToDataTableByOledb(fileName);    
this.dataGridView1.DataSource = dtNew.DefaultView; 

 

2、 Excel操作辅助类(无需VBA引用) ExcelHelper

实现效果

 1)本辅助类主要是用来方便实现对Excel的相关操作,不需要调用Office的VBA相关类。 该导出操作是基于XML文件和OleDB格式的,因此导出Excel文件不需要客户端安装Excel软件,因此非常方便易用。 

 2) 辅助类可以列出Excel的所有表、列出指定表的所有列、从Excel转换为DataSet对象集合、把DataSet转换保存为Excel文件等操作。

实现代码

 1) 辅助类提供的方法接口如下所示:

#region 获取Excel连接字符串    
   
/// <summary>    
/// 返回Excel 连接字符串   [IMEX=1]    
/// </summary>    
/// <param name="excelPath">Excel文件 绝对路径</param>    
/// <param name="header">是否把第一行作为列名</param>    
/// <param name="eType">Excel 版本 </param>    
/// <returns></returns>    
public static string GetExcelConnectstring(string excelPath, bool header, ExcelType eType)    
   
/// <summary>    
/// 返回Excel 连接字符串    
/// </summary>    
/// <param name="excelPath">Excel文件 绝对路径</param>    
/// <param name="header">是否把第一行作为列名</param>    
/// <param name="eType">Excel 版本 </param>    
/// <param name="imex">IMEX模式</param>    
/// <returns></returns>    
public static string GetExcelConnectstring(string excelPath, bool header, ExcelType eType, IMEXType imex)   
  
#endregion   
  
#region 获取Excel工作表名    
   
/// <summary>    
/// 返回Excel工作表名    
/// </summary>    
/// <param name="excelPath">Excel文件 绝对路径</param>    
/// <param name="eType">Excel 版本 </param>    
/// <returns></returns>    
public static List<string> GetExcelTablesName(string excelPath, ExcelType eType)    
   
/// <summary>    
/// 返回Excel工作表名    
/// </summary>    
/// <param name="connectstring">excel连接字符串</param>    
/// <returns></returns>    
public static List<string> GetExcelTablesName(string connectstring)    
   
/// <summary>    
/// 返回Excel工作表名    
/// </summary>    
/// <param name="connection">excel连接</param>    
/// <returns></returns>    
public static List<string> GetExcelTablesName(OleDbConnection connection)    
   
/// <summary>    
/// 返回Excel第一个工作表表名    
/// </summary>    
/// <param name="excelPath">Excel文件 绝对路径</param>    
/// <param name="eType">Excel 版本 </param>    
/// <returns></returns>    
public static string GetExcelFirstTableName(string excelPath, ExcelType eType)    
   
/// <summary>    
/// 返回Excel第一个工作表表名    
/// </summary>    
/// <param name="connectstring">excel连接字符串</param>    
/// <returns></returns>    
public static string GetExcelFirstTableName(string connectstring)    
   
/// <summary>    
/// 返回Excel第一个工作表表名    
/// </summary>    
/// <param name="connection">excel连接</param>    
/// <returns></returns>    
public static string GetExcelFirstTableName(OleDbConnection connection)    
   
/// <summary>    
/// 获取Excel文件中指定工作表的列    
/// </summary>    
/// <param name="excelPath">Excel文件 绝对路径</param>    
/// <param name="table">名称 excel table  例如:Sheet1$</param>    
/// <returns></returns>    
public static List<string> GetColumnsList(string excelPath, ExcelType eType, string table)   
  
#endregion   
  
#region EXCEL导入DataSet    
   
/// <summary>    
/// EXCEL导入DataSet    
/// </summary>    
/// <param name="excelPath">Excel文件 绝对路径</param>    
/// <param name="table">名称 excel table  例如:Sheet1$ </param>    
/// <param name="header">是否把第一行作为列名</param>    
/// <param name="eType">Excel 版本 </param>    
/// <returns>返回Excel相应工作表中的数据 DataSet   [table不存在时返回空的DataSet]</returns>    
public static DataSet ExcelToDataSet(string excelPath, string table, bool header, ExcelType eType)    
   
/// <summary>    
/// 判断工作表名是否存在    
/// </summary>    
/// <param name="connection">excel连接</param>    
/// <param name="table">名称 excel table  例如:Sheet1$</param>    
/// <returns></returns>    
private static bool isExistExcelTableName(OleDbConnection connection, string table)    
   
/// <summary>    
/// EXCEL导入DataSet    
/// </summary>    
/// <param name="connectstring">excel连接字符串</param>    
/// <param name="table">名称 excel table  例如:Sheet1$ </param>    
/// <returns>返回Excel相应工作表中的数据 DataSet   [table不存在时返回空的DataSet]</returns>    
public static DataSet ExcelToDataSet(string connectstring, string table)    
   
/// <summary>    
/// EXCEL所有工作表导入DataSet    
/// </summary>    
/// <param name="excelPath">Excel文件 绝对路径</param>    
/// <param name="header">是否把第一行作为列名</param>    
/// <param name="eType">Excel 版本 </param>    
/// <returns>返回Excel第一个工作表中的数据 DataSet </returns>    
public static DataSet ExcelToDataSet(string excelPath, bool header, ExcelType eType)    
   
/// <summary>    
/// EXCEL所有工作表导入DataSet    
/// </summary>    
/// <param name="connectstring">excel连接字符串</param>    
/// <returns>返回Excel第一个工作表中的数据 DataSet </returns>    
public static DataSet ExcelToDataSet(string connectstring)   
  
#endregion    
   
/// <summary>    
/// 把一个数据集中的数据导出到Excel文件中(XML格式操作)    
/// </summary>    
/// <param name="source">DataSet数据</param>    
/// <param name="fileName">保存的Excel文件名</param>    
public static void DataSetToExcel(DataSet source, string fileName)    
   
/// <summary>    
/// 将DataTable到处为Excel(OleDb 方式操作)    
/// </summary>    
/// <param name="dataTable"></param>    
/// <param name="fileName">导出默认文件名</param>    
public static void DataSetToExcel(DataTable dataTable, string fileName) 

 2)辅助类ExcelHeper的使用例子代码如下所示

 string filePath = @"C:\test.xls";    

//获取第一个表名    
string sheetname = ExcelHelper.GetExcelFirstTableName(filePath, ExcelHelper.ExcelType.Excel2003);//Sheet1$    
   
//列出所有表名称    
List<string> tableList = ExcelHelper.GetExcelTablesName(filePath, ExcelHelper.ExcelType.Excel2003);    
   
//从Excel转换为DataSet对象集合    
DataSet ds =  ExcelHelper.ExcelToDataSet(filePath, true, ExcelHelper.ExcelType.Excel2003);    
   
//列出指定表的列名称    
List<string> columnList = ExcelHelper.GetColumnsList(filePath, ExcelHelper.ExcelType.Excel2003, "Sheet1$");    
   
//绑定数据显示    
this.dataGridView1.DataSource = ds.Tables[0].DefaultView;    
   
//导出DataSet到Excel文件中    
filePath = FileDialogHelper.SaveExcel();    
   
ExcelHelper.DataSetToExcel(ds, filePath);    
Process.Start(filePath);  

 

3、 常用文件操作辅助类 FileUtil

实现效果

 1)本辅助类主要是用来方便实现文件相关的操作,包括Stream、byte[] 和 文件之间的转换、获取文件编码、获取文件长度、创建文件、删除文件、移动文件、读取文件、读取文件属性、设置文件属性等功能。 

 2) 辅助类主要提供File、FileInfo、FileStream、MemoryStream、Stream、StreamReader、Encode等类的封装,提供文件相关的操作功能。

实现代码

 1) 由于辅助类接口函数比较多,在此列出部分接口,辅助类提供的方法部分接口如下所示:   

 /// <summary> 
/
// 向文本文件中写入内容    
/// </summary>    
/// <param name="filePath">文件的绝对路径</param>    
/// <param name="content">写入的内容</param>    
public static void WriteText(string filePath, string content)    
   
/// <summary>    
/// 向文本文件的尾部追加内容    
/// </summary>    
/// <param name="filePath">文件的绝对路径</param>    
/// <param name="content">写入的内容</param>    
public static void AppendText(string filePath, string content)    
   
/// <summary>    
/// 将源文件的内容复制到目标文件中    
/// </summary>    
/// <param name="sourceFilePath">源文件的绝对路径</param>    
/// <param name="destFilePath">目标文件的绝对路径</param>    
public static void Copy(string sourceFilePath, string destFilePath)    
   
/// <summary>    
/// 将文件移动到指定目录    
/// </summary>    
/// <param name="sourceFilePath">需要移动的源文件的绝对路径</param>    
/// <param name="descDirectoryPath">移动到的目录的绝对路径</param>    
public static void Move(string sourceFilePath, string descDirectoryPath)    
   
/// <summary>    
/// 检测指定文件是否存在,如果存在则返回true。    
/// </summary>    
/// <param name="filePath">文件的绝对路径</param>    
public static bool IsExistFile(string filePath)    
   
/// <summary>    
/// 创建一个文件。    
/// </summary>    
/// <param name="filePath">文件的绝对路径</param>    
public static void CreateFile(string filePath)    
   
/// <summary>    
/// 创建一个文件,并将字节流写入文件。    
/// </summary>    
/// <param name="filePath">文件的绝对路径</param>    
/// <param name="buffer">二进制流数据</param>    
public static void CreateFile(string filePath, byte[] buffer)    

#region XML文件操作    
/// <summary>    
/// 从XML文件转换为Object对象类型.    
/// </summary>    
/// <param name="path">XML文件路径</param>    
/// <param name="type">Object对象类型</param>    
/// <returns></returns>    
public static object LoadObjectFromXml(string path, Type type)    
   
/// <summary>    
/// 保存对象到特定格式的XML文件    
/// </summary>    
/// <param name="path">XML文件路径.</param>    
/// <param name="obj">待保存的对象</param>    
public static void SaveObjectToXml(string path, object obj)   
  
#endregion 
 2)辅助类FileUtil的使用例子1代码如下所示
string filePath = "C:\\Test.txt";    
//创建一个文件并添加文本    
FileUtil.AppendText(filePath, "测试内容");    
   
//获取文件编码    
Encoding encode = FileUtil.GetEncoding(filePath);    
string encodename = encode.EncodingName;    
   
//读取文件内容    
string content = FileUtil.FileToString(filePath);    
   
//读取文件到内存流    
Stream stream = FileUtil.FileToStream(filePath);    
stream.Close();    
   
//获取文件创建时间    
DateTime dtCreate =FileUtil.GetFileCreateTime(filePath);    
   
//设置文件只读    
FileUtil.SetFileReadonly(filePath, true);

    

例子2如下代码所示

public static DatabaseSetting[] ReadSettings()    
{    
    
if (!File.Exists(XmlPath))    
    {    
        
throw new FileNotFoundException("File not found: DatabaseSetting.xml");    
    }    
   
    DatabaseSetting[] settings 
= FileUtil.LoadObjectFromXml(XmlPath, typeof(DatabaseSetting[])) as DatabaseSetting[];    
    
return settings;    
}    
   
public static bool Save(DatabaseSetting[] settings)    
{    
    
bool breturn = false;    
    
if (settings != null)    
    {    
        FileUtil.SaveObjectToXml(XmlPath, settings);    
        breturn 
= true;    
    }    
    
return breturn;    
}    
   
public static DatabaseSetting[] Add(DatabaseSetting setting)    
{    
    DatabaseSetting[] settingArray 
= ReadSettings();    
    
if (setting != null)    
    {    
        List
<DatabaseSetting> list = new List<DatabaseSetting>(settingArray);    
        list.Add(setting);    
        settingArray 
= list.ToArray();    
   
        FileUtil.SaveObjectToXml(XmlPath, settingArray);    
    }    
    
return settingArray;    

 

4、 常用的目录操作辅助类 DirectoryUtil

实现效果

 1)本辅助类主要是用来方便实现目录操作的相关功能,包括目录可写与空间计算、获取指定目录中的文件列表、获取指定目录中的子目录列表、创建目录、生成目录、检测目录等目录操作功能。 

 2) 辅助类主要提供Environment、Path、Directory、DirectoryInfo等对象的封装,提供目录相关的操作。

实现代码

 1) 辅助类提供的方法接口如下所示,由于接口函数较多,提供部分接口:

#region 目录可写与空间计算    
   
/// <summary>    
///检查目录是否可写,如果可以,返回True,否则False    
/// </summary>    
/// <param name="path"></param>    
/// <returns></returns>    
public static bool IsWriteable(string path)    
   
/// <summary>    
/// 检查磁盘是否有足够的可用空间    
/// </summary>    
/// <param name="path"></param>    
/// <param name="requiredSpace"></param>    
/// <returns></returns>    
public static bool IsDiskSpaceEnough(string path, ulong requiredSpace)    
   
/// <summary>    
/// 获取驱动盘符的可用空间大小    
/// </summary>    
/// <param name="driveName">Direve name</param>    
/// <returns>free space (byte)</returns>    
public static ulong GetFreeSpace(string driveName)   
  
#endregion   
  
#region 目录操作   
  
#region 获取指定目录中的文件列表    
/// <summary>    
/// 获取指定目录中所有文件列表    
/// </summary>    
/// <param name="directoryPath">指定目录的绝对路径</param>    
public static string[] GetFileNames(string directoryPath)    
   
/// <summary>    
/// 获取指定目录及子目录中所有文件列表    
/// </summary>    
/// <param name="directoryPath">指定目录的绝对路径</param>    
/// <param name="searchPattern">模式字符串,"*"代表0或N个字符,"?"代表1个字符。    
/// 范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。</param>    
/// <param name="isSearchChild">是否搜索子目录</param>    
public static string[] GetFileNames(string directoryPath, string searchPattern, bool isSearchChild)   
  
#endregion   
  
#region 获取指定目录中的子目录列表    
/// <summary>    
/// 获取指定目录中所有子目录列表,若要搜索嵌套的子目录列表,请使用重载方法.    
/// </summary>    
/// <param name="directoryPath">指定目录的绝对路径</param>    
public static string[] GetDirectories(string directoryPath)    
   
/// <summary>    
/// 获取指定目录及子目录中所有子目录列表    
/// </summary>    
/// <param name="directoryPath">指定目录的绝对路径</param>    
/// <param name="searchPattern">模式字符串,"*"代表0或N个字符,"?"代表1个字符。    
/// 范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。</param>    
/// <param name="isSearchChild">是否搜索子目录</param>    
public static string[] GetDirectories(string directoryPath, string searchPattern, bool isSearchChild)   

#endregion    

2)辅助类DirectoryUtil的使用例子代码如下所示

string ticketFilePath = PCDataCollector_Config.Default.TickDataFilePath;    
DirectoryUtil.AssertDirExist(ticketFilePath);    
   
//对存在的票据数据进行处理    
string[] ticketFiles = Directory.GetFiles(ticketFilePath);    
foreach (string file in ticketFiles)    
{    
    DealTicketFile(file);    
}  

 

5、 打开、保存文件对话框操作辅助类 FileDialogHelper

实现效果

 1)本辅助类主要是用来方便实现打开、保存文件对话框的操作,如常用的图片文件、Excel文件、Access文件、文本文件、压缩文件、颜色等对话框的操作。 

 2) 该辅助类封装了FolderBrowserDialog、OpenFileDialog、SaveFileDialog、ColorDialog等对话框的常用对象的操作,快速实现文件打开、保存等操作。
 

实现代码

 1) 由于提供各种打开对话框,保存对话框等代码类似,在此以文本文件对话框操作为例,辅助类提供的方法接口如下所示,其他如Excel、压缩文件、图片文件、Access数据库文件等类似操作,都提供了多种重载方法。

文件打开或者保存,对应不同的格式,如图片,提供多种格式列表进行选择等。 

        private static string ExcelFilter = "Excel(*.xls)|*.xls|All File(*.*)|*.*";
        
private static string ImageFilter = "Image Files(*.BMP;*.bmp;*.JPG;*.jpg;*.GIF;*.gif;*.png)|(*.BMP;*.bmp;*.JPG;*.jpg;*.GIF;*.gif;*.png)|All File(*.*)|*.*";
        
private static string HtmlFilter = "HTML files (*.html;*.htm)|*.html;*.htm|All files (*.*)|*.*";
        
private static string AccessFilter = "Access(*.mdb)|*.mdb|All File(*.*)|*.*";
        
private static string ZipFillter = "Zip(*.zip)|*.zip|All files (*.*)|*.*";
        
private const string ConfigFilter = "配置文件(*.cfg)|*.cfg|All File(*.*)|*.*";
        
private static string TxtFilter = "(*.txt)|*.txt|All files (*.*)|*.*";

 

#region Txt相关对话框    
/// <summary>    
/// 打开Txt对话框    
/// </summary>    
/// <returns></returns>    
public static string OpenText()    
{    
    
return Open("文本文件选择", TxtFilter);    
}    
   
/// <summary>    
/// 保存Excel对话框,并返回保存全路径    
/// </summary>    
/// <returns></returns>    
public static string SaveText()    
{    
    
return SaveText(string.Empty);    
}    
   
/// <summary>    
/// 保存Excel对话框,并返回保存全路径    
/// </summary>    
/// <returns></returns>    
public static string SaveText(string filename)    
{    
    
return Save("保存文本文件", TxtFilter, filename);    
}     
   
/// <summary>    
/// 保存Excel对话框,并返回保存全路径    
/// </summary>    
/// <returns></returns>    
public static string SaveText(string filename, string initialDirectory)    
{    
    
return Save("保存文本文件", TxtFilter, filename, initialDirectory);    
}   
#endregion 
 2)辅助类的使用例子代码如下所示,示例弹出一个保存文件对话框,用户选定保存Excel文件后,执行数据导出操作。
private void menuExcel_Click(object sender, EventArgs e)    
{    
    
string savePath = FileDialogHelper.SaveExcel();    
    
if (!string.IsNullOrEmpty(savePath))    
    {    
        
string outError = "";    
        AsposeExcelTools.DataTableToExcel(dtSource, savePath, 
out outError);    
   
        
if (!string.IsNullOrEmpty(outError))    
        {    
            MessageBox.Show(outError);    
        }    
        
else   
        {    
            Process.Start(savePath);    
        }    
    }    
}  

 

例子2代码如下所示

private void btnImportContent_Click(object sender, EventArgs e)    
{    
    
string fileName = FileDialogHelper.OpenText();    
    
if (!string.IsNullOrEmpty(fileName))    
    {    
        ThreadPool.QueueUserWorkItem(
new WaitCallback(ImportContentData), fileName);    
    }  
  

  

6、 INI文件操作辅助类 INIFileUtil

实现效果

 1)本辅助类主要是用来方便快捷获取或设置INI文件的内容。 

 2) 辅助类包括下面功能:写INI文件、读取INI文件、删除ini文件下所有段落、删除ini文件下指定段落下的所有键等功能。

INI文件格式如下所示

 

实现代码

 1) 辅助类提供的方法接口如下所示:

/// <summary>    
/// 写INI文件    
/// </summary>    
/// <param name="Section">分组节点</param>    
/// <param name="Key">关键字</param>    
/// <param name="Value"></param>    
public void IniWriteValue(string Section,string Key,string Value)    
   
/// <summary>    
/// 读取INI文件    
/// </summary>    
/// <param name="Section">分组节点</param>    
/// <param name="Key">关键字</param>    
/// <returns></returns>    
public string IniReadValue(string Section,string Key)    
   
public byte[] IniReadValues(string section, string key)    
   
/// <summary>    
/// 删除ini文件下所有段落    
/// </summary>    
public void ClearAllSection()    
   
/// <summary>    
/// 删除ini文件下指定段落下的所有键    
/// </summary>    
/// <param name="Section"></param>    

public void ClearSection(string Section)  

 2)辅助类INIFileUtil的使用例子代码如下所示

private void DetalParkingThread(object objFileName)    
{    
    
string fileName = objFileName.ToString();    
    
try   
    {    
        INIFileUtil iniFile 
= new INIFileUtil(fileName);    
        
string parking_no = iniFile.IniReadValue("Parking""parking_no").Trim();    
        
string max_cars = iniFile.IniReadValue("Parking""max_cars").Trim();    
        
string space = iniFile.IniReadValue("Parking""space").Trim();    
        
string in_no = iniFile.IniReadValue("Parking""in_no").Trim();    
        
string out_no = iniFile.IniReadValue("Parking""out_no").Trim();    
        
string in_month_no = iniFile.IniReadValue("Parking""in_month_no").Trim();    
        
string out_month_no = iniFile.IniReadValue("Parking""out_month_no").Trim();    
        
string in_temp_no = iniFile.IniReadValue("Parking""in_temp_no").Trim();    
        
string out_temp_no = iniFile.IniReadValue("Parking""out_temp_no").Trim();    
        
string update_time = iniFile.IniReadValue("Parking""update_time").Trim();    
   
        
string seqNo = DateTime.Now.ToString("yyyyMMdd"+ new Random().Next(99999).ToString().PadLeft(5'0');// 发送请求    
        PCParkingInfoUpload data = new PCParkingInfoUpload(seqNo, parking_no, Convert.ToInt32(max_cars),    
            Convert.ToInt32(space), Convert.ToInt32(in_no), Convert.ToInt32(out_no), Convert.ToInt32(in_month_no),    
            Convert.ToInt32(out_month_no), Convert.ToInt32(in_temp_no), Convert.ToInt32(out_temp_no), Convert.ToDateTime(update_time));    
        CommonManager.Instance.Send(data.ToString());    
   
        
// 记录请求    
        ReqAnsManager.Instance.Add(new RequestRecord(DataTypeKey.PCParkingInfoUpload, seqNo, DateTime.Now.AddSeconds(10), fileName, null));    
    }    
    
catch(Exception ex)    
    {    
        Log.WriteError(
string.Format("{0} INI文件格式错误:{1}", objFileName, ex.Message));    
    }    
}

 

7、 独立存储操作辅助类 IsolatedStorageHelper

实现效果

 1)本辅助类主要是用来方便实现对独立存储区域文件或者目录的快速操作。 

 2) .NET引入了独立存储区概念。独立存储区就像一个虚拟文件夹。用户不需要知道文件存储的确切的位置。你 所作的就是告诉.NET Framework在独立存储区存储你的文件。对于不同的操作系统独立存储区的物理位置是不同的。在你的应用程序中 简单的使用.NET中的类创建和访问文件,不需要担心文件存储的物理位置。 

实现代码

 1) 辅助类提供的方法接口如下所示:

#region 程序运行时间的保存操作    
/// <summary>    
/// 加密并保存指定时间到"独立存贮空间" (以分号(;)追加保存)    
/// </summary>    
public static void SaveDataTime()    
   
/// <summary>    
/// 加密并保存当前时间到"独立存贮空间" (以分号(;)追加保存)    
/// </summary>    
public static void SaveDataTime(DateTime fromDate)    
   
/// <summary>     
/// 从"独立存贮空间"取程序第一次运行的时间并解密    
/// </summary>     
/// <returns></returns>     
public static string GetDataTime()   
  
#endregion   
  
#region 基本操作函数    
   
/// <summary>    
/// 保存对象到独立存储区    
/// </summary>    
/// <param name="objectToSave">待保存的对象</param>    
/// <param name="key">保存的键值</param>    
public static void Save(object objectToSave, string key)    
   
/// <summary>    
/// 根据键值加载独立存储区的内容    
/// </summary>    
/// <param name="key">独立存储的键值(路径)</param>    
/// <returns></returns>    
public static object Load(string key)    
   
/// <summary>    
/// 加载存在用户标识范围、应用程序范围内的存储值    
/// </summary>    
/// <param name="d">待填充的字典对象</param>    
/// <param name="filename">文件名</param>    
public static void LoadFromUserStoreForApplication(IDictionary d, string filename)    
   
/// <summary>    
/// 保存在用户标识范围、应用程序范围内的值    
/// </summary>    
/// <param name="d">待保存的字典对象</param>    
/// <param name="filename">文件名</param>    
public static void SaveToUserStoreForApplication(IDictionary d, string filename)    
   
/// <summary>    
/// 加载用户范围、应用范围、程序集范围内的存储值    
/// </summary>    
/// <param name="d">待填充的字典对象.</param>    
/// <param name="filename">文件名</param>    
public static void LoadFromUserStoreForDomain(IDictionary d, string filename)    
   
/// <summary>    
/// 保存用户范围、应用范围、程序集范围内的存储值    
/// </summary>    
/// <param name="d">待保存的字典对象</param>    
/// <param name="filename">文件名</param>    
public static void SaveToUserStoreForDomain(IDictionary d, string filename)    
   
/// <summary>    
/// 加载在独立存储内的指定文件内容    
/// </summary>    
/// <param name="d">待填充的字典内容</param>    
/// <param name="scope">独立存储范围对象</param>    
/// <param name="filename">文件名</param>    
public static void Load(IDictionary d, IsolatedStorageScope scope, string filename)    
   
/// <summary>    
/// 在独立存储范围内保存字典内容到指定文件    
/// </summary>    
/// <param name="d">待保存的字典内容</param>    
/// <param name="scope">独立存储范围对象</param>    
/// <param name="filename">文件名</param>    
public static void Save(IDictionary d, IsolatedStorageScope scope, string filename)    
   
/// <summary>    
/// 删除指定区域的存储区内容    
/// </summary>    
/// <param name="fileName">待删除的文件</param>    
/// <param name="scope">独立存储范围对象</param>    
public static void Delete(string fileName, IsolatedStorageScope scope)    
   
/// <summary>    
/// 在存储区内创建目录    
/// </summary>    
/// <param name="storage"></param>    
/// <param name="dirName"></param>    
public static void CreateDirectory(IsolatedStorageFile storage, string dirName)    
   
/// <summary>    
/// 在存储区内删除目录    
/// </summary>    
/// <param name="storage"></param>    
/// <param name="dirName"></param>    
public static void DeleteDirectory(IsolatedStorageFile storage, string dirName)   
  

#endregion   

  2)辅助类的使用例子代码如下所示。例子实现对用户程序执行时间的判断,防止用户擅自修改系统时间。

/// <summary>    
/// 检查用户的时间记录是否正确    
/// </summary>    
/// <returns></returns>    
public bool CheckTimeString()    
{    
    
/*   
      每次启动纪录一个时间date[0]...date[n].      
      第n+1次启动时date[n+1].      
      if(date[n+1]   <=   date[n])      
                exit(-1);      
      if((date[n+1]-date[0])>30天)      
              exit(-2);      
      write   date[n+1]   to   纪录     
     
*/   
   
    
string dateTimeString = IsolatedStorageHelper.GetDataTime();    
    
string[] timeArray = dateTimeString.Split(new char[] { ';' });    
    DateTime lastestTime 
= System.DateTime.Now;    
    DateTime tempTime;    
    
for (int i = 0; i < timeArray.Length; i++)    
    {    
        
try   
        {    
            tempTime 
= Convert.ToDateTime(timeArray[i]);    
        }    
        
catch   
        {    
            tempTime 
= System.DateTime.Now.AddMinutes(-1);//最古老的时间为当前时间的一分钟前    
        }    
        
if (i == 0)    
        {    
            lastestTime 
= tempTime;    
            Portal.gc.FirstRunTime 
= lastestTime;    
        }    
   
        Portal.gc.TimeList.Add(tempTime);    
    }    
   
    
//验证时间的有效性    
    
// 用户调整了时间    
    
// 用户使用超过指定时间    
    DateTime newestTime = System.DateTime.Now;    
    
if (newestTime < lastestTime)    
    {    
        MessageUtil.ShowWarning(
"对不起,您在本软件的试用期内不可以修改系统日期。\r\n如果您想继续使用本软件,请您恢复系统日期。谢谢合作");    
        
return false;    
    }    
   
    TimeSpan span 
= new TimeSpan(newestTime.Ticks - lastestTime.Ticks);    
    
if (span.Days > UIConstants.SoftwareProbationDay)    
    {    
        MessageUtil.ShowTips(
"您使用本软件已经过了试用期,如果您想继续使用本软件,请您联系我们。");    
        Portal.gc.DisableAllFunction 
= true;    
        
return false;    
    }    
   
    IsolatedStorageHelper.SaveDataTime(); 
//记录程序运行的时间    
    return true;    

}  

  

8、监视文件变化的类,包括创建、修改、删除等操作的辅助类 MyFileSystemWatcher 

实现效果

 1)本辅助类主要是用来方便实现监视文件或文件夹变化,包括创建、修改、重新命名、删除等操作的。 

 2) 本辅助类非常适合用于监听文件或者文件夹的变化,然后做相应的处理,如数据报送、日志记录等操作。示例的效果如下所示。 

 

 实现代码

1)辅助类的使用例子代码如下所示

static void Main(string[] args)    
{    
    MyFileSystemWatcher fsw 
= new MyFileSystemWatcher(@"D:\Test");    
    fsw.Created 
+= new System.IO.FileSystemEventHandler(fsw_Created);    
    fsw.Changed 
+= new System.IO.FileSystemEventHandler(fsw_Changed);    
    fsw.Deleted 
+= new System.IO.FileSystemEventHandler(fsw_Deleted);    
    fsw.Renamed 
+= new System.IO.RenamedEventHandler(fsw_Renamed);    
    fsw.EnableRaisingEvents 
= true;    
   
    Console.ReadLine();    
}    
   
static void fsw_Renamed(object sender, System.IO.RenamedEventArgs e)    
{    
    Console.WriteLine(
"Renamed: FileName - {0}, ChangeType - {1}, Old FileName - {2}", e.Name, e.ChangeType, e.OldName);    
}    
   
static void fsw_Deleted(object sender, System.IO.FileSystemEventArgs e)    
{    
    Console.WriteLine(
"Deleted: FileName - {0}, ChangeType - {1}", e.Name, e.ChangeType);    
}    
   
static void fsw_Changed(object sender, System.IO.FileSystemEventArgs e)    
{    
    Console.WriteLine(
"Changed: FileName - {0}, ChangeType - {1}", e.Name, e.ChangeType);    
}    
   
static void fsw_Created(object sender, System.IO.FileSystemEventArgs e)    
{    
    Console.WriteLine(
"Created: FileName - {0}, ChangeType - {1}", e.Name, e.ChangeType);    
}  

 

2) 实际项目中对文件监控的处理例子。

private MyFileSystemWatcher watcherParking;    
private MyFileSystemWatcher watcherTicket;    
   
/// <summary>    
/// 对指定目录或者文件进行监控    
/// </summary>    
public void StartFileWatcher()    
{    
    FileInfo fileInfo 
= new FileInfo(PCDataCollector_Config.Default.ParkingFilePath);    
    
string parkingFilePath = fileInfo.Directory.FullName;    
    DirectoryUtil.AssertDirExist(parkingFilePath);    
   
    
string ticketFilePath = PCDataCollector_Config.Default.TickDataFilePath;    
    DirectoryUtil.AssertDirExist(ticketFilePath);    
   
    StopFileWatcher();
//先取消后创建新的监控    
    watcherParking = new MyFileSystemWatcher(parkingFilePath, "parking.ini");    
    watcherParking.Changed 
+= new FileSystemEventHandler(watcherParking_Changed);    
    watcherParking.EnableRaisingEvents 
= true;    
   
    watcherTicket 
= new MyFileSystemWatcher(ticketFilePath, "*.ini");    
    watcherTicket.Created 
+= new FileSystemEventHandler(watcherTicket_Created);    
    watcherTicket.EnableRaisingEvents 
= true;    
   
    
//对存在的票据数据进行处理    
    string[] ticketFiles = Directory.GetFiles(ticketFilePath);    
    
foreach (string file in ticketFiles)    
    {    
        DealTicketFile(file);    
    }    
}    
   
/// <summary>    
/// 取消对文件的监控    
/// </summary>    
public void StopFileWatcher()    
{    
    
if (watcherParking != null)    
    {    
        watcherParking.Dispose();    
    }    
    
if (watcherTicket != null)    
    {    
        watcherTicket.Dispose();    
    }    
}    
   
private void DealTicketFile(string fileName)    
{    
    Thread thread 
= new Thread(new ParameterizedThreadStart(DealTicketFileThread));    
    thread.IsBackground 
= true;    
    thread.Start(fileName);    
}   

感谢大家的支持和鼓励。 

CHM帮助文档持续更新中,统一下载地址是: http://www.iqidi.com/download/commonshelp.rar 

 

系列文章列表如下: 

厚积薄发,丰富的公用类库积累,助你高效进行系统开发(1)

 

厚积薄发,丰富的公用类库积累,助你高效进行系统开发(2)

  

厚积薄发,丰富的公用类库积累,助你高效进行系统开发(3)

 

posted on 2011-07-30 11:58 伍华聪 阅读(...) 评论(...) 编辑 收藏

导航