更新工具代碼 進(jìn)度2.0
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
using Microsoft.VisualBasic.Devices;
using System.Text.RegularExpressions;
namespace PMPPGEN
{
public partial class Form1 : Form
{
#region 聲明變量
//INI文件名
private static string PMPPGEN_FileName = "PMPPGEN.ini";
private static string PM7_FileName = "PM7.ini";
private static string HDATE_FileName = "HDATE.ini";
private static string VFREPORT_FileName = "VFREPORT.ini";
//獲取INI文件路徑
private string PMPPGEN_FilePath = Application.StartupPath + "\\" + PMPPGEN_FileName;
private string PM7_FilePath = Application.StartupPath + "\\" + PM7_FileName;
private string HDATE_FilePath = Application.StartupPath + "\\" + HDATE_FileName;
private string VFREPORT_FilePath = Application.StartupPath + "\\" + VFREPORT_FileName;
//元號固定用定義
private string GENGO_Section = "cpGENGO";//PMPPGEN節(jié)點(diǎn)名
private string PM7_Section = "cpGENGO";//PM7節(jié)點(diǎn)名
private string JpnYears_Section = "JpnYears";//JpnYears節(jié)點(diǎn)
private string WDATETIM_Section = "WDATETIM";//WDATETIM節(jié)點(diǎn)
private string HDATE_Section = "NENGO";//HDATE節(jié)點(diǎn)名
private string VFREPORT_Section = "Fclib";//VFREPORT節(jié)點(diǎn)名
//HDATE的key值組
private string gengo = "GENGO";
private string ryaku = "RYAKU";
private string startTime = "START";
private string endTime = "END";
private string nensa = "NENSA";
//VFREPORT的key值組
private string nengou = "Nengou";
///核心方法定義
/// <summary>
/// 寫入INI文件
/// </summary>
/// <param name="section">節(jié)點(diǎn)名稱[如[TypeName]]</param>
/// <param name="key">鍵</param>
/// <param name="val">值</param>
/// <param name="filepath">文件路徑</param>
/// <returns>??</returns>
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filepath);
/// <summary>
/// 讀取INI文件
/// </summary>
/// <param name="section">節(jié)點(diǎn)名稱</param>
/// <param name="key">鍵</param>
/// <param name="def">值</param>
/// <param name="retval">strignbuilder對象</param>
/// <param name="size">字節(jié)大小</param>
/// <param name="filePath">文件路徑</param>
/// <returns>??</returns>
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retval, int size, string filePath);
/// <summary>
/// 獲取對應(yīng)Section下所有key值
/// </summary>
/// <param name="section">節(jié)點(diǎn)名稱</param>
/// <param name="key">鍵</param>
/// <param name="def">值</param>
/// <param name="retVal">Byte數(shù)組對象</param>
/// <param name="size">字節(jié)大小</param>
/// <param name="filePath">文件路徑</param>
/// <returns>??</returns>
[DllImport("kernel32")]
private static extern int GetPrivateProfileStringA(string section, string key, string def, Byte[] retVal, int size, string filePath);
//日志類聲明
SimpleLogRecord log = new SimpleLogRecord();
//錯誤窗口
ErrorForm errorForm = new ErrorForm();
#endregion
#region 窗體部分
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 窗體加載
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
//檢查ini文件是否存在
iniFileCheck();
}
/// <summary>
/// 執(zhí)行更新處理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btGO_Click(object sender, EventArgs e)
{
//執(zhí)行更新前先驗(yàn)證輸入框
inputCheck();
//ini文件備份處理
backUpFiles();
//更新PM7.ini文件信息
setPM7Info();
//更新HDATE.ini文件信息
setHDATEInfo();
//更新VFREPORT.ini文件信息
setVFREPORTInfo();
//成功提示
MessageBox.Show("元號更新成功!");
}
/// <summary>
/// 畫面關(guān)閉
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btClose_Click(object sender, EventArgs e)
{
this.Close();
}
#endregion
#region 文件核實(shí)及備份
/// <summary>
/// 檢查ini文件存在具體方法
/// </summary>
private void iniFileCheck()
{
try
{
//判斷PMPPGEN.INI文件是否存在
if (!File.Exists(PMPPGEN_FilePath))
{
MessageBox.Show("環(huán)境ファイル‘PMPPGEN.INI’が見つかりません卧秘。呢袱!");
errorForm.ShowDialog();
}
//判斷PM7.INI文件是否存在
if (!File.Exists(PM7_FilePath))
{
MessageBox.Show("更新ファイルファイル‘PM7.INI’が見つかりません。翅敌!");
errorForm.ShowDialog();
}
//判斷HDATE.INI文件是否存在
if (!File.Exists(HDATE_FilePath))
{
MessageBox.Show("更新ファイルファイル‘HDATE.INI’が見つかりません羞福。!");
errorForm.ShowDialog();
}
//判斷VFREPORT.INI文件是否存在
if (!File.Exists(VFREPORT_FilePath))
{
MessageBox.Show("更新ファイルファイル‘VFREPORT.INI’が見つかりません蚯涮。坯临!");
errorForm.ShowDialog();
}
}
catch (Exception ex)
{
//日志記錄
log.WriteLog(ex.Message);
}
}
/// <summary>
/// 畫面輸入驗(yàn)證
/// </summary>
private void inputCheck()
{
try
{
if (Ed_GENGO.Text == "")
{
MessageBox.Show("新元號が未入力です焊唬!");
Ed_GENGO.Focus();
}
else if (Ed_GKIGO.Text == "")
{
MessageBox.Show("新元號記號が未入力です!");
Ed_GKIGO.Focus();
}
else if (Ed_GYY.Text == "")
{
MessageBox.Show("元號開始日が未入力です看靠!");
Ed_GYY.Focus();
}
else if (Ed_GDD.Text == "")
{
MessageBox.Show("元號開始日が未入力です赶促!");
Ed_GDD.Focus();
}
else if (Ed_GMM.Text == "")
{
MessageBox.Show("元號開始日が未入力です!");
Ed_GMM.Focus();
}
else
{
//驗(yàn)證輸入類型
string patternYY = @"^[0-9]{4}$";
string patternMD = @"^[0-9]{2}$";
string patternGengo = @"^[\u4e00-\u9fa5]{2}$";
string patternGkigo = @"^[a-zA-Z]$";
Match y = Regex.Match(this.Ed_GYY.Text, patternYY);
Match m = Regex.Match(this.Ed_GMM.Text, patternMD);
Match d = Regex.Match(this.Ed_GDD.Text, patternMD);
Match gengoMatch = Regex.Match(this.Ed_GENGO.Text, patternGengo);
Match gkigoMatch = Regex.Match(this.Ed_GKIGO.Text, patternGkigo);
if (!gengoMatch.Success)
{
MessageBox.Show("請輸入正確元號挟炬!");
this.Ed_GENGO.Text = null;
Ed_GENGO.Focus();
}
else if (!gkigoMatch.Success)
{
MessageBox.Show("請輸入正確元號符號鸥滨!");
this.Ed_GKIGO.Text = null;
Ed_GKIGO.Focus();
}
else if (!y.Success)
{
MessageBox.Show("請輸入正確年份!");
this.Ed_GYY.Text = null;
Ed_GYY.Focus();
}
else if (!m.Success)
{
MessageBox.Show("請輸入正確月份谤祖!");
this.Ed_GMM.Text = null;
Ed_GMM.Focus();
}
else if (!d.Success)
{
MessageBox.Show("請輸入正確日期婿滓!");
this.Ed_GDD.Text = null;
Ed_GDD.Focus();
}
}
}
catch (Exception ex)
{
//日志記錄
log.WriteLog(ex.Message);
}
}
/// <summary>
/// 備份ini文件
/// </summary>
private void backUpFiles()
{
try
{
//重命名ini文件并且備份到同一目錄下
//string nowTime = Ed_GYY.Text + Ed_GMM.Text + Ed_GDD.Text;
string newPM7_FileName = "「" + PM7_FileName.Substring(0, PM7_FileName.LastIndexOf('.')) + "_YYYYMMDD」";
string newHDATE_FileName = "「" + HDATE_FileName.Substring(0, HDATE_FileName.LastIndexOf('.')) + "_YYYYMMDD」";
string newVFREPORT_FileName = "「" + VFREPORT_FileName.Substring(0, VFREPORT_FileName.LastIndexOf('.')) + "_YYYYMMDD」";
//備份文件已存在則刪除
if (File.Exists(Application.StartupPath + "\\" + newPM7_FileName))
{
File.Delete(newPM7_FileName);
}
if (File.Exists(Application.StartupPath + "\\" + newHDATE_FileName))
{
File.Delete(newHDATE_FileName);
}
if (File.Exists(Application.StartupPath + "\\" + newVFREPORT_FileName))
{
File.Delete(newVFREPORT_FileName);
}
//文件備份
File.Copy(PM7_FileName, newPM7_FileName);
File.Copy(HDATE_FileName, newHDATE_FileName);
File.Copy(VFREPORT_FileName, newVFREPORT_FileName);
}
catch (Exception ex)
{
//日志記錄
log.WriteLog(ex.Message);
if (ex.Message.Contains("PM7"))
{
MessageBox.Show("PM7.INIファイルをバックアップに失敗しました!");
errorForm.ShowDialog();
}
if (ex.Message.Contains("HDATE"))
{
MessageBox.Show("HDATE.INIファイルをバックアップに失敗しました!");
errorForm.ShowDialog();
}
if (ex.Message.Contains("VFREPORT"))
{
MessageBox.Show("VFREPORT.INIファイルをバックアップに失敗しました!");
errorForm.ShowDialog();
}
}
}
#endregion
#region ini文件更新具體方法
/// <summary>
/// 設(shè)置PM7文件節(jié)點(diǎn)信息
/// </summary>
private void setPM7Info()
{
try
{
//獲取PMPPGEN.ini文件中JpnYears節(jié)點(diǎn)下所有key
List<string> jpnYearsKeys = ReadKeys(JpnYears_Section, PMPPGEN_FilePath);
//*** [JpnYears]域 ***//
for (int i = 0; i < jpnYearsKeys.Count; i++)
{
WritePrivateProfileString(JpnYears_Section, jpnYearsKeys[i], ContentValue(JpnYears_Section, jpnYearsKeys[i], PMPPGEN_FilePath), PM7_FilePath);
}
WritePrivateProfileString(JpnYears_Section, Ed_GENGO.Text, Ed_GYY.Text, PM7_FilePath);
//*** [WDATETIM]域 ***//
//獲取PMPPGEN.ini文件中WDATETIM節(jié)點(diǎn)下所有key
List<string> wdatetimKeys = ReadKeys(WDATETIM_Section, PMPPGEN_FilePath);
for (int i = 0; i < wdatetimKeys.Count; i++)
{
WritePrivateProfileString(WDATETIM_Section, wdatetimKeys[i], ContentValue(WDATETIM_Section, wdatetimKeys[i], PMPPGEN_FilePath), PM7_FilePath);
}
WritePrivateProfileString(WDATETIM_Section, Ed_GYY.Text, Ed_GKIGO.Text + Ed_GENGO.Text, PM7_FilePath);
//*** [cpGENGO]域 ***//
//獲取GENGO節(jié)點(diǎn)下所有key
List<string> gengoKeys = ReadKeys(GENGO_Section, PMPPGEN_FilePath);
WritePrivateProfileString(PM7_Section, gengoKeys[0], ContentValue(GENGO_Section, gengoKeys[0], PMPPGEN_FilePath) + "," + Ed_GENGO.Text, PM7_FilePath);
for (int i = 1; i < 4; i++)
{
WritePrivateProfileString(PM7_Section, gengoKeys[i], ContentValue(GENGO_Section, gengoKeys[i], PMPPGEN_FilePath), PM7_FilePath);
}
//獲取截至日期
string newEndYY = ContentValue(GENGO_Section, "NewEndYY", PMPPGEN_FilePath);
string newEndYMD = ContentValue(GENGO_Section, "NewEndYMD", PMPPGEN_FilePath);
string newChkS = ContentValue(GENGO_Section, "NewChkS", PMPPGEN_FilePath);
string newChkE = ContentValue(GENGO_Section, "NewChkE", PMPPGEN_FilePath);
string newInfo = Ed_GYY.Text + "," + newEndYY + "," + Ed_GYY.Text + Ed_GMM.Text + Ed_GDD.Text + "," + newEndYMD + "," + Ed_GKIGO.Text.ToUpper() + "," + Ed_GKIGO.Text.ToLower() + "," + newChkS + "," + newChkE;
WritePrivateProfileString(PM7_Section, Ed_GENGO.Text, newInfo, PM7_FilePath);
}
catch (Exception ex)
{
//日志記錄
log.WriteLog(ex.Message);
//更新失敗提示
MessageBox.Show("PM7.INIファイルを更新に失敗しました!");
//文件恢復(fù)處理
fileRecovery();
//錯誤提示
errorForm.ShowDialog();
}
}
/// <summary>
/// 設(shè)置HDATE文件中節(jié)點(diǎn)信息
/// </summary>
private void setHDATEInfo()
{
try
{
//獲取PMPPGEN文件信息
string pmppInfo = ContentValue(GENGO_Section, "NAME", PMPPGEN_FilePath);
string[] gengoName = pmppInfo.Split(',');
string[] infoArray = new string[3];
//*** 固定行更新 ****************************************************//
for (int i = 0; i < 3; i++)
{
infoArray[i] = ContentValue(GENGO_Section, gengoName[i], PMPPGEN_FilePath);
string[] newArray = infoArray[i].Split(',');
//開始年號
int startYear = Convert.ToInt16(newArray[2].Substring(0, 4)) - 1;
WritePrivateProfileString(HDATE_Section, gengo + (i + 1), gengoName[i], HDATE_FilePath);
WritePrivateProfileString(HDATE_Section, ryaku + (i + 1), newArray[4], HDATE_FilePath);
WritePrivateProfileString(HDATE_Section, startTime + (i + 1), newArray[2], HDATE_FilePath);
WritePrivateProfileString(HDATE_Section, endTime + (i + 1), newArray[3], HDATE_FilePath);
WritePrivateProfileString(HDATE_Section, nensa + (i + 1), startYear.ToString(), HDATE_FilePath);
}
//*** 最新行更新 ****************************************************//
int startYearEnd = Convert.ToInt16(Ed_GYY.Text) - 1;
WritePrivateProfileString(HDATE_Section, gengo + "4", Ed_GENGO.Text, HDATE_FilePath);
WritePrivateProfileString(HDATE_Section, ryaku + "4", Ed_GKIGO.Text, HDATE_FilePath);
WritePrivateProfileString(HDATE_Section, startTime + "4", Ed_GYY.Text + Ed_GMM.Text + Ed_GDD.Text, HDATE_FilePath);
WritePrivateProfileString(HDATE_Section, endTime + "4", ContentValue(GENGO_Section,"NewEndYMD",PMPPGEN_FilePath), HDATE_FilePath);
WritePrivateProfileString(HDATE_Section, nensa + "4", startYearEnd.ToString(), HDATE_FilePath);
}
catch (Exception ex)
{
//日志記錄
log.WriteLog(ex.Message);
//更新失敗提示
MessageBox.Show("HDATE.INIファイルファイルを更新に失敗しました!");
//文件恢復(fù)處理
fileRecovery();
//錯誤提示
errorForm.ShowDialog();
}
}
/// <summary>
/// 設(shè)置VFREPORT文件中節(jié)點(diǎn)信息
/// </summary>
private void setVFREPORTInfo()
{
try
{
//獲取PMPPGEN文件信息
string pmppInfo = ContentValue(GENGO_Section, "NAME", PMPPGEN_FilePath);
string[] gengoName = pmppInfo.Split(',');
int sectionSuffix = gengoName.Length;
string[] infoArray = new string[sectionSuffix];
string nengouValue;
//*** 固定行更新 ****************************************************//
for (int i = 0; i < 3; i++)
{
infoArray[i] = ContentValue(GENGO_Section, gengoName[i], PMPPGEN_FilePath);
nengouValue = gengoName[i] + infoArray[i].Split(',')[4] + " " + infoArray[i].Split(',')[3];
WritePrivateProfileString(VFREPORT_Section, nengou + (i + 1), nengouValue, VFREPORT_FilePath);
}
//*** 最新行更新 ****************************************************//
string updateInfo = Ed_GENGO.Text + Ed_GKIGO.Text.ToUpper() + " " + Ed_GYY.Text + Ed_GMM.Text + Ed_GDD.Text;
WritePrivateProfileString(VFREPORT_Section, nengou + "4", updateInfo, VFREPORT_FilePath);
}
catch (Exception ex)
{
//日志記錄
log.WriteLog(ex.Message);
//更新失敗提示
MessageBox.Show("VFREPORT.INIファイルファイルを更新に失敗しました!");
//文件恢復(fù)處理
fileRecovery();
//錯誤提示
errorForm.ShowDialog();
}
}
#endregion
#region 獲取ini文件相關(guān)信息具體方法
//根據(jù)節(jié)點(diǎn)對應(yīng)key值獲取value
private string ContentValue(string section, string key, string filePath)
{
StringBuilder temp = new StringBuilder(1024);
GetPrivateProfileString(section, key, "", temp, 1024, filePath);
return temp.ToString();
}
//根據(jù)節(jié)點(diǎn)和文件名獲取所有key
public List<string> ReadKeys(string SectionName, string iniFileName)
{
List<string> result = new List<string>();
Byte[] buf = new byte[65535];
int len = GetPrivateProfileStringA(SectionName, null, null, buf, buf.Length, iniFileName);
int j = 0;
for (int i = 0; i < len; i++)
{
if (buf[i] == 0)
{
result.Add(Encoding.Default.GetString(buf, j, i - j));
j = i + 1;
}
}
return result;
}
#endregion
#region 畫面自動校正相關(guān)事件
//元號驗(yàn)證事件
private void Ed_GENGO_Leave(object sender, EventArgs e)
{
}
//略號驗(yàn)證事件
private void Ed_GKIGO_Leave(object sender, EventArgs e)
{
Ed_GKIGO.Text = Ed_GKIGO.Text.ToUpper();
}
//年份驗(yàn)證事件
private void Ed_GYY_Leave(object sender, EventArgs e)
{
try
{
int yy = Convert.ToInt16(Ed_GYY.Text.Trim());
if (yy < 2019)
{
MessageBox.Show("當(dāng)前元號開始年小于前一元號開始年!");
}
}
catch (Exception)
{
}
}
//月份驗(yàn)證事件
private void Ed_GMM_Leave(object sender, EventArgs e)
{
try
{
int mm = Convert.ToInt16(Ed_GMM.Text.Trim());
if (mm > 12)
{
Ed_GMM.Text = "12";
}
}
catch (Exception)
{
}
}
//日期驗(yàn)證事件
private void Ed_GDD_Leave(object sender, EventArgs e)
{
try
{
int yy = Convert.ToInt16(Ed_GYY.Text.Trim());
int mm = Convert.ToInt16(Ed_GMM.Text.Trim());
int dd = Convert.ToInt16(Ed_GDD.Text.Trim());
if (mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12)
{
if (dd>31)
{
Ed_GDD.Text = "31";
}
}
if (mm == 4 ||mm == 6 ||mm == 9 ||mm == 11)
{
if (dd>30)
{
Ed_GDD.Text = "30";
}
}
if (mm==2)
{
if (yy % 4 == 0 && yy % 100 != 0 || yy % 400 == 0)
{
if (dd>29)
{
Ed_GDD.Text = "29";
}
}
else
{
if (dd > 28)
{
Ed_GDD.Text = "28";
}
}
}
}
catch (Exception)
{
}
}
#endregion
#region 文件恢復(fù)處理
/// <summary>
/// 文件恢復(fù)處理
/// </summary>
private void fileRecovery()
{
try
{
//文件更新異常粥喜,首先刪除文件
File.Delete(PM7_FilePath);
File.Delete(HDATE_FilePath);
File.Delete(VFREPORT_FilePath);
//重命名備份文件
Computer MyComputer = new Computer();
MyComputer.FileSystem.RenameFile("「PM7_YYYYMMDD」", "PM7.ini");
MyComputer.FileSystem.RenameFile("「HDATE_YYYYMMDD」", "HDATE.ini");
MyComputer.FileSystem.RenameFile("「VFREPORT_YYYYMMDD」", "VFREPORT.ini");
}
catch (Exception ex)
{
//日志記錄
log.WriteLog(ex.Message);
}
}
#endregion
}
}