2012年11月13日 星期二

C# winform 讀文字檔、改格式、存檔

今天做了一個小東西,讀純文字檔、改格式後原檔名加上 _new另存,有附檔。
畫面如下,其中的"選擇存檔位置"和他下面的textbox、跟"儲存"這三個物件的enable都是false,上傳檔案格式正確才改成true,同時這三個物件的Anchor屬性都設成left、bottom,因為我們要讓Form和Textbox跟著讀入的資料行數一起變長。
首先要先加這個
using System.IO;
其中if的判斷是因為當使用者點了選擇檔案,卻沒有選擇檔案直接按取消時(此時檔案路徑為null),會導致openFileDialog產生"空白路徑不合法"的錯誤,所以在前面先做一個判斷避免掉這個錯誤。

                txtShowResult.Height += 10;
                this.Height += 10;

這兩行則是當每讀一行,textbox跟form就會多10px,這樣視窗會跟著讀入的行數變化,稍稍好看一些些。

        string strUploadPath = " ";//上傳路徑
        string strSavePath = " ";//儲存路徑
        string strFileName = " ";//檔案名稱
        string strContent = " ";//檔案內容

        public Form1()
        {
            InitializeComponent();
        }

        private void btnSelectPath_Click(object sender, EventArgs e)
        {
            ClearAll();
            openFileDialog1.Filter = "純文字檔(*.txt)|*.txt";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                strUploadPath = openFileDialog1.FileName;
                strFileName = Path.GetFileNameWithoutExtension(openFileDialog1.FileName);
            }
            else
            {
                return;
            }
            Encoding big5 = Encoding.GetEncoding(950);

            StreamReader sr_txt = new StreamReader(strUploadPath, Encoding.Default);
            while (!sr_txt.EndOfStream)
            {
                string line = sr_txt.ReadLine();
                byte[] data = big5.GetBytes(line.Trim('\r'));
                if (data.Length != 80)
                {
                    MessageBox.Show("檔案內容錯誤,請重新選擇正確的檔案");
                    return;
                }
                else
                {
                    string CARDNO = big5.GetString(data, 0, 2).Trim() + "3";//卡別
                    string OFFNO = big5.GetString(data, 3, 7).Trim();//受託局號
                    string SPACE1 = "      ";//6個空白
                    string GIRONO = big5.GetString(data, 16, 8).Trim();//劃撥帳號
                    string PAYDAY = "1" + big5.GetString(data, 24, 6).Trim();//轉存日期
                    string ACCTOFF = big5.GetString(data, 30, 7).Trim();//立帳局號
                    string ACCTNO = big5.GetString(data, 37, 7).Trim();//立帳帳號
                    string IDNO = big5.GetString(data, 44, 10).Trim();//身分證字號
                    string NETPAY = "0" + big5.GetString(data, 54, 6).Trim();//轉存金額
                    string SPACE2 = "                  ";//18個空白
                    line = CARDNO + OFFNO + SPACE1 + GIRONO + PAYDAY + ACCTOFF + ACCTNO + IDNO + NETPAY + SPACE2;
                    strContent += line + Environment.NewLine;
                }
                txtShowResult.Height += 10;
                this.Height += 10;
            }
            btnSave.Enabled = true;
            btnSavePath.Enabled = true;
            txtSavePath.Enabled = true;
            txtShowResult.Text = strContent;
            sr_txt.Close();
            sr_txt.Dispose();
        }
但不能直接改form的長寬,要先設定,所以要加入這段,把form的長寬抓出來。
        private void Form1_Load(object sender, EventArgs e)
        {
            //抓解析度
            int Height = Screen.PrimaryScreen.Bounds.Height;
            int Width = Screen.PrimaryScreen.Bounds.Width;
            // 設定 Form Size
            this.Width = Width;
            this.Height = Height;
        }
選擇存檔位置,檔名用原檔名加上 _new 表示,其中C#是用 "\\"表示單斜線 \
        private void btnSavePath_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog path = new FolderBrowserDialog();
            path.ShowDialog();
            if (path.SelectedPath != "")
                strSavePath = path.SelectedPath + "\\" + strFileName + "_new.txt";
            this.txtSavePath.Text = path.SelectedPath;
        }
存檔時為避免錯誤做了一些判斷,System.IO.File.Exists(檔案路徑)是用來判斷該路徑存不存在檔案的,如果不做檔案是否存在的判斷的話他會一直往下加,所以當檔案存在時,用File.WriteAllText做覆蓋,反之如檔案不存在時適用AppenAllText。
private void btnSave_Click(object sender, EventArgs e)
        {
            if (txtSavePath.Text == "")
            {
                MessageBox.Show("請選擇路徑");
                return;
            }            
            try
            {
                if (System.IO.File.Exists(strSavePath))
                {
                    //檢查檔案是否已存在
                    DialogResult myResult = MessageBox.Show("檔案已存在,是否覆蓋?", "檔案已存在", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (myResult == DialogResult.Yes)
                    {
                        File.WriteAllText(strSavePath, strContent);//已存在則覆蓋
                        MessageBox.Show("儲存成功!");
                        ClearAll();
                    }
                    else if (myResult == DialogResult.No)
                    {
                        MessageBox.Show("已取消,請重新選擇位置!");
                    }
                }
                else
                {
                    File.AppendAllText(strSavePath, strContent);
                    MessageBox.Show("儲存成功!");
                    ClearAll();
                }
            }
            catch
            {
                MessageBox.Show("儲存失敗!");
                ClearAll();
            }
        }
為了更直覺也讓畫面更整齊加入的ClearAll,在清除畫面的同時把長度預設回原本的樣子,比較符合使用上的感覺。
        private void ClearAll()
        {
            strUploadPath = "";
            strSavePath = "";
            strFileName = "";
            strContent = "";
            txtSavePath.Text = "";
            txtShowResult.Text = "";
            this.Height = 230;
            txtShowResult.Height = 25;
        }
附件如下,測試檔案也在裡面,測試檔案中的文字都是亂打的,沒有隱私問題。
附件下載

沒有留言:

張貼留言