厚积薄发,丰富的公用类库积累,助你高效进行系统开发(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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值