厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容