返回
前端
分类

去除代码的SourceSafe管理,  首先是读取指定的目录并遍历其中的文件

日期: 2020-03-13 22:15 浏览次数 : 63

用C#去除代码的SourceSafe管理

                                                获取当前文件夹下的所有空文件夹路径信息

  本文将给出一个实例用于介绍如何利用C#遍历目录中的文件并打印Word文件中的内容,同时在界面上利用一个相对平滑的进度条来显示文件处理的情况。下面是程序运行时的截图:

作者:秋枫

  1必赢备用网址 1using System;
  2必赢备用网址 2using System.Drawing;
  3必赢备用网址 3using System.Collections;
  4必赢备用网址 4using System.ComponentModel;
  5必赢备用网址 5using System.Windows.Forms;
  6必赢备用网址 6using System.Data;
  7必赢备用网址 7using System.IO;
  8必赢备用网址 8
  9必赢备用网址 9namespace 删除空文件夹
 10必赢备用网址 10必赢备用网址 11必赢备用网址 12{
 11必赢备用网址 13必赢备用网址 14    /**//// <summary>
 12必赢备用网址 15    /// Form1 的摘要说明。
 13必赢备用网址 16    /// </summary>
 14必赢备用网址 17    public class Form1 : System.Windows.Forms.Form
 15必赢备用网址 18必赢备用网址 19    必赢备用网址 20{
 16必赢备用网址 21        private System.Windows.Forms.Button button1;
 17必赢备用网址 22        private System.Windows.Forms.RichTextBox richTextBox1;
 18必赢备用网址 23必赢备用网址 24        /**//// <summary>
 19必赢备用网址 25        /// 必需的设计器变量。
 20必赢备用网址 26        /// </summary>
 21必赢备用网址 27        private System.ComponentModel.Container components = null;
 22必赢备用网址 28
 23必赢备用网址 29        public Form1()
 24必赢备用网址 30必赢备用网址 31        必赢备用网址 32{
 25必赢备用网址 33            //
 26必赢备用网址 34            // Windows 窗体设计器支持所必需的
 27必赢备用网址 35            //
 28必赢备用网址 36            InitializeComponent();
 29必赢备用网址 37
 30必赢备用网址 38            //
 31必赢备用网址 39            // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
 32必赢备用网址 40            //
 33必赢备用网址 41        }
 34必赢备用网址 42
 35必赢备用网址 43必赢备用网址 44        /**//// <summary>
 36必赢备用网址 45        /// 清理所有正在使用的资源。
 37必赢备用网址 46        /// </summary>
 38必赢备用网址 47        protected override void Dispose( bool disposing )
 39必赢备用网址 48必赢备用网址 49        必赢备用网址 50{
 40必赢备用网址 51            if( disposing )
 41必赢备用网址 52必赢备用网址 53            必赢备用网址 54{
 42必赢备用网址 55                if (components != null) 
 43必赢备用网址 56必赢备用网址 57                必赢备用网址 58{
 44必赢备用网址 59                    components.Dispose();
 45必赢备用网址 60                }
 46必赢备用网址 61            }
 47必赢备用网址 62            base.Dispose( disposing );
 48必赢备用网址 63        }
 49必赢备用网址 64
 50必赢备用网址 65必赢备用网址 66        Windows 窗体设计器生成的代码#region Windows 窗体设计器生成的代码
 51必赢备用网址 67必赢备用网址 68        /**//// <summary>
 52必赢备用网址 69        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
 53必赢备用网址 70        /// 此方法的内容。
 54必赢备用网址 71        /// </summary>
 55必赢备用网址 72        private void InitializeComponent()
 56必赢备用网址 73必赢备用网址 74        必赢备用网址 75{
 57必赢备用网址 76            this.button1 = new System.Windows.Forms.Button();
 58必赢备用网址 77            this.richTextBox1 = new System.Windows.Forms.RichTextBox();
 59必赢备用网址 78            this.SuspendLayout();
 60必赢备用网址 79            // 
 61必赢备用网址 80            // button1
 62必赢备用网址 81            // 
 63必赢备用网址 82            this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
 64必赢备用网址 83            this.button1.Location = new System.Drawing.Point(568, 24);
 65必赢备用网址 84            this.button1.Name = "button1";
 66必赢备用网址 85            this.button1.Size = new System.Drawing.Size(128, 48);
 67必赢备用网址 86            this.button1.TabIndex = 0;
 68必赢备用网址 87            this.button1.Text = "button1";
 69必赢备用网址 88            this.button1.Click += new System.EventHandler(this.button1_Click);
 70必赢备用网址 89            // 
 71必赢备用网址 90            // richTextBox1
 72必赢备用网址 91            // 
 73必赢备用网址 92            this.richTextBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
必赢备用网址 , 74必赢备用网址 93                | System.Windows.Forms.AnchorStyles.Left) 
 75必赢备用网址 94                | System.Windows.Forms.AnchorStyles.Right)));
 76必赢备用网址 95            this.richTextBox1.Location = new System.Drawing.Point(40, 32);
 77必赢备用网址 96            this.richTextBox1.Name = "richTextBox1";
 78必赢备用网址 97            this.richTextBox1.Size = new System.Drawing.Size(504, 440);
 79必赢备用网址 98            this.richTextBox1.TabIndex = 1;
 80必赢备用网址 99            this.richTextBox1.Text = "";
 81必赢备用网址 100            // 
 82必赢备用网址 101            // Form1
 83必赢备用网址 102            // 
 84必赢备用网址 103            this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
 85必赢备用网址 104            this.ClientSize = new System.Drawing.Size(704, 502);
 86必赢备用网址 105            this.Controls.Add(this.richTextBox1);
 87必赢备用网址 106            this.Controls.Add(this.button1);
 88必赢备用网址 107            this.Name = "Form1";
 89必赢备用网址 108            this.Text = "Form1";
 90必赢备用网址 109            this.ResumeLayout(false);
 91必赢备用网址 110
 92必赢备用网址 111        }
 93必赢备用网址 112        #endregion
 94必赢备用网址 113
 95必赢备用网址 114必赢备用网址 115        /**//// <summary>
 96必赢备用网址 116        /// 应用程序的主入口点。
 97必赢备用网址 117        /// </summary>
 98必赢备用网址 118        [STAThread]
 99必赢备用网址 119        static void Main() 
