.net中操作Visual SourceSafe

最近整理一些资料,发现以前写的一段代码,提供对微软的版本管理软件visual sourcesafe的一些操作。以下简称vss。

想起以前写的时候,因为资料比较匮乏,只能边研究边测试,走了不少弯路。

由于一些个人的原因(有点健忘,有点懒),一直没分享出来。今天趁着有点空,刷刷blog。

ps:上一个绘制c语言头文件包含关系图的小工具(http://www.cnblogs.com/geeking/p/4021044.html),不知大家发现没有,bug很多。主要集中在头文件循环引用和大量节点绘制上。(实验发现,绘制大量节点时,TreeGX控件最好visible false。貌似控件添加“可看到”节点时会触发内部刷新操作,而此时又正在添加节点,会引发"System.InvalidOperationException"错误)。新版本v2.0稍后更新。

言归正传。

.net中要对vss操作,要先引用Interop.SourceSafeTypeLib.dll,还有命名空间 using SourceSafeTypeLib;

额,电脑太垃圾,我就不开vs截图了。贴下工程文件供参照:

<Reference Include="Interop.SourceSafeTypeLib, Version=5.2.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\Interop.SourceSafeTypeLib.dll</HintPath>
</Reference>

具体对vss的操作我都提取在VSSHelper.cs文件中。

以下是具体内容:(哎,发现自己废话越来越多了,莫非有向唐僧发展的节奏么)

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using SourceSafeTypeLib;
  6 using System.IO;
  7 using System.Windows.Forms;
  8 namespace DockSample
  9 {
 10     public static class VSSHelper
 11     {
 12         public static string workPath = "";
 13         private static string root = "$/";
 14         private static VSSDatabaseClass db = new VSSDatabaseClass();
 15         /// <summary>
 16         /// 检查VSS是否打开,已打开返回true,未打开返回false
 17         /// </summary>
 18         /// <returns></returns>
 19         public static bool checkVSSOpen()
 20         {
 21             try
 22             {
 23                 //VSS未提供标志是否打开的字段
 24                 //故调用get_VSSItem方法,若抛出异常代码-2147210253则证明未打开
 25                 //未抛出异常则证明已经打开连接
 26                 VSSItem vssItem = db.get_VSSItem(root, false);
 27                 vssItem = null;
 28                 return true;
 29             }
 30             //catch (System.Runtime.InteropServices.COMException comex)
 31             //{
 32             //    if (comex.ErrorCode == -2147210253)
 33             //    {
 34             //        MessageBox.Show("您尚未登录VSS\r\n请登录后重试", "错误");
 35             //    }
 36             //    return false;
 37             //}
 38             catch (Exception ex)
 39             {
 40                 System.Diagnostics.Debug.WriteLine(ex.Message);
 41                 return false;
 42             }
 43         }
 44         /// <summary>
 45         /// 打开VSS,返回true成功打开,false未成功打开
 46         /// </summary>
 47         /// <param name="vssIniPath"></param>
 48         /// <param name="user"></param>
 49         /// <param name="pwd"></param>
 50         /// <returns></returns>
 51         public static bool openVSS(string vssIniPath, string user, string pwd)
 52         {
 53             try
 54             {
 55                 //避免重复打开出错
 56                 if (!checkVSSOpen())
 57                 {
 58                     db.Open(vssIniPath, user, pwd);
 59                 }
 60                 else
 61                 {
 62                     MessageBox.Show("连接已经打开\r\n请勿重复打开", "提示");
 63                 }
 64 
 65 
 66                 #region 测试用代码:
 67                 //creatSub(@"F:\ceshi", root);
 68                 //creat(@"F:\ceshi");
 69                 #endregion
 70                 return true;
 71             }
 72             catch (System.Runtime.InteropServices.COMException comex)
 73             {
 74                 System.Diagnostics.Debug.WriteLine(comex.Message);
 75                 return false;
 76             }
 77             catch (Exception ex)
 78             {
 79                 System.Diagnostics.Debug.WriteLine(ex.Message);
 80                 return false;
 81             }
 82         }
 83         #region 弃用
 84         //public static void creat(string parentPath)
 85         //{
 86         //    //if (workPath == string.Empty)
 87         //    //{
 88         //    //    return;
 89         //    //}
 90         //    DirectoryInfo dirInfo = new DirectoryInfo(parentPath);
 91         //    try
 92         //    {
 93         //        VSSItem vssItem = db.get_VSSItem(root, false);
 94         //        vssItem.NewSubproject(dirInfo.Name, "created");
 95         //    }
 96         //    catch (Exception ex)
 97         //    {
 98         //        System.Diagnostics.Debug.WriteLine(ex.Message);
 99         //    }
100         //    creatSub(parentPath, root);
101 
102         //}
103         #endregion
104         public static bool creatSub(string path, string vssRoot)
105         {
106             if (Directory.Exists(path))
107             {
108                 DirectoryInfo dirInfo = new DirectoryInfo(path);
109                 FileInfo[] fileInfos = dirInfo.GetFiles();
110                 DirectoryInfo[] subDirInfos = dirInfo.GetDirectories();
111                 VSSItem vssItem = db.get_VSSItem(vssRoot, false);
112                 //将目录中的所有文件(排除.scc文件)添加到VSS中
113                 foreach (FileInfo fileInfo in fileInfos)
114                 {
115                     try
116                     {
117                         if (fileInfo.Extension.ToLower() != ".scc")
118                         {
119                             //添加本地文件到VSS
120                             vssItem.Add(fileInfo.FullName, "add", 0);
121                         }
122 
123                     }
124                     catch (Exception ex)
125                     {
126                         System.Diagnostics.Debug.WriteLine(ex.Message);
127                         return false;
128                     }
129                 }
130                 //使用递归,根据本地目录结构创建VSS工程目录结构
131                 foreach (DirectoryInfo subDirInfo in subDirInfos)
132                 {
133                     try
134                     {
135                         //创建VSS子工程(子目录)
136                         vssItem.NewSubproject(subDirInfo.Name, "created");
137                         //递归调用,构建当前处理目录的下层目录结构(工程结构)
138                         if (!creatSub(subDirInfo.FullName, vssRoot + subDirInfo.Name + "/"))
139                         {
140                             return false;
141                         }
142                     }
143                     catch (Exception ex)
144                     {
145                         System.Diagnostics.Debug.WriteLine(ex.Message);
146                         return false;
147                     }
148                 }
149                 return true;
150             }
151             else
152             {
153                 MessageBox.Show("目录:" + path + " 不存在", "错误");
154                 return false;
155             }
156         }
157         public static bool checkOut(string vssPath, string localPath)
158         {
159             return exeCMD(vssPath, localPath, "checkout");
160             #region 舍弃
161             //try
162             //{
163             //    VSSItem vssitem = db.get_VSSItem(vssPath, false);
164             //    //Type==0 项目文件夹,Type==1 项目文件
165             //    //若当前checkout的是单个文件,则checkout后直接返回
166             //    if (vssitem.Type == 1)
167             //    {
168             //        vssitem.Checkout("checkout", localPath, 0);
169             //        return true;
170             //    }
171             //    //若checkout的是一个目录,则递归目录下的所有文件,
172             //    //包括子目录中的文件。并把所有文件checkout
173             //    IVSSItems ivssitems = vssitem.get_Items(false);
174             //    //防止Path结构错误
175             //    localPath = localPath.EndsWith(@"\") ? localPath : localPath + @"\";
176             //    vssPath = vssPath.EndsWith("/") ? vssPath : vssPath + "/";
177             //    foreach (IVSSItem ivssitem in ivssitems)
178             //    {
179             //        if (ivssitem.Type == 1)
180             //        {
181             //            //项目文件,直接checkout
182             //            ivssitem.Checkout("checkout", localPath + ivssitem.Name, 0);
183             //        }
184             //        else if (ivssitem.Type == 0)
185             //        {
186             //            //项目文件夹,递归调用checkOut函数
187             //            bool temp = checkOut(vssPath + ivssitem.Name, localPath + ivssitem.Name);
188             //            if (!temp)
189             //            {
190             //                return false;
191             //            }
192             //        }
193 
194             //    }
195             //    return true;
196             //}
197             //catch (Exception ex)
198             //{
199             //    System.Diagnostics.Debug.WriteLine(ex.Message);
200             //    return false;
201             //} 
202             #endregion
203         }
204         private static bool exeCMD(string vssPath, string localPath, string cmd)
205         {
206             try
207             {
208                 VSSItem vssitem = db.get_VSSItem(vssPath, false);
209                 //Type==0 项目文件夹,Type==1 项目文件
210                 if (vssitem.Type == 1)
211                 {
212                     switch (cmd.ToLower())
213                     {
214                         case "checkout":
215                             if (vssitem.IsCheckedOut == 0)
216                             {
217                                 vssitem.Checkout(cmd, localPath, 0);
218                                 return true;
219                             }
220                             MessageBox.Show("请勿重复CheckOut", "提示");
221                             return false;
222                         case "checkin":
223                             if (vssitem.IsCheckedOut != 0)
224                             {
225                                 vssitem.Checkin(cmd, localPath, 0);
226                                 return true;
227                             }
228                             MessageBox.Show("请先CheckOut", "提示");
229                             return false;
230                         case "get":
231                             vssitem.Get(ref localPath, 0);
232                             return true;
233                         default:
234                             break;
235                     }
236 
237                 }
238                 IVSSItems ivssitems = vssitem.get_Items(false);
239                 //防止Path结构错误
240                 localPath = localPath.EndsWith(@"\") ? localPath : localPath + @"\";
241                 vssPath = vssPath.EndsWith("/") ? vssPath : vssPath + "/";
242                 foreach (IVSSItem ivssitem in ivssitems)
243                 {
244                     if (ivssitem.Type == 1)     //项目文件
245                     {
246                         string tmpLocalPath = localPath + ivssitem.Name;
247                         switch (cmd.ToLower())
248                         {
249                             case "checkout":
250                                 if (ivssitem.IsCheckedOut == 0)
251                                 {
252                                     ivssitem.Checkout(cmd, tmpLocalPath, 0);
253                                 }
254                                 break;
255                             case "checkin":
256                                 if (ivssitem.IsCheckedOut != 0)
257                                 {
258                                     ivssitem.Checkin(cmd, tmpLocalPath, 0);
259                                 }
260                                 break;
261                             case "get":
262                                 ivssitem.Get(ref tmpLocalPath, 0);
263                                 break;
264                             default:
265                                 break;
266                         }
267                     }
268                     else if (ivssitem.Type == 0)    //项目文件夹
269                     {
270                         //递归调用checkin函数
271                         bool temp = exeCMD(vssPath + ivssitem.Name, localPath + ivssitem.Name, cmd);
272                         if (!temp)
273                         {
274                             return false;
275                         }
276                     }
277 
278                 }
279                 return true;
280             }
281             catch (System.Runtime.InteropServices.COMException comex)
282             {
283                 if (comex.ErrorCode == -2147210253)
284                 {
285                     MessageBox.Show("您尚未登录VSS\r\n请登录后重试", "错误");
286                     FrmVSSLogin frm = new FrmVSSLogin();
287                     frm.ShowDialog();
288                 }
289                 return false;
290             }
291             catch (Exception ex)
292             {
293                 System.Diagnostics.Debug.WriteLine(ex.Message);
294                 return false;
295             }
296         }
297         public static bool checkIn(string vssPath, string localPath)
298         {
299             return exeCMD(vssPath, localPath, "checkin");
300             #region 舍弃
301             //try
302             //{
303             //    VSSItem vssitem = db.get_VSSItem(vssPath, false);
304             //    if (vssitem.Type == 1)
305             //    {
306             //        //IsCheckedOut==0 未checkout
307             //        //若被checkout,则checkin
308             //        if (vssitem.IsCheckedOut != 0)
309             //        {
310             //            //vssitem.
311             //            vssitem.Checkin("checkin", localPath, 0);
312             //            return true;
313             //        }
314             //    }
315             //    IVSSItems ivssitems = vssitem.get_Items(false);
316             //    //防止Path结构错误
317             //    localPath = localPath.EndsWith(@"\") ? localPath : localPath + @"\";
318             //    vssPath = vssPath.EndsWith("/") ? vssPath : vssPath + "/";
319             //    foreach (IVSSItem ivssitem in ivssitems)
320             //    {
321             //        if (ivssitem.Type == 1)
322             //        {
323             //            if (ivssitem.IsCheckedOut != 0)
324             //            {
325             //                ivssitem.Checkin("checkin", localPath + ivssitem.Name, 0);
326             //            }
327 
328             //        }
329             //        else if (ivssitem.Type == 0)
330             //        {
331             //            //项目文件夹,递归调用checkin函数
332             //            bool temp = checkIn(vssPath + ivssitem.Name, localPath + ivssitem.Name);
333             //            if (!temp)
334             //            {
335             //                return false;
336             //            }
337             //        }
338 
339             //    }
340             //    return true;
341             //}
342             //catch (Exception ex)
343             //{
344             //    System.Diagnostics.Debug.WriteLine(ex.Message);
345             //    return false;
346             //} 
347             #endregion
348         }
349         public static bool get(string vssPath, string localPath)
350         {
351             return exeCMD(vssPath, localPath, "get");
352         }
353 
354         #region 弃用
355         //public static bool checkOut(string vssPath, string localPath, string selectFileName)
356         //{
357         //    try
358         //    {
359         //        VSSItem vssitem = db.get_VSSItem(vssPath, false);
360         //        IVSSItems ivssitems = vssitem.get_Items(false);
361         //        localPath = localPath.EndsWith(@"\") ? localPath : localPath + @"\";
362         //        foreach (IVSSItem ivssitem in ivssitems)
363         //        {
364         //            if (ivssitem.Name == selectFileName)
365         //            {
366         //                ivssitem.Checkout("checkout", localPath + ivssitem.Name, 0);
367         //            }
368         //        }
369         //        return true;
370         //    }
371         //    catch (Exception ex)
372         //    {
373         //        System.Diagnostics.Debug.WriteLine(ex.Message);
374         //        return false;
375         //    }
376         //} 
377         #endregion
378 
379     }
380 }

每个函数就不讲了,主要是分清vsspath和localpath的区别。

简单登陆

 1 private void btnBrowse_Click(object sender, EventArgs e)
 2         {
 3             OpenFileDialog ofd = new OpenFileDialog()
 4             {
 5                 Filter = "VSS配置文件|*.ini",
 6                 Title = "打开VSS数据库文件"
 7             };
 8             if (ofd.ShowDialog() == DialogResult.OK)
 9             {
10                 tboxVSS.Text = ofd.FileName;
11             }
12 
13         }
14 
15         private void btnLogin_Click(object sender, EventArgs e)
16         {
17             string[] messboxText ={
18                                      "VSS打开错误!\r\n请检查配置重试。",
19                                      "VSS配置文件不存在!"
20                                   };
21 
22             if (tboxVSS.Text == "")
23             {
24                 return;
25             }
26             if (System.IO.File.Exists(tboxVSS.Text))
27             {
28                 //打开VSS
29                 if (VSSHelper.openVSS(tboxVSS.Text, tboxUserName.Text, tboxPassword.Text))
30                 {
31                     this.Close();
32                 }
33                 else
34                 {
35                     //if (MessageBox.Show(messboxText[0], "错误", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) != DialogResult.Retry)
36                     //{
37                     //    this.Close();
38                     //}
39                     MessageBox.Show(messboxText[0], "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
40                 }
41             }
42             else
43             {
44                 MessageBox.Show(messboxText[1], "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
45 
46             }
47         }

checkIn,checkOut 使用:

 1         //提交到VSS
 2         void menuItemSubmit2Vss_Click(object sender, System.EventArgs e)
 3         {
 4             if (VSSHelper.checkVSSOpen())
 5             {
 6                 if (VSSHelper.creatSub(treeVwExplorer.SelectedNode.FullPath, "$/"))
 7                 {
 8                     MessageBox.Show("提交成功!", "提示");
 9                 }
10             }
11             else
12             {
13                 MessageBox.Show("您尚未登录VSS\r\n请登录后重试", "错误");
14                 FrmVSSLogin frm = new FrmVSSLogin();
15                 frm.ShowDialog();
16             }
17 
18         }
19         //Get右键菜单处理事件
20         void menuItemGet_Click(object sender, System.EventArgs e)
21         {
22             string vssPath, localPath;
23             if (matchPath(treeVwExplorer.SelectedNode, out vssPath, out localPath))
24             {
25                 bool result = VSSHelper.get(vssPath, localPath);
26             }
27         }
28         //CheckOut右键菜单处理事件
29         void menuItemCheckOut_Click(object sender, System.EventArgs e)
30         {
31             
32             string vssPath, localPath;
33             if (matchPath(treeVwExplorer.SelectedNode, out vssPath, out localPath))
34             {
35                 //bool result = VSSHelper.checkOut(vssPath, localPath);
36                 if (VSSHelper.checkOut(vssPath, localPath))
37                 {
38                     //setTreeNodeColor(treeVwExplorer.SelectedNode, Color.LightBlue);
39                     setTreeNodeImg(treeVwExplorer.SelectedNode, true);
40                 }
41             }
42 
43 
44 
45         }
46         //CheckIn右键菜单处理事件
47         void menuItemCheckIn_Click(object sender, System.EventArgs e)
48         {
49 
50             string vssPath, localPath;
51             if (matchPath(treeVwExplorer.SelectedNode, out vssPath, out localPath))
52             {
53                 //bool result = VSSHelper.checkIn(vssPath, localPath);
54                 if (VSSHelper.checkIn(vssPath, localPath))
55                 {
56                     //setTreeNodeColor(treeVwExplorer.SelectedNode, Color.Transparent);
57                     setTreeNodeImg(treeVwExplorer.SelectedNode, false);
58                 }
59             }
60 
61 
62         }

因为是整理东西翻出来的项目中一小块代码,就不提供打包下载服务了。O(∩_∩)O哈哈~

有需求的直接使用VSSHelper.cs就好。保证可用。

打完收工。

posted @ 2014-11-24 14:21  geeking09  阅读(1753)  评论(10编辑  收藏  举报