跳到主要內容

[程式]以C#實作存取Visual SourceSafe資訊的class

以下為C#包裝好可以存取Visual SourceSafe資訊,不用還要自己到VSS Explorer一個個看,方便可以自行開發Application進行版控管理 Source file
 1 /*
 2  * Name: VSSUtil
 3  * Purpose: 包裝Visual SourceSafe介面使用
 4  * DateTime: 2014/05/07
 5  * Author: Chi-Hsu Chen
 6  */
 7 
 8 using System;
 9 using System.Collections.Generic;
10 using System.Linq;
11 using System.Text;
12 using System.Threading.Tasks;
13 using SourceSafeTypeLib;
14 
15 namespace WindowsFormsApplication1
16 {
17     class VSSUtil
18     {
19         VSSDatabase vssdb = new VSSDatabase();
20         private const string _ADD_RESULT_OK = "OK";
21         List<string> lsList = new List<string>();
22         List<string> lsProj = new List<string>();
23 
24         // 0. 從指定的scrSafe.ini開啟VSS DB
25         // lsPath ex: \\localhost\SPC\srcsafe.ini
26         public void OpenVSS(string lsPath, string lsAccount, string lsPasswd)
27         {
28             CloseVSSDB();
29             vssdb.Open(lsPath, lsAccount, lsPasswd);
30 
31             return;
32         }
33 
34         // 1. 取回檔案最新版本編號
35         // lsPath ex: $/SPC/WindowsApplication1.root/WindowsApplication1/WindowsApplication1/Log.vb
36         public int getFileLatestVersionNumber(string lsPath)
37         {
38             VSSItem vssitem;
39 
40             try
41             {
42                 vssitem = vssdb.get_VSSItem(lsPath);
43             
44                 return vssitem.VersionNumber;
45             }
46             catch (System.Runtime.InteropServices.COMException cmo)
47             {
48                 ShowErrorMessage(cmo);
49                 return -1;
50             }
51         }
52 
53         // 2. 取回檔案的ItemName
54         // lsPath ex: $/SPC/WindowsApplication1.root/WindowsApplication1/WindowsApplication1/Log.vb
55         public string getFileItemName(string lsPath)
56         {
57             VSSItem vssitem;
58 
59             try
60             {
61                 vssitem = vssdb.get_VSSItem(lsPath);
62             
63                 return vssitem.Name;
64             }
65             catch (System.Runtime.InteropServices.COMException cmo)
66             {
67                 ShowErrorMessage(cmo);
68                 return string.Empty;
69             }
70         }
71 
72         // 3. 取回檔案最後修改日期
73         // lsPath ex: $/SPC/WindowsApplication1.root/WindowsApplication1/WindowsApplication1/Log.vb
74         public string getFileModifyDate(string lsPath)
75         {
76             string lsFileDateTime=string.Empty;
77             VSSItem vssitem;
78 
79             try
80             {
81                 vssitem = vssdb.get_VSSItem(lsPath);
82 
83                 foreach (VSSVersion v in vssitem.get_Versions())
84                 {
85                     lsFileDateTime = v.Date.ToString("yyyy-MM-dd HH:mm:ss");  // 以24小時制顯示
86                     break;
87                 }
88 
89                 return lsFileDateTime;
90             }
91             catch (System.Runtime.InteropServices.COMException cmo)
92             {
93                 ShowErrorMessage(cmo);
94                 return string.Empty;
95             }
96         }
97 
98         // 4. by VersionNumber取回特定檔案內容
99         // lsPath ex: $/SPC/WindowsApplication1.root/WindowsApplication1/WindowsApplication1/Log.vb
100         // lsVersionNumber ex: 1
101         // lsLocalPath ex: c:\Log.vb
102         public void getFileByVersionNumber(string lsPath, int lsVersionNumber, string lsLocalPath)
103         {
104             VSSItem vssitem;
105 
106             try
107             {
108                 vssitem = vssdb.get_VSSItem(lsPath);
109                 //檢查給定版號是否存在
110                 if (IsGetVersionNumberExceedLatest(lsPath, lsVersionNumber))
111                 {
112                     //throw new Exception("Version " + lsVersionNumber.ToString() + " Not Found!");
113                     System.Windows.Forms.MessageBox.Show("Version " + lsVersionNumber.ToString() + " Not Found!Please confirm this version exist.", "VSS Automation",
114                         System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning);
115                     return;
116                 }
117                 vssitem.get_Version(lsVersionNumber.ToString()).Get(ref lsLocalPath, 0);
118             }
119             catch (System.Runtime.InteropServices.COMException cmo)
120             {
121                 ShowErrorMessage(cmo);
122                 return;
123             }
124         }
125 
126         // 5. 取得特定檔案是否為check out
127         // lsPath ex: $/SPC/WindowsApplication1.root/WindowsApplication1/WindowsApplication1/Log.vb
128         public bool IsFileCheckOut(string lsPath)
129         {
130             VSSItem vssitem;
131 
132             try
133             {
134                 vssitem = vssdb.get_VSSItem(lsPath);
135                 return vssitem.IsCheckedOut == 2 ? true : false;
136             }
137             catch (System.Runtime.InteropServices.COMException cmo)
138             {
139                 ShowErrorMessage(cmo);
140                 return false;
141             }
142         }
143 
144         //6. 給定版本編號是否超過最新版本編號
145         // True為超過;False為沒有超過
146         private bool IsGetVersionNumberExceedLatest(string lsPath, int lsVersionNumber)
147         {
148             if (lsVersionNumber > getFileLatestVersionNumber (lsPath))
149                 return true;
150             else
151                 return false;
152         }
153 
154         // 7. 比對特定版本檔案是否與local copy相同
155         // lsPath ex: $/SPC/WindowsApplication1.root/WindowsApplication1/WindowsApplication1/Log.vb
156         // lsLocalPath ex: d:\log.vb
157         // lsVersionNumber ex: 1
158         public string IsFileDiffByVersionNumber(string lsPath, string lsLocalPath, int lsVersionNumber)
159         {
160             VSSItem vssitem;
161 
162             try
163             {
164                 if (System.IO.File.Exists(lsLocalPath) == false) return "本地檔案不存在";
165                 
166                 vssitem = vssdb.get_VSSItem(lsPath);
167                 return vssitem.get_Version(lsVersionNumber.ToString()).get_IsDifferent(lsLocalPath).ToString();
168             }
169             catch (System.Runtime.InteropServices.COMException cmo)
170             {
171                 ShowErrorMessage(cmo);
172                 return "N/A";
173             }
174         }
175 
176         // 8. 抓取最新版本的comment
177         // lsPath ex: $/SPC/WindowsApplication1.root/WindowsApplication1/WindowsApplication1/Log.vb
178         public string getFileComment(string lsPath)
179         {
180             string lsComment=string.Empty;
181             VSSItem vssitem;
182 
183             try
184             {
185                 vssitem = vssdb.get_VSSItem(lsPath);
186 
187                 foreach (VSSVersion v in vssitem.get_Versions())
188                 {
189                     lsComment = v.Comment;
190                     break;
191                 }
192                 return lsComment == string.Empty ? "NULL" : lsComment;
193             }
194             catch (System.Runtime.InteropServices.COMException cmo)
195             {
196                 ShowErrorMessage(cmo);
197                 return string.Empty;
198             }
199         }
200 
201         // 9. 顯示錯誤訊息
202         private void ShowErrorMessage(System.Runtime.InteropServices.COMException cmo)
203         {
204             System.Windows.Forms.MessageBox.Show("Execption Msg = \n" + cmo.ToString(), "VSS Automation",
205                     System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning);
206 
207             return;
208         }
209 
210         // 10. 顯示目前開啟專案資訊
211         public string getProjectInfo()
212         {
213             return vssdb.CurrentProject;
214         }
215 
216         // 11. 傳回登入使用者名稱 
217         public string getLogOnUser()
218         {
219             return vssdb.Username;            
220         }
221 
222         // 12. close vssdb
223         public void CloseVSSDB()
224         {
225             vssdb.Close();
226 
227             return;
228         }
229 
230         // 13. 加入一個檔案到現有專案中
231         // lsVssPath ex: $/SPC/WindowsApplication1.root/WindowsApplication1/WindowsApplication1/Log.vb
232         // lsLocalPath ex: d:\log.vb
233         // lsComment ex: 加入comment
234         public string addFile(string lsVssPath,string lsLocalPath,string lsComment)
235         {
236             VSSItem vssitem;
237             
238             try
239             {
240                 vssitem = vssdb.get_VSSItem(lsVssPath);
241                 vssitem.Add(lsLocalPath, lsComment, 0);
242                 
243                 return _ADD_RESULT_OK;
244             }
245             catch (System.Runtime.InteropServices.COMException cmo)
246             {
247                 ShowErrorMessage(cmo);
248                 return cmo.ToString();
249             }
250         }
251         
252         // 14. 回傳DBNAME
253         public string getDBName()
254         {
255             return vssdb.DatabaseName;
256         }
257 
258         // 15. 取回最後修改人
259         // lsPath ex: $/SPC/WindowsApplication1.root/WindowsApplication1/WindowsApplication1/Log.vb
260         public string getLastUpdateUser(string lsPath)
261         {
262             string lsLastUpdateUser = string.Empty;
263             VSSItem vssitem;
264 
265             try
266             {
267                 vssitem = vssdb.get_VSSItem(lsPath);
268 
269                 foreach (VSSVersion v in vssitem.get_Versions())
270                 {
271                     lsLastUpdateUser = v.Username;
272                     break;
273                 }
274                 return lsLastUpdateUser == string.Empty ? "NULL" : lsLastUpdateUser;
275             }
276             catch (System.Runtime.InteropServices.COMException cmo)
277             {
278                 ShowErrorMessage(cmo);
279                 return string.Empty;
280             }
281         }
282         
283         // 16. 建立專案子目錄
284         // lsVssPath ex: $/SPC/WindowsApplication1.root/WindowsApplication1/WindowsApplication1/Log.vb
285         // lsSubFolder ex: FORM
286         public void createSubFolder(string lsVssProjPath, string lsSubFolder)
287         {
288             VSSItem vssitem;
289 
290             try
291             {
292                 vssitem = vssdb.get_VSSItem(lsVssProjPath);
293                 vssitem.NewSubproject(lsSubFolder);
294 
295                 return;
296             }
297             catch (System.Runtime.InteropServices.COMException cmo)
298             {
299                 ShowErrorMessage(cmo);
300                 return;
301             }
302         }
303 
304         // 17. 取得目前開啟的srcSafe.ini
305         public string getSrcSafe_INI()
306         {
307             return vssdb.SrcSafeIni;
308         }
309 
310         // 18. 判斷是否目前的檔案存在
311         public bool IsSpecifiedVssItemExist(string lsVssPath, string lsFindPath)
312         {
313             if (lsVssPath.Trim()==string.Empty)
314             {
315                 lsVssPath = lsFindPath.Substring(0, lsFindPath.LastIndexOf('/') + 1);
316             }
317 
318             lsList.Clear();
319             collectInfoByPath(lsVssPath);
320             if (lsList == null) return false;
321 #if (DEBUG)
322             foreach (string s in lsList)
323             {
324                 Console.WriteLine("path=" + s.ToString());
325             }
326 #endif
327             
328             foreach (string s in lsList)
329             {
330                 if (s.ToLower() == lsFindPath.ToLower())
331                     return true;
332             }
333             return false;
334         }
335 
336         // 19. 從給定的專案路徑中收集檔案項目
337         public List<string> collectInfoByPath(string lsVssPath)
338         {
339             try
340             {
341                 VSSItem lsProj = vssdb.get_VSSItem(lsVssPath, false);
342 
343                 foreach (VSSItem item in lsProj.get_Items(false))
344                 {
345                     if (item.Type == (int)VSSItemType.VSSITEM_PROJECT)
346                         collectInfoByPath(item.Spec);
347                     else
348                         lsList.Add(lsVssPath + (lsVssPath.Substring(lsVssPath.Length-1,1) != "/" ? "/" : string.Empty) + item.Name);
349                 }
350                return lsList;            
351             }
352             catch (System.Runtime.InteropServices.COMException cmo)
353             {
354                 return null; 
355             }
356         }
357 
358         // 20. 從給定的專案路徑中收集專案
359         public void collectProjInfoByPath(string lsVssPath)
360         {
361             try
362             {
363                 VSSItem Proj = vssdb.get_VSSItem(lsVssPath, false);
364 
365                 if (Proj.get_Items(false).Count == 0) 
366                     lsProj.Add(lsVssPath + (lsVssPath.Substring(lsVssPath.Length - 1, 1) != "/" ? "/" : string.Empty));
367                 
368                 foreach (VSSItem item in Proj.get_Items(false))
369                 {
370                     if (item.Type == (int)VSSItemType.VSSITEM_PROJECT)
371                     {
372                         lsProj.Add(lsVssPath + (lsVssPath.Substring(lsVssPath.Length - 1, 1) != "/" ? "/" : string.Empty));
373                         collectProjInfoByPath(item.Spec);
374                     }
375                 }
376                 return;
377             }
378             catch (System.Runtime.InteropServices.COMException cmo)
379             {
380                 return;
381             }
382         }
383 
384         // 21. 指定的VSS Project是否存在
385         public bool IsSpecifiedVssProjectExist(string lsVssPath, string lsFindPath)
386         {
387             if (lsVssPath.Trim() == string.Empty)
388             {
389                 lsVssPath = lsFindPath.Substring(0, lsFindPath.LastIndexOf('/') + 1);
390             }
391 
392             lsProj.Clear();
393             collectProjInfoByPath(lsVssPath);
394             if (lsProj == null) return false;
395 #if (DEBUG)
396             foreach (string s in lsProj)
397             {
398                 Console.WriteLine("path=" + s.ToString());
399             }
400 #endif
401             foreach (string s in lsProj)
402             {
403                 if (s.ToLower() == lsFindPath.ToLower())
404                     return true;
405             }
406             return false;
407         }
408 
409         // 22. 以內容比對與特定版號內容是否相同
410         // lsVssPath ex: $/SPC/WindowsApplication1.root/WindowsApplication1/WindowsApplication1/Log.vb
411         // lsLocalPath ex: d:\log.vb
412         public int getVersionNumberByContent(string lsVssPath, string lsLocalPath)
413         {
414             VSSItem vssitem;
415 
416             try
417             {
418                 if (System.IO.File.Exists(lsLocalPath) == false)
419                     return 0;
420                 
421                 vssitem = vssdb.get_VSSItem(lsVssPath);
422 
423                 foreach (VSSVersion v in vssitem.get_Versions())
424                 {
425                     // 如果檔案內容一樣,則視為與該版號內容相同,回傳該版號
426                     if (IsFileDiffByVersionNumber(lsVssPath, lsLocalPath, v.VersionNumber).ToLower() == "false")
427                         return v.VersionNumber;
428                 }
429                 return 0;
430             }
431             catch (System.Runtime.InteropServices.COMException cmo)
432             {
433                 return 0;
434             }
435         }
436 
437         // 尚不開放使用 - 讀取專案下所有項目
438         private string readProject(string lsPath)
439         {
440             string lsContent="";
441             try
442             {
443                 VSSItem lsProj = vssdb.get_VSSItem(lsPath, false);
444                 foreach (VSSItem item in lsProj.get_Items(false))
445                 {
446                     if (item.Type == (int)VSSItemType.VSSITEM_PROJECT)
447                     {
448                         readProject(item.Spec);
449                     }
450                     else
451                     {
452                         string.Concat(lsContent, "<Item=>");
453                         string.Concat(lsContent, item.Name);
454                         string.Concat(lsContent, "<VersionNumber=>");
455                         string.Concat(lsContent, item.VersionNumber.ToString());
456                         string.Concat(lsContent, "\n");
457                     }
458                 }
459                 return lsContent;
460             }
461             catch (System.Runtime.InteropServices.COMException cmo)
462             {
463                 ShowErrorMessage(cmo);
464                 return string.Empty;
465             }
466         }
467 
468     }
469 }


GitHub   https://github.com/ChiHsuChen/VSSUTIL_CSHARP




張貼留言

這個網誌中的熱門文章

[遊記] 20160710 廈門 - 中山路步行街,鼓浪嶼

此次趁出差之便,於周末從廈門翔安區到島內搭船到鼓浪嶼來看看這素有海上花園之稱的地方


[遊記] 20161018-19 美西自由行Day 4-5:優勝美地國家公園(Yosemite National Park) @ California, US

優勝美地國家公園,雖然不知道中文譯名是從何而來的,但實際到此體會才知道這個譯名實如其名

Glacier Point眺看半圓頂(Half Dome)