100必赢备用网址 120必赢备用网址 121        必赢备用网址 122{
101必赢备用网址 123            Application.Run(new Form1());
102必赢备用网址 124        }
103必赢备用网址 125        //遍历当前文件夹下的空文件夹(包括它的下一级文件夹)
104必赢备用网址 126        private void SearchDirectoryEmptyFolder(string  targetDirectory ) 
105必赢备用网址 127必赢备用网址 128        必赢备用网址 129{
106必赢备用网址 130            if (Directory.Exists(targetDirectory))
107必赢备用网址 131必赢备用网址 132            必赢备用网址 133{
108必赢备用网址 134                DirectoryInfo di = new DirectoryInfo(targetDirectory);
109必赢备用网址 135                if( DirSize(di)== 0)
110必赢备用网址 136必赢备用网址 137                必赢备用网址 138{
111必赢备用网址 139
112必赢备用网址 140                    //    ' Empty folder 
113必赢备用网址 141                    w1++;
114必赢备用网址 142                    this.richTextBox1.Text +=w1.ToString()+  ("Folder " + targetDirectory +" is emptyn") ;
115必赢备用网址 143                }
116必赢备用网址 144                else
117必赢备用网址 145必赢备用网址 146                必赢备用网址 147{
118必赢备用网址 148                    //' Recurse subdirectories of this directory 
119必赢备用网址 149                    //string  subdirectory ="";
120必赢备用网址 150                    string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory) ;
121必赢备用网址 151                    foreach( string subdirectory in subdirectoryEntries )
122必赢备用网址 152必赢备用网址 153                    必赢备用网址 154{
123必赢备用网址 155                        //this.richTextBox1.Text +=("Folder is " + subdirectory+"n") ;
124必赢备用网址 156                        SearchDirectoryEmptyFolder(subdirectory) ;
125必赢备用网址 157                    }
126必赢备用网址 158                }
127必赢备用网址 159            }
128必赢备用网址 160        }
129必赢备用网址 161        //遍历当前文件夹下的所有文件信息(包括它的下一级文件夹)
130必赢备用网址 162        public static void DirSearch(DirectoryInfo d) 
131必赢备用网址 163必赢备用网址 164        必赢备用网址 165{
132必赢备用网址 166            //get the current directory files information
133必赢备用网址 167            FileInfo[] files =  d.GetFiles();
134必赢备用网址 168            Console.WriteLine("Total number of txt files:{0}",files.Length);
135必赢备用网址 169            foreach(FileInfo f in files)
136必赢备用网址 170必赢备用网址 171            必赢备用网址 172{
137必赢备用网址 173                Console.WriteLine("Name is : {0}", f.Name);
138必赢备用网址 174                Console.WriteLine("Length of the file is : {0}", f.Length);
139必赢备用网址 175                Console.WriteLine("Creation time is : {0}", f.CreationTime);
140必赢备用网址 176                Console.WriteLine("the path of the file: {0}",f.FullName);
141必赢备用网址 177                Console.WriteLine("Attributes of the file are : {0}",
142必赢备用网址 178                    f.Attributes.ToString());
143必赢备用网址 179            }
144必赢备用网址 180            
145必赢备用网址 181            // recursion transfer get the next directory information
146必赢备用网址 182            DirectoryInfo[] dis = d.GetDirectories();
147必赢备用网址 183            foreach (DirectoryInfo di in dis)
148必赢备用网址 184必赢备用网址 185            必赢备用网址 186{
149必赢备用网址 187                DirSearch(di);
150必赢备用网址 188            }
151必赢备用网址 189        }
152必赢备用网址 190
153必赢备用网址 191
154必赢备用网址 192        int w1=0;
155必赢备用网址 193        //遍历当前文件夹下的所有文件夹名(包括它的下一级文件夹))
156必赢备用网址 194        private void SearchDirectoryFolder(string  targetDirectory ) 
157必赢备用网址 195必赢备用网址 196        必赢备用网址 197{
158必赢备用网址 198            if (Directory.Exists(targetDirectory))
159必赢备用网址 199必赢备用网址 200            必赢备用网址 201{
160必赢备用网址 202                if( Directory.GetFileSystemEntries(targetDirectory).Length == 0)
161必赢备用网址 203必赢备用网址 204                必赢备用网址 205{
162必赢备用网址 206                    //Empty folder 
163必赢备用网址 207                    w1++;
164必赢备用网址 208                    this.richTextBox1.Text +=w1.ToString()+  ("Folder " + targetDirectory +" is emptyn") ;
165必赢备用网址 209                }
166必赢备用网址 210                else
167必赢备用网址 211必赢备用网址 212                必赢备用网址 213{
168必赢备用网址 214                    //' Recurse subdirectories of this directory 
169必赢备用网址 215                    string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory) ;
170必赢备用网址 216                    foreach( string subdirectory in subdirectoryEntries )
171必赢备用网址 217必赢备用网址 218                    必赢备用网址 219{
172必赢备用网址 220                        //this.richTextBox1.Text +=("Folder is " + subdirectory+"n") ;
173必赢备用网址 221                        SearchDirectoryFolder(subdirectory) ;
174必赢备用网址 222                    }
175必赢备用网址 223                }
176必赢备用网址 224            }
177必赢备用网址 225        }
178必赢备用网址 226
179必赢备用网址 227        private void button1_Click(object sender, System.EventArgs e)
180必赢备用网址 228必赢备用网址 229        必赢备用网址 230{
181必赢备用网址 231            this.richTextBox1.Text =""; 
182必赢备用网址 232    
183必赢备用网址 233            //SearchDirectoryFolder(@"c:CarArchives");
184必赢备用网址 234            //DirectoryInfo di = new DirectoryInfo(@"c:CarArchives");
185必赢备用网址 235            //long i=DirSize(di)/1024;
186必赢备用网址 236            //this.richTextBox1.Text = (i.ToString()+"KB" ) ;
187必赢备用网址 237            //SearchDirectoryEmptyFolder(@"c:CarArchives");
188必赢备用网址 238            //ProcessDirectory(@"c:CarArchives");
189必赢备用网址 239            PrintFileSystemEntries(@"c:CarArchives2005");
190必赢备用网址 240        }
191必赢备用网址 241
192必赢备用网址 242        
193必赢备用网址 243
194必赢备用网址 244        //计算当前文件夹的大小(包括它的下一级文件夹)
195必赢备用网址 245        public  long DirSize(DirectoryInfo d) 
196必赢备用网址 246必赢备用网址 247        必赢备用网址 248{    
197必赢备用网址 249            long Size = 0;    
198必赢备用网址 250            // Add file sizes.
199必赢备用网址 251            FileInfo[] fis = d.GetFiles();
200必赢备用网址 252            foreach (FileInfo fi in fis) 
201必赢备用网址 253必赢备用网址 254            必赢备用网址 255{      
202必赢备用网址 256                Size +=fi.Length; ;
203必赢备用网址 257            }
204必赢备用网址 258            // Add subdirectory sizes.
205必赢备用网址 259            DirectoryInfo[] dis = d.GetDirectories();
206必赢备用网址 260            foreach (DirectoryInfo di in dis) 
207必赢备用网址 261必赢备用网址 262            必赢备用网址 263{
208必赢备用网址 264                Size +=DirSize(di);  ;
209必赢备用网址 265            }
210必赢备用网址 266            return(Size);  
211必赢备用网址 267        }
212必赢备用网址 268
213必赢备用网址 269        //获取当前文件夹中的所有文件和文件夹(不包括它的下一级目录)
214必赢备用网址 270        void PrintFileSystemEntries(string path) 
215必赢备用网址 271必赢备用网址 272        必赢备用网址 273{
216必赢备用网址 274            
217必赢备用网址 275            try 
218必赢备用网址 276必赢备用网址 277            必赢备用网址 278{
219必赢备用网址 279                // Obtain the file system entries in the directory path.
220必赢备用网址 280                string[] directoryEntries =
221必赢备用网址 281                    System.IO.Directory.GetFileSystemEntries(path); 
222必赢备用网址 282
223必赢备用网址 283                foreach (string str in directoryEntries) 
224必赢备用网址 284必赢备用网址 285                必赢备用网址 286{
225必赢备用网址 287                    //System.Console.WriteLine(str);
226必赢备用网址 288                    this.richTextBox1.Text+=str+"n"  ;
227必赢备用网址 289                }
228必赢备用网址 290            }
229必赢备用网址 291            catch (ArgumentNullException) 
230必赢备用网址 292必赢备用网址 293            必赢备用网址 294{
231必赢备用网址 295                System.Console.WriteLine("Path is a null reference.");
232必赢备用网址 296            }
233必赢备用网址 297            catch (System.Security.SecurityException) 
234必赢备用网址 298必赢备用网址 299            必赢备用网址 300{
235必赢备用网址 301                System.Console.WriteLine("The caller does not have the " +
236必赢备用网址 302                    "required permission.");
237必赢备用网址 303            }
238必赢备用网址 304            catch (ArgumentException) 
239必赢备用网址 305必赢备用网址 306            必赢备用网址 307{
240必赢备用网址 308                System.Console.WriteLine("Path is an empty string, " +
241必赢备用网址 309                    "contains only white spaces, " + 
242必赢备用网址 310                    "or contains invalid characters.");
243必赢备用网址 311            }
244必赢备用网址 312            catch (System.IO.DirectoryNotFoundException) 
245必赢备用网址 313必赢备用网址 314            必赢备用网址 315{
246必赢备用网址 316                System.Console.WriteLine("The path encapsulated in the " + 
247必赢备用网址 317                    "Directory object does not exist.");
248必赢备用网址 318            }
249必赢备用网址 319        }
250必赢备用网址 320
251必赢备用网址 321        //获取当前文件夹下的所有文件和文件夹(不包括它的下一级目录)
252必赢备用网址 322        public  void ProcessDirectory(string targetDirectory) 
253必赢备用网址 323必赢备用网址 324        必赢备用网址 325{
254必赢备用网址 326            // Process the list of files found in the directory.
255必赢备用网址 327            string [] fileEntries = Directory.GetFiles(targetDirectory);
256必赢备用网址 328            foreach(string fileName in fileEntries)
257必赢备用网址 329                this.richTextBox1.Text +=fileName+"n";
258必赢备用网址 330            // Recurse into subdirectories of this directory.
259必赢备用网址 331            string [] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
260必赢备用网址 332            foreach(string subdirectory in subdirectoryEntries)
261必赢备用网址 333必赢备用网址 334            必赢备用网址 335{
262必赢备用网址 336                this.richTextBox1.Text += subdirectory+"n"+"**********************************nn"    ;
263必赢备用网址 337                ProcessDirectory(subdirectory);
264必赢备用网址 338            }
265必赢备用网址 339
266必赢备用网址 340            
267必赢备用网址 341        }
268必赢备用网址 342
269必赢备用网址 343    }
270必赢备用网址 344
271必赢备用网址 345
272必赢备用网址 346}
273必赢备用网址 347

