博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(4)----CSV、Excel、INI文件、独立存储等文件相关...
阅读量:7285 次
发布时间:2019-06-30

本文共 24519 字,大约阅读时间需要 81 分钟。

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力。
继续前面的随笔系列,介绍公用类库的详细使用,既上篇介绍了数据库相关的操作内容后,本篇主要介绍文件相关的处理辅助类。本篇介绍的辅助类包括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://yvzjm.baihongyu.com/

你可能感兴趣的文章
《Puppet实战手册》——2.12 使用正则表达式进行替换
查看>>
《C++ Primer Plus(第6版)中文版》——1.4 程序创建的技巧
查看>>
《Java程序员面试秘笈》—— 面试题13 Java开发原则
查看>>
Oracle官方并发教程之Executor接口
查看>>
Python正则表达式指南
查看>>
DevOps转型的柳暗花明:开发运维一体化PaaS平台建设
查看>>
使用阿里云容器服务Jenkins实现持续集成之GitLab篇
查看>>
京东2017校园招聘笔试真题(希尔排序)
查看>>
Docker网络深度解读
查看>>
C语言OJ项目参考(1052)两个字符串连接
查看>>
Ckeditor一种很方便的文本编辑器
查看>>
阿里智能物联安全白皮书正式发布
查看>>
org.hibernate.hql.ast.QuerySyntaxException: buyer is not mapped
查看>>
三个月达到百万日活,梨视频如何借助云计算做最好看的资讯短视频?
查看>>
WCF调试异常信息:ServiceHost 仅支持类服务类型
查看>>
【转】java枚举使用详解
查看>>
使用JDK自带的WebService
查看>>
智捷公开课马上开始了-欢迎大家一起讨论学习-第一系列读《Swift开发指南(修订版) 》看Swift视频教程...
查看>>
C# 使用Log4Net记录日志(基础篇)
查看>>
转 比较跨语言通讯框架:Apache Thrift和Google Protobuf
查看>>