C#遍历文件读取Word内容以及使用BackgroundWorker对象打造平滑进度条
下面來看看程序的具體實現步驟。
首先是讀取指定的目錄并遍歷其中的文件。這個功能很簡單,我們只需要通過一個foreach循環遍歷DirectoryInfo對象中的所有文件即可。在本例中,我們定義了一個文件夾選擇控件,當用戶點擊Select按鈕時彈出對話框用戶指定程序要遍歷的目錄,將目錄字符串存儲在文本框中。點擊Go按鈕時開始遍歷文件夾中的所有文件。程序將按行輸出目錄中Word文件名,不包含擴展名。
1?using System;2?using System.Collections.Generic;
3?using System.ComponentModel;
4?using System.Data;
5?using System.Drawing;
6?using System.Linq;
7?using System.Text;
8?using System.Windows.Forms;
9?using System.IO;
10?
11?namespace ListFileName
12?{
13???? public?partial?class ListFileName : Form
14???? {
15???????? protected DirectoryInfo dirFolder =?null;
16?
17???????? public ListFileName()
18???????? {
19???????????? InitializeComponent();
20???????? }
21?
22???????? private?void SelectPath()
23???????? {
24???????????? if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
25???????????? {
26???????????????? this.tbPath.Text = folderBrowserDialog.SelectedPath;
27???????????? }
28???????? }
29?
30???????? // Double click the path textbox to open the folder browser dialog.
31???????? private?void tbPath_DoubleClick(object sender, EventArgs e)
32???????? {
33???????????? SelectPath();
34???????? }
35?
36???????? // Open the folder browser dialog.
37???????? private?void btSelect_Click(object sender, EventArgs e)
38???????? {
39???????????? SelectPath();
40???????? }
41?
42???????? // Start to run.
43???????? private?void btGo_Click(object sender, EventArgs e)
44???????? {
45???????????? this.btGo.Enabled =?this.btSelect.Enabled =?this.tbPath.Enabled =?false;
46???????????? this.tbOutput.Text =?"";
47???????????? string folderPath =?this.tbPath.Text.Trim();
48?
49???????????? if (folderPath.Length ==?0?||?!Directory.Exists(folderPath))
50???????????? {
51???????????????? MessageBox.Show("Please select a valid folder.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
52???????????????? return;
53???????????? }
54???????????? dirFolder =?new DirectoryInfo(folderPath);
55?
56???????????? //Traversing file
57???????????? foreach (FileInfo file in dirFolder.GetFiles())
58???????????? {
59???????????????? // if the file type is word and not the word temp file.
60???????????????? if (file.Extension.IndexOf("doc") >?0?&& file.Name.IndexOf("~$") <?0)
61???????????????? {
62???????????????????? this.tbOutput.Text += file.Name.Substring(0, file.Name.LastIndexOf('.')).Trim() +=?"\r\n";
63???????????????? }
64???????????? }
65?
66???????????? if (this.tbOutput.Text.Length >?2)
67???????????? {
68???????????????? this.tbOutput.Text =?this.tbOutput.Text.Substring(0, this.tbOutput.Text.Length -?2);
69???????????? }
70?
71???????????? this.btGo.Enabled =?this.btSelect.Enabled =?this.tbPath.Enabled =?false;
72???????? }????????
73???? }
74?}
然后是增加讀取Word文件的功能。這個需要使用COM組件,在工程中添加對Word COM組件的引用。
程序只選擇讀取Word文件的前三行,下面是具體的代碼。 ?1?using?Word?=?Microsoft.Office.Interop.Word;?2?
?3?protected?Word.Application?app?=?null;
?4?protected?Word.Document?doc?=?null;
?5?
?6?private?string?ReadTextFromWord(object?fileName)
?7?{
?8?????string?sRst?=?string.Empty;
?9?????object?isReadOnly?=?true;
10?????object?unknow?=?Type.Missing;
11?????app.Visible?=?false;
12?
13?????if?(app?!=?null)
14?????{
15?
16?????????try
17?????????{
18?????????????//?Open?a?word?document?with?read?only?mode.
19?????????????doc?=?app.Documents.Open(ref?fileName,
20??????????????????????????????????????ref?unknow,?ref?isReadOnly,?ref?unknow,?ref?unknow,?ref?unknow,
21??????????????????????????????????????ref?unknow,?ref?unknow,?ref?unknow,?ref?unknow,?ref?unknow,
22??????????????????????????????????????ref?unknow,?ref?unknow,?ref?unknow,?ref?unknow,?ref?unknow);
23?
24?????????????//?Read?the?second?paragraph?text?-?Production's?Engligh?name.
25?????????????sRst?=?(doc.Paragraphs.Count?>?1???doc.Paragraphs[2].Range.Text.Trim()?:?"")?+?"\t";
26?????????????//?Read?the?third?paragraph?text?-?Production's?Chinese?name.
27?????????????sRst?+=?(doc.Paragraphs.Count?>?2???doc.Paragraphs[3].Range.Text.Trim()?:?"")?+?"\t";
28?????????}
29?????????catch?(Exception)
30?????????{
31?????????}
32?????????finally
33?????????{
34?????????????//?Close?opened?word?document.
35?????????????app.ActiveDocument.Close(ref?unknow,?ref?unknow,?ref?unknow);
36?????????}
37?????}
38?
39?????return?sRst;
40?}
注意打開Word文檔時可以以只讀方式打開,這樣打開的速度會稍微快一點,并且關閉的時候不會出現是否保存文件的對話框。任何情況下只要打開了Word文檔,一定記住使用完后要將其關閉,并且在退出程序時也要將Word進程一并關掉。
?1?//?Kill?the?word?process?when?closed?main?form.?2?private?void?ListFileName_FormClosed(object?sender,?FormClosedEventArgs?e)
?3?{
?4?????if?(app?!=?null)
?5?????{
?6?????????object?unknow?=?Type.Missing;
?7?????????object?saveChanges?=?Word.WdSaveOptions.wdDoNotSaveChanges;
?8?????????app.Quit(ref?saveChanges,?ref?unknow,?ref?unknow);
?9?????}
10?}
最后再來看看如何實現平滑進度條。這個需要使用到BackgroundWorker對象,該對象允許程序在多線程下執行,我們可以將界面UI和后臺線程分開,這樣當程序在執行一個時間較長的任務時不會導致主界面處于等待狀態,用戶仍然可以操作主界面上的元素,使程序看起來比較平滑。BackgroundWorker對象定義了一些屬性和委托用來處理多線程間的信息同步,諸如后臺線程在執行過程中如何通知主界面的線程更新進度條值等。
1?Application.EnableVisualStyles();2?
3?worker.WorkerReportsProgress?=?true;
4?
5?worker.DoWork?+=?new?DoWorkEventHandler(worker_DoWork);
6?worker.ProgressChanged?+=?new?ProgressChangedEventHandler(worker_ProgressChanged);
7?worker.RunWorkerCompleted?+=?new?RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
在work_DoWork中調用具體執行的方法,worker_ProgressChanged方法用來實時更新進度條值,worker_RunWorkerCompleted方法用來處理當后臺線程執行完操作后要處理的事情,如更新界面UI,將進度條的當前值更改為100%等。可以看看下面完整的程序代碼:
ListFileName ??1?using?System;??2?using?System.Collections.Generic;
??3?using?System.ComponentModel;
??4?using?System.Data;
??5?using?System.Drawing;
??6?using?System.Linq;
??7?using?System.Text;
??8?using?System.Windows.Forms;
??9?using?System.IO;
?10?using?Word?=?Microsoft.Office.Interop.Word;
?11?
?12?namespace?ListFileName
?13?{
?14?????public?partial?class?ListFileName?:?Form
?15?????{
?16?????????protected?BackgroundWorker?worker?=?new?BackgroundWorker();
?17?????????protected?Word.Application?app?=?null;
?18?????????protected?Word.Document?doc?=?null;
?19?
?20?????????protected?DirectoryInfo?dirFolder?=?null;
?21?????????protected?int?iFileCount?=?0;
?22?????????protected?string?output?=?string.Empty;
?23?
?24?????????public?ListFileName()
?25?????????{
?26?????????????InitializeComponent();
?27?????????????Application.EnableVisualStyles();
?28?
?29?????????????worker.WorkerReportsProgress?=?true;
?30?
?31?????????????worker.DoWork?+=?new?DoWorkEventHandler(worker_DoWork);
?32?????????????worker.ProgressChanged?+=?new?ProgressChangedEventHandler(worker_ProgressChanged);
?33?????????????worker.RunWorkerCompleted?+=?new?RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
?34?????????}
?35?
?36?????????#region?Private?methods
?37?????????private?void?SelectPath()
?38?????????{
?39?????????????if?(folderBrowserDialog.ShowDialog()?==?DialogResult.OK)
?40?????????????{
?41?????????????????this.tbPath.Text?=?folderBrowserDialog.SelectedPath;
?42?????????????}
?43?????????}
?44?
?45?????????private?string?ReadTextFromWord(object?fileName)
?46?????????{
?47?????????????string?sRst?=?string.Empty;
?48?????????????object?isReadOnly?=?true;
?49?????????????object?unknow?=?Type.Missing;
?50?????????????app.Visible?=?false;
?51?
?52?????????????if?(app?!=?null)
?53?????????????{
?54?
?55?????????????????try
?56?????????????????{
?57?????????????????????//?Open?a?word?document?with?read?only?mode.
?58?????????????????????doc?=?app.Documents.Open(ref?fileName,
?59??????????????????????????????????????????????ref?unknow,?ref?isReadOnly,?ref?unknow,?ref?unknow,?ref?unknow,
?60??????????????????????????????????????????????ref?unknow,?ref?unknow,?ref?unknow,?ref?unknow,?ref?unknow,
?61??????????????????????????????????????????????ref?unknow,?ref?unknow,?ref?unknow,?ref?unknow,?ref?unknow);
?62?
?63?????????????????????//?Read?the?second?paragraph?text?-?Production's?Engligh?name.
?64?????????????????????sRst?=?(doc.Paragraphs.Count?>?1???doc.Paragraphs[2].Range.Text.Trim()?:?"")?+?"\t";
?65?????????????????????//?Read?the?third?paragraph?text?-?Production's?Chinese?name.
?66?????????????????????sRst?+=?(doc.Paragraphs.Count?>?2???doc.Paragraphs[3].Range.Text.Trim()?:?"")?+?"\t";
?67?????????????????}
?68?????????????????catch?(Exception)
?69?????????????????{
?70?????????????????}
?71?????????????????finally
?72?????????????????{
?73?????????????????????//?Close?opened?word?document.
?74?????????????????????app.ActiveDocument.Close(ref?unknow,?ref?unknow,?ref?unknow);
?75?????????????????}
?76?????????????}
?77?
?78?????????????return?sRst;
?79?????????}
?80?
?81?????????private?int?DoWorkAsync(int?start,?BackgroundWorker?worker,?DoWorkEventArgs?e)
?82?????????{
?83?????????????string?folderPath?=?this.tbPath.Text.Trim();
?84?????????????int?percentComplete?=?0;
?85?
?86?????????????//Traversing?file
?87?????????????foreach?(FileInfo?file?in?dirFolder.GetFiles())
?88?????????????{
?89?????????????????start++;
?90?????????????????percentComplete++;
?91?????????????????//?if?the?file?type?is?word?and?not?the?word?temp?file.
?92?????????????????if?(file.Extension.IndexOf("doc")?>?0?&&?file.Name.IndexOf("~$")?<?0)
?93?????????????????{
?94?????????????????????output?+=?file.Name.Substring(0,?file.Name.LastIndexOf('.')).Trim();
?95?????????????????????//?If?allow?to?read?word?file
?96?????????????????????if?(this.chkReadWord.Checked)
?97?????????????????????{
?98?????????????????????????output?+=?"\t"?+?ReadTextFromWord(file.FullName);?//?Read?from?word.
?99?????????????????????}
100?????????????????????output?+=?"\r\n";
101?????????????????}
102?????????????????
103?????????????????//?Update?processbar?value.
104?????????????????worker.ReportProgress(percentComplete?%?iFileCount);
105?????????????}
106?
107?????????????if?(output.Length?>?2)
108?????????????{
109?????????????????output?=?output.Substring(0,?output.Length?-?2);
110?????????????}
111?
112?????????????return?start;
113?????????}
114?????????#endregion
115?
116?????????#region?Events
117?
118?????????void?worker_RunWorkerCompleted(object?sender,?RunWorkerCompletedEventArgs?e)
119?????????{
120?????????????this.tbPath.Enabled?=?this.btSelect.Enabled?=?this.btGo.Enabled?=?true;
121?????????????progressBar.Value?=?iFileCount;
122?
123?????????????if?(e.Error?!=?null)
124?????????????{
125?????????????????this.lblHint.Text?=?e.Error.Message;
126?????????????}
127?????????????else
128?????????????{
129?????????????????this.lblHint.Text?=?"Complete!";
130?????????????????MessageBox.Show("Complete!",?"Ok",?MessageBoxButtons.OK,?MessageBoxIcon.Information);
131?????????????}
132?????????}
133?
134?????????//?Update?processbar?value.
135?????????void?worker_ProgressChanged(object?sender,?ProgressChangedEventArgs?e)
136?????????{
137?????????????progressBar.Value?=?e.ProgressPercentage;
138?????????????this.tbOutput.Text?=?output;
139?????????}
140?
141?????????void?worker_DoWork(object?sender,?DoWorkEventArgs?e)
142?????????{
143?????????????int?start?=?(int)e.Argument;
144?????????????e.Result?=?DoWorkAsync(start,?(BackgroundWorker)sender,?e);
145?????????}
146?
147?????????//?Double?click?the?path?textbox?to?open?the?folder?browser?dialog.
148?????????private?void?tbPath_DoubleClick(object?sender,?EventArgs?e)
149?????????{
150?????????????SelectPath();
151?????????}
152?
153?????????//?Open?the?folder?browser?dialog.
154?????????private?void?btSelect_Click(object?sender,?EventArgs?e)
155?????????{
156?????????????SelectPath();
157?????????}
158?
159?????????//?Start?to?run.
160?????????private?void?btGo_Click(object?sender,?EventArgs?e)
161?????????{
162?????????????this.btGo.Enabled?=?this.btSelect.Enabled?=?this.tbPath.Enabled?=?false;
163?
164?????????????if?(app?==?null?&&?chkReadWord.Checked)
165?????????????{
166?????????????????app?=?new?Microsoft.Office.Interop.Word.Application();
167?????????????}
168?????????????this.tbOutput.Text?=?output?=?"";
169?????????????string?folderPath?=?this.tbPath.Text.Trim();
170?
171?????????????if?(folderPath.Length?==?0?||?!Directory.Exists(folderPath))
172?????????????{
173?????????????????MessageBox.Show("Please?select?a?valid?folder.",?"Error",?MessageBoxButtons.OK,?MessageBoxIcon.Error);
174?????????????????return;
175?????????????}
176?????????????dirFolder?=?new?DirectoryInfo(folderPath);
177?????????????this.progressBar.Maximum?=?iFileCount?=?dirFolder.GetFiles().Count();
178?????????????this.progressBar.Value?=?0;????????????
179?????????????this.lblHint.Text?=?"Please?wait,?processing...";
180?????????????this.lblHint.Visible?=?progressBar.Visible?=?true;
181?????????????worker.RunWorkerAsync(0);
182?
183?????????????//this.tbOutput.Text?=?"";
184?????????????//DirectoryInfo?dirFolder?=?new?DirectoryInfo(folderPath);
185?
186?????????????////Traversing?file
187?????????????//foreach?(FileInfo?file?in?dirFolder.GetFiles())
188?????????????//{
189?????????????//????//?if?the?file?type?is?word.
190?????????????//????if?(file.Extension.IndexOf("doc")?>?0?&&?file.Name.IndexOf("~$")?<?0)
191?????????????//????{
192?????????????//????????this.tbOutput.Text?+=?file.Name.Substring(0,?file.Name.LastIndexOf('.')).Trim()?+?"\t"?+?ReadTextFromWord(file.FullName);
193?????????????//????}
194?
195?????????????//????this.tbOutput.Text?+=?"\r\n";
196?????????????//}
197?????????}
198?
199?????????//?Select?all?in?output?textbox.
200?????????private?void?tbOutput_KeyDown(object?sender,?KeyEventArgs?e)
201?????????{
202?????????????if?(e.Control?&&?e.KeyValue?==?65)
203?????????????{
204?????????????????this.tbOutput.SelectAll();
205?????????????}
206?????????}
207?
208?????????//?Kill?the?word?process?when?closed?main?form.
209?????????private?void?ListFileName_FormClosed(object?sender,?FormClosedEventArgs?e)
210?????????{
211?????????????if?(app?!=?null)
212?????????????{
213?????????????????object?unknow?=?Type.Missing;
214?????????????????object?saveChanges?=?Word.WdSaveOptions.wdDoNotSaveChanges;
215?????????????????app.Quit(ref?saveChanges,?ref?unknow,?ref?unknow);
216?????????????}
217?????????}
218?????????#endregion
219?????}
220?}
完整代碼下載
總結
以上是生活随笔為你收集整理的C#遍历文件读取Word内容以及使用BackgroundWorker对象打造平滑进度条的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BootLoader引导程序制作及移植(
- 下一篇: maven 生成 xml