经常看一些的程序,有些一个解决方案带有多个项目,由于代码比较多,多人开发,所以好多vs.net下的工程是用source safe进行版本控制的。而用source safe进行版本控制需要局域网路径共享,因此好多项目换一台机器打开会出现一些问题,比如“解决方案看起来是受源代码管理,但无法找到它的绑定信息……”之类的提示信息很多。有时候修改了代码还保存不了,所以想把他去掉,下面是对项目管理前后的一些对比。

必赢备用网址 348

一、工程项目比较

  下面来看看程序的具体实现步骤。

同没有受Source Safe代码管理的工程相比:

  首先是读取指定的目录并遍历其中的文件。这个功能很简单,我们只需要通过一个foreach循环遍历DirectoryInfo对象中的所有文件即可。在本例中,我们定义了一个文件夹选择控件,当用户点击Select按钮时弹出对话框用户指定程序要遍历的目录,将目录字符串存储在文本框中。点击Go按钮时开始遍历文件夹中的所有文件。程序将按行输出目录中Word文件名,不包含扩展名。

1. 多出了.scc、.vssscc和.vspscc文件;

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() += "rn";
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 }

2. C#项目文件(.csproj)里面添加了几行标签:

  然后是增加读取Word文件的功能。这个需要使用COM组件,在工程中添加对Word COM组件的引用。

