.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文件中。
以下是具体内容:(哎,发现自己废话越来越多了,莫非有向唐僧发展的节奏么)
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using SourceSafeTypeLib;
- using System.IO;
- using System.Windows.Forms;
- namespace DockSample
- {
- public static class VSSHelper
- {
- public static string workPath = "";
- private static string root = "$/";
- private static VSSDatabaseClass db = new VSSDatabaseClass();
- /// <summary>
- /// 检查VSS是否打开,已打开返回true,未打开返回false
- /// </summary>
- /// <returns></returns>
- public static bool checkVSSOpen()
- {
- try
- {
- //VSS未提供标志是否打开的字段
- //故调用get_VSSItem方法,若抛出异常代码-2147210253则证明未打开
- //未抛出异常则证明已经打开连接
- VSSItem vssItem = db.get_VSSItem(root, false);
- vssItem = null;
- return true;
- }
- //catch (System.Runtime.InteropServices.COMException comex)
- //{
- // if (comex.ErrorCode == -2147210253)
- // {
- // MessageBox.Show("您尚未登录VSS\r\n请登录后重试", "错误");
- // }
- // return false;
- //}
- catch (Exception ex)
- {
- System.Diagnostics.Debug.WriteLine(ex.Message);
- return false;
- }
- }
- /// <summary>
- /// 打开VSS,返回true成功打开,false未成功打开
- /// </summary>
- /// <param name="vssIniPath"></param>
- /// <param name="user"></param>
- /// <param name="pwd"></param>
- /// <returns></returns>
- public static bool openVSS(string vssIniPath, string user, string pwd)
- {
- try
- {
- //避免重复打开出错
- if (!checkVSSOpen())
- {
- db.Open(vssIniPath, user, pwd);
- }
- else
- {
- MessageBox.Show("连接已经打开\r\n请勿重复打开", "提示");
- }
- #region 测试用代码:
- //creatSub(@"F:\ceshi", root);
- //creat(@"F:\ceshi");
- #endregion
- return true;
- }
- catch (System.Runtime.InteropServices.COMException comex)
- {
- System.Diagnostics.Debug.WriteLine(comex.Message);
- return false;
- }
- catch (Exception ex)
- {
- System.Diagnostics.Debug.WriteLine(ex.Message);
- return false;
- }
- }
- #region 弃用
- //public static void creat(string parentPath)
- //{
- // //if (workPath == string.Empty)
- // //{
- // // return;
- // //}
- // DirectoryInfo dirInfo = new DirectoryInfo(parentPath);
- // try
- // {
- // VSSItem vssItem = db.get_VSSItem(root, false);
- // vssItem.NewSubproject(dirInfo.Name, "created");
- // }
- // catch (Exception ex)
- // {
- // System.Diagnostics.Debug.WriteLine(ex.Message);
- // }
- // creatSub(parentPath, root);
- //}
- #endregion
- public static bool creatSub(string path, string vssRoot)
- {
- if (Directory.Exists(path))
- {
- DirectoryInfo dirInfo = new DirectoryInfo(path);
- FileInfo[] fileInfos = dirInfo.GetFiles();
- DirectoryInfo[] subDirInfos = dirInfo.GetDirectories();
- VSSItem vssItem = db.get_VSSItem(vssRoot, false);
- //将目录中的所有文件(排除.scc文件)添加到VSS中
- foreach (FileInfo fileInfo in fileInfos)
- {
- try
- {
- if (fileInfo.Extension.ToLower() != ".scc")
- {
- //添加本地文件到VSS
- vssItem.Add(fileInfo.FullName, "add", );
- }
- }
- catch (Exception ex)
- {
- System.Diagnostics.Debug.WriteLine(ex.Message);
- return false;
- }
- }
- //使用递归,根据本地目录结构创建VSS工程目录结构
- foreach (DirectoryInfo subDirInfo in subDirInfos)
- {
- try
- {
- //创建VSS子工程(子目录)
- vssItem.NewSubproject(subDirInfo.Name, "created");
- //递归调用,构建当前处理目录的下层目录结构(工程结构)
- if (!creatSub(subDirInfo.FullName, vssRoot + subDirInfo.Name + "/"))
- {
- return false;
- }
- }
- catch (Exception ex)
- {
- System.Diagnostics.Debug.WriteLine(ex.Message);
- return false;
- }
- }
- return true;
- }
- else
- {
- MessageBox.Show("目录:" + path + " 不存在", "错误");
- return false;
- }
- }
- public static bool checkOut(string vssPath, string localPath)
- {
- return exeCMD(vssPath, localPath, "checkout");
- #region 舍弃
- //try
- //{
- // VSSItem vssitem = db.get_VSSItem(vssPath, false);
- // //Type==0 项目文件夹,Type==1 项目文件
- // //若当前checkout的是单个文件,则checkout后直接返回
- // if (vssitem.Type == 1)
- // {
- // vssitem.Checkout("checkout", localPath, 0);
- // return true;
- // }
- // //若checkout的是一个目录,则递归目录下的所有文件,
- // //包括子目录中的文件。并把所有文件checkout
- // IVSSItems ivssitems = vssitem.get_Items(false);
- // //防止Path结构错误
- // localPath = localPath.EndsWith(@"\") ? localPath : localPath + @"\";
- // vssPath = vssPath.EndsWith("/") ? vssPath : vssPath + "/";
- // foreach (IVSSItem ivssitem in ivssitems)
- // {
- // if (ivssitem.Type == 1)
- // {
- // //项目文件,直接checkout
- // ivssitem.Checkout("checkout", localPath + ivssitem.Name, 0);
- // }
- // else if (ivssitem.Type == 0)
- // {
- // //项目文件夹,递归调用checkOut函数
- // bool temp = checkOut(vssPath + ivssitem.Name, localPath + ivssitem.Name);
- // if (!temp)
- // {
- // return false;
- // }
- // }
- // }
- // return true;
- //}
- //catch (Exception ex)
- //{
- // System.Diagnostics.Debug.WriteLine(ex.Message);
- // return false;
- //}
- #endregion
- }
- private static bool exeCMD(string vssPath, string localPath, string cmd)
- {
- try
- {
- VSSItem vssitem = db.get_VSSItem(vssPath, false);
- //Type==0 项目文件夹,Type==1 项目文件
- if (vssitem.Type == )
- {
- switch (cmd.ToLower())
- {
- case "checkout":
- if (vssitem.IsCheckedOut == )
- {
- vssitem.Checkout(cmd, localPath, );
- return true;
- }
- MessageBox.Show("请勿重复CheckOut", "提示");
- return false;
- case "checkin":
- if (vssitem.IsCheckedOut != )
- {
- vssitem.Checkin(cmd, localPath, );
- return true;
- }
- MessageBox.Show("请先CheckOut", "提示");
- return false;
- case "get":
- vssitem.Get(ref localPath, );
- return true;
- default:
- break;
- }
- }
- IVSSItems ivssitems = vssitem.get_Items(false);
- //防止Path结构错误
- localPath = localPath.EndsWith(@"\") ? localPath : localPath + @"\";
- vssPath = vssPath.EndsWith("/") ? vssPath : vssPath + "/";
- foreach (IVSSItem ivssitem in ivssitems)
- {
- if (ivssitem.Type == ) //项目文件
- {
- string tmpLocalPath = localPath + ivssitem.Name;
- switch (cmd.ToLower())
- {
- case "checkout":
- if (ivssitem.IsCheckedOut == )
- {
- ivssitem.Checkout(cmd, tmpLocalPath, );
- }
- break;
- case "checkin":
- if (ivssitem.IsCheckedOut != )
- {
- ivssitem.Checkin(cmd, tmpLocalPath, );
- }
- break;
- case "get":
- ivssitem.Get(ref tmpLocalPath, );
- break;
- default:
- break;
- }
- }
- else if (ivssitem.Type == ) //项目文件夹
- {
- //递归调用checkin函数
- bool temp = exeCMD(vssPath + ivssitem.Name, localPath + ivssitem.Name, cmd);
- if (!temp)
- {
- return false;
- }
- }
- }
- return true;
- }
- catch (System.Runtime.InteropServices.COMException comex)
- {
- if (comex.ErrorCode == -)
- {
- MessageBox.Show("您尚未登录VSS\r\n请登录后重试", "错误");
- FrmVSSLogin frm = new FrmVSSLogin();
- frm.ShowDialog();
- }
- return false;
- }
- catch (Exception ex)
- {
- System.Diagnostics.Debug.WriteLine(ex.Message);
- return false;
- }
- }
- public static bool checkIn(string vssPath, string localPath)
- {
- return exeCMD(vssPath, localPath, "checkin");
- #region 舍弃
- //try
- //{
- // VSSItem vssitem = db.get_VSSItem(vssPath, false);
- // if (vssitem.Type == 1)
- // {
- // //IsCheckedOut==0 未checkout
- // //若被checkout,则checkin
- // if (vssitem.IsCheckedOut != 0)
- // {
- // //vssitem.
- // vssitem.Checkin("checkin", localPath, 0);
- // return true;
- // }
- // }
- // IVSSItems ivssitems = vssitem.get_Items(false);
- // //防止Path结构错误
- // localPath = localPath.EndsWith(@"\") ? localPath : localPath + @"\";
- // vssPath = vssPath.EndsWith("/") ? vssPath : vssPath + "/";
- // foreach (IVSSItem ivssitem in ivssitems)
- // {
- // if (ivssitem.Type == 1)
- // {
- // if (ivssitem.IsCheckedOut != 0)
- // {
- // ivssitem.Checkin("checkin", localPath + ivssitem.Name, 0);
- // }
- // }
- // else if (ivssitem.Type == 0)
- // {
- // //项目文件夹,递归调用checkin函数
- // bool temp = checkIn(vssPath + ivssitem.Name, localPath + ivssitem.Name);
- // if (!temp)
- // {
- // return false;
- // }
- // }
- // }
- // return true;
- //}
- //catch (Exception ex)
- //{
- // System.Diagnostics.Debug.WriteLine(ex.Message);
- // return false;
- //}
- #endregion
- }
- public static bool get(string vssPath, string localPath)
- {
- return exeCMD(vssPath, localPath, "get");
- }
- #region 弃用
- //public static bool checkOut(string vssPath, string localPath, string selectFileName)
- //{
- // try
- // {
- // VSSItem vssitem = db.get_VSSItem(vssPath, false);
- // IVSSItems ivssitems = vssitem.get_Items(false);
- // localPath = localPath.EndsWith(@"\") ? localPath : localPath + @"\";
- // foreach (IVSSItem ivssitem in ivssitems)
- // {
- // if (ivssitem.Name == selectFileName)
- // {
- // ivssitem.Checkout("checkout", localPath + ivssitem.Name, 0);
- // }
- // }
- // return true;
- // }
- // catch (Exception ex)
- // {
- // System.Diagnostics.Debug.WriteLine(ex.Message);
- // return false;
- // }
- //}
- #endregion
- }
- }
每个函数就不讲了,主要是分清vsspath和localpath的区别。
简单登陆
- private void btnBrowse_Click(object sender, EventArgs e)
- {
- OpenFileDialog ofd = new OpenFileDialog()
- {
- Filter = "VSS配置文件|*.ini",
- Title = "打开VSS数据库文件"
- };
- if (ofd.ShowDialog() == DialogResult.OK)
- {
- tboxVSS.Text = ofd.FileName;
- }
- }
- private void btnLogin_Click(object sender, EventArgs e)
- {
- string[] messboxText ={
- "VSS打开错误!\r\n请检查配置重试。",
- "VSS配置文件不存在!"
- };
- if (tboxVSS.Text == "")
- {
- return;
- }
- if (System.IO.File.Exists(tboxVSS.Text))
- {
- //打开VSS
- if (VSSHelper.openVSS(tboxVSS.Text, tboxUserName.Text, tboxPassword.Text))
- {
- this.Close();
- }
- else
- {
- //if (MessageBox.Show(messboxText[0], "错误", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) != DialogResult.Retry)
- //{
- // this.Close();
- //}
- MessageBox.Show(messboxText[], "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
- else
- {
- MessageBox.Show(messboxText[], "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
checkIn,checkOut 使用:
- //提交到VSS
- void menuItemSubmit2Vss_Click(object sender, System.EventArgs e)
- {
- if (VSSHelper.checkVSSOpen())
- {
- if (VSSHelper.creatSub(treeVwExplorer.SelectedNode.FullPath, "$/"))
- {
- MessageBox.Show("提交成功!", "提示");
- }
- }
- else
- {
- MessageBox.Show("您尚未登录VSS\r\n请登录后重试", "错误");
- FrmVSSLogin frm = new FrmVSSLogin();
- frm.ShowDialog();
- }
- }
- //Get右键菜单处理事件
- void menuItemGet_Click(object sender, System.EventArgs e)
- {
- string vssPath, localPath;
- if (matchPath(treeVwExplorer.SelectedNode, out vssPath, out localPath))
- {
- bool result = VSSHelper.get(vssPath, localPath);
- }
- }
- //CheckOut右键菜单处理事件
- void menuItemCheckOut_Click(object sender, System.EventArgs e)
- {
- string vssPath, localPath;
- if (matchPath(treeVwExplorer.SelectedNode, out vssPath, out localPath))
- {
- //bool result = VSSHelper.checkOut(vssPath, localPath);
- if (VSSHelper.checkOut(vssPath, localPath))
- {
- //setTreeNodeColor(treeVwExplorer.SelectedNode, Color.LightBlue);
- setTreeNodeImg(treeVwExplorer.SelectedNode, true);
- }
- }
- }
- //CheckIn右键菜单处理事件
- void menuItemCheckIn_Click(object sender, System.EventArgs e)
- {
- string vssPath, localPath;
- if (matchPath(treeVwExplorer.SelectedNode, out vssPath, out localPath))
- {
- //bool result = VSSHelper.checkIn(vssPath, localPath);
- if (VSSHelper.checkIn(vssPath, localPath))
- {
- //setTreeNodeColor(treeVwExplorer.SelectedNode, Color.Transparent);
- setTreeNodeImg(treeVwExplorer.SelectedNode, false);
- }
- }
- }
因为是整理东西翻出来的项目中一小块代码,就不提供打包下载服务了。O(∩_∩)O哈哈~
有需求的直接使用VSSHelper.cs就好。保证可用。
打完收工。
.net中操作Visual SourceSafe的更多相关文章
- Microsoft Visual SourceSafe
Microsoft Visual SourceSafe是美国微软公司出品的版本控制系统,简称VSS.软件支持Windows系统所支持的所有文件格式,兼容Check out-Modify-Check i ...
- visual studio 2010 和 VSS(Visual SourceSafe)的连接使用
visual studio 2010 和 VSS(Visual SourceSafe)的连接使用 1. 在visual vstudio中选择使用VSS插件: 2. 使用VSS进行源码管理: ...
- c#中操作word文档-四、对象模型
转自:http://blog.csdn.net/ruby97/article/details/7406806 Word对象模型 (.Net Perspective) 本文主要针对在Visual St ...
- C#中操作WMI的类库-实现远程登录共享
WMI是Windows Management Instrumentation的简称,即:视窗管理规范.在Windows 2000或以后的版本中均安装得有,NT4.0则需要安装WMI的核心组件.通过WM ...
- 【译】在Asp.Net中操作PDF – iTextSharp - 使用表格
原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用表格 使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观.本篇文章并 ...
- 【译】在Asp.Net中操作PDF – iTextSharp-列表
原文 [译]在Asp.Net中操作PDF – iTextSharp-列表 在前文中,我们已经知道了如何利用iTextSharp创建PDF文档,设置字体样式和风格.本文开始讲述iTextSharp中的有 ...
- VS2017远程调试C#或 Visual Studio 中的 Visual Basic 项目
来源:远程调试C#或 Visual Studio 中的 Visual Basic 项目 若要调试已部署在另一台计算机的 Visual Studio 应用程序,安装和在其中部署您的应用程序的计算机上运行 ...
- Microsoft Visual SourceSafe 6.0 无法关联项目
最近遇到Microsoft Visual SourceSafe 6.0 安装好以后, 无法关联项目,导致无法进行版本控制,研究以后,发现需要运行一个程序,在安装目录下 ..\Visual Source ...
- Python中操作mysql的pymysql模块详解
Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...
随机推荐
- django复习-3-请求与响应
一.请求request 前端向后端传递参数有几种方式? 提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取: "http://127. ...
- JS中 map, filter, some, every, forEach, for in, for of 用法总结
本文转载自:http://blog.csdn.net/gis_swb/article/details/52297343 1.map 有返回值,返回一个新的数组,每个元素为调用func的结果. let ...
- python第三十课--异常(else讲解)
演示else语句和异常处理机制结合使用 try: print('try...') print(10/0) except: print('except...') else: print('else... ...
- Oracle create tablespace 创建表空间语法详解
CREATE [UNDO] TABLESPACE tablespace_name [DATAFILE datefile_spec1 [,datefile_spec2] ...... ...
- 分享四个 Linux 上的网络信息嗅探工具
在计算机网络中,数据是暴露的,因为数据包传输是无法隐藏的,所以让我们来使用 whois.dig.nmcli和 nmap 这四个工具来嗅探网络吧. 请注意,不要在不属于自己的网络上运行 nmap ,因为 ...
- 【转】SQL 常用关键字释义和用法
转自: http://blog.csdn.net/iamwangch/article/details/8093933 下面 是 从网络上整理 出来的 SQL 关键字和 常用函数的 释义和简单用 ...
- 检测QQ在线状态脚本(20141022测试成功)
import time,datetime import urllib2 def chk_qq(qqnum): chkurl = 'http://wpa.paipai.com/pa?p=1:'+`qqn ...
- kafka 部署
Windows平台kafka环境的搭建 https://blog.csdn.net/u010054969/article/details/70241478
- odoo 打印格式中 打印第一个数据默认
<table style="width:100%;"> <tr> <td style="word-wrap:break-word;width ...
- [SDOI2009]HH的项链 BZOJ1878
分析: 听说是莫队裸题,很显然,我并不喜欢莫队. 我们可以考虑将询问离线,以右端点排序,之后从1枚举到n,依次树状数组中修改i和last[i],之后当i==询问的右节点时,find一下答案就可以了. ...