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

标签: none

添加新评论