SccProjectName = "SAK"

SccLocalPath = "SAK"

必赢备用网址 349

SccAuxPath = "SAK"

  程序只选择读取Word文件的前三行,下面是具体的代码。

SccProvider = "SAK"

 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 }

3.在解决方案文件(.sln)中,中增加了如下节点原素:

  注意打开Word文档时可以以只读方式打开,这样打开的速度会稍微快一点,并且关闭的时候不会出现是否保存文件的对话框。任何情况下只要打开了Word文档,一定记住使用完后要将其关闭,并且在退出程序时也要将Word进程一并关掉。

GlobalSection(SourceCodeControl) = preSolution

 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 }

SccNumberOfProjects = 4

  最后再来看看如何实现平滑进度条。这个需要使用到BackgroundWorker对象,该对象允许程序在多线程下执行,我们可以将界面UI和后台线程分开,这样当程序在执行一个时间较长的任务时不会导致主界面处于等待状态,用户仍然可以操作主界面上的元素,使程序看起来比较平滑。BackgroundWorker对象定义了一些属性和委托用来处理多线程间的信息同步,诸如后台线程在执行过程中如何通知主界面的线程更新进度条值等。

SccLocalPath0 = .

1 Application.EnableVisualStyles();

3 worker.WorkerReportsProgress = true;

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%等。可以看看下面完整的程序代码:

SccLocalPath3 = SUBSCRIBE_TOOLS

必赢备用网址 350必赢备用网址 351ListFileName

CanCheckoutShared = false

  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 += "rn";
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 += "rn";
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 }

EndGlobalSection

完整代码下载

二、编写实现的类

既然文件增多了,还有有些文件被修改,所以想通过编程把他修改回原样,这样可能可以去掉那些提示信息,所以就写了下面的代码。

//**********************************************************

// 程序:郑佐 zhzuocn@163.com 2004/06/10

// 功能:去除C#.net的原代码Source safe 管理

//**********************************************************

using System;

using System.IO;

using System.Text;

using System.Threading;

namespace ZZ

{

///

/// 操作信息事件代理

///

public delegate void OperateNotifyHandler(object sender,VssEventArgs e);

///

/// VssConverter 处理解决方案或项目的SourceSafe关联。

///

public class VssConverter

{

//操作根目录

private string operatePath;

///

/// 操作信息事件

///

public event OperateNotifyHandler OperateNotify;

///

/// 线程结束通知事件

///

public event EventHandler ThreadCompleted;

///

/// 构造函数

///

/// 项目路径

public VssConverter(string operatePath)

{

this.operatePath = operatePath;

}

OperatePath属性,用来设置或获取当前需要处理的工程路径,不过在运行时最好不要设置他,

///

/// 设置解决方案工程路径

///

public string OperatePath

{

get{return this.operatePath;}

set{this.operatePath = value;}

}

下面是一个public 修饰符的函数,也是类实例的惟一对外公开的方法,里面用了两个线程来分别删除文件和修改文件。

///

/// 去除Source Safe代码管理

///

public void RemoveVss()

{

Thread deleteThread = new Thread(new ThreadStart(DeleteVssFile));

Thread RemoveVssIdentifyThread = new Thread(new ThreadStart(RemoveVssIdentify));

deleteThread.Start();

RemoveVssIdentifyThread.Start();

}

后来测试了一下deleteThread的完成要比RemoveVssIdentifyThread快一些,当然也可以再开一个线程来分担文件的修改,不过这里需要注意的是好多文件是带只读属性的,所以还要把文件属性设置成Normal才能顺利完成操作,否则会抛出异常。

这里使用了递归来删除相关文件,由三个函数构成:

///

/// 线程委托函数,完成删除"*.scc","*.vssscc"以及*.vspscc文件功能。

///

private void DeleteVssFile()

{

DeleteVssFile(this.operatePath);

//通知删除文件结束

OnThreadCompleted(this,new EventArgs());

}

///

/// 递归函数,删除"*.scc","*.vssscc"以及*.vspscc文件。

///

/// 当前处理路径

private void DeleteVssFile(string path)

{

DeleteFile(Directory.GetFiles(path,"*.scc"));

DeleteFile(Directory.GetFiles(path,"*.vssscc"));

DeleteFile(Directory.GetFiles(path,"*.vspscc"));

foreach(string dir in Directory.GetDirectories(path))

DeleteVssFile(dir);

}

///

/// 删除文件,真正删除文件

///

///

private void DeleteFile(string [] files)

{

foreach(string file in files)

{

FileInfo fi = new FileInfo(file);

fi.Attributes = FileAttributes.Normal;

File.Delete(file);

OnOperateNotify(this,new VssEventArgs(file+"删除完成"));

}

}

对于".sln"解决方案文件和".csproj’"C#项目文件的修改也采用了递归实现:

///

/// 线程委托函数,去除"*.sln"解决方案文件和"*.csproj"C#项目文件的.Vss关联标签。

///

private void RemoveVssIdentify()

{

RemoveVssTag(this.operatePath);

//通知去除标签结束

OnThreadCompleted(this,new EventArgs());

}

///

/// 去除"*.sln"解决方案文件和"*.csproj"C#项目文件的.Vss关联标签。

///

/// 当前处理路径

private void RemoveVssTag(string path)

{

RemoveTagContent(Directory.GetFiles(path,"*.sln"));

RemoveTagContent(Directory.GetFiles(path,"*.csproj"));

foreach(string dir in Directory.GetDirectories(path))

RemoveVssTag(dir);

}

下面的函数用来分析处理文件的修改,因为都是做删除部分文件内容的工作,所以把处理函数写成了一个,

///

/// 去除"*.sln"解决方案文件和"*.csproj"C#项目文件的.Vss关联标签。

///

/// 当前处理文件

private void RemoveTagContent(string [] files)

{

foreach(string file in files)

{

string strStart; //Vss标签文本开始内容

string strEnd; //标签文本结束内容

int offSet;//结束标签文本的偏移量

FileInfo fi = new FileInfo(file);

fi.Attributes =FileAttributes.Normal;

if(fi.Extension == ".sln")//如果是解决方案文件

{

strStart = "GlobalSection(SourceCodeControl)";

strEnd = "EndGlobalSection";

offSet = 19;//包含rn和空格

}

else//如果是项目文件

{

strStart = "SccProjectName";

strEnd = ">";

offSet = 0;

}

try

{

int start;//Vss标签文本开始索引

int end;//Vss标签文本结束索引

string content;//文件内容

using(FileStream fs = new FileStream(file,FileMode.Open,FileAccess.ReadWrite,FileShare.ReadWrite))

{

StreamReader sr = new StreamReader(fs);

content = sr.ReadToEnd();

sr.Close();

start = content.IndexOf(strStart);

}

if(start!=-1)//文件需要去除标签

{

using(FileStream fs = new FileStream(file,FileMode.Truncate,FileAccess.Write,FileShare.Read))

{

end = start+content.Substring(start).IndexOf(strEnd)+offSet;

content = content.Substring(0,start)+content.Substring(end);

StreamWriter sw = new StreamWriter(fs);

sw.Write(content);

sw.Close();

}

OnOperateNotify(this,new VssEventArgs(file+"去除标签完成"));

}

}

catch(Exception ex)

{

OnOperateNotify(this,new VssEventArgs(file+"操作错误:"+ex.ToString()));

}

}

}

当此为止,上面的程序实现了主要的功能,不过上面定义的事件,下面就是关于事件的函数,

///

/// 操作信息事件通知

///

/// VssConverter

/// 参数,

protected virtual void OnOperateNotify(object sender,VssEventArgs e)

{

if(OperateNotify!=null)

OperateNotify(sender,e);

}

///

/// 线程结束事件通知

///

/// VssConverter

/// 参数

protected virtual void OnThreadCompleted(object sender,EventArgs e)

{

if(ThreadCompleted!=null)

ThreadCompleted(sender,e);

}

}

相对于事件中的参数,这里定义了一个类从EventArgs继承,里面只包含一个字段用来保存信息,

///

/// 消息通知事件参数类

///

public class VssEventArgs : EventArgs

{

private string message;

///

/// 构造函数

///

///

public VssEventArgs(string message)

{

this.message = message;

}

///

/// 消息内容

///

public string Message

{

get{return this.message;}

}

}

}//命名空间