.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而后者不支持 ...
随机推荐
- Oracle 导出用户下的所有索引创建语句
SELECT dbms_lob.substr(dbms_metadata.get_ddl('INDEX', INDEX_NAME))||';' from dba_indexes where owne ...
- UI(四)之拓扑图创建
关键函数: 1.LoadMap void CTopology::LoadMap() { //m_map.RemoveAllLayers(); AddLayersBasemap(); //AddLaye ...
- git pull与本地修改冲突
1.先将本地修改存储起来 $ git stash 这样本地的所有修改就都被暂时存储起来 . $ git stash list 可以看到保存的信息: git stash暂 ...
- HTML DOM item() 方法
一直不知道javascript还有类似jQ里面eq()的函数,原来原生javascript的item()有类似功能: 由于是原生javascript,先补习下children和childNodes的区 ...
- php可逆加密解密函数
很多PHP程序员调试使用echo.print_r().var_dump().printf()等,虽然对于有较丰富开发经验的程序员来说这些也已经足够了,他们往往可以在程序执行的过程中,通过输出特定变量的 ...
- Thinkphp5.0分页和跳页
后台查询商品或者会员量需要用到分页展示列表,当页数比较多的时候为了体高用户体验度,需要添加一个跳页也就是手动输入页码数进行快速跳转指定页面.由于手动编写分页比较麻烦,又想使用TP5自带的分页,但是TP ...
- Jquery分页组件
最近工作不是很忙,所以就看看淘宝kissy分页组件源码,感觉代码也不怎么难 容易理解,所以就按照他们的思路自己重新理一遍,来加深自己对他们的理解,同时对他们的分页组件进行一些重构(因为他们分页是做好了 ...
- java过滤器filter使用
一:filter:过滤器,拦截servlet的请求和响应. 1. package jd.com.filter; import javax.servlet.*; import java.io.IOExc ...
- Jmeter—开篇
Jmeter以开源.轻便著称,做接口测试.性能测试都可以借助Jmeter,从这篇开始记录我使用到的Jmeter功能. 安装 Jmeter官网:http://jmeter.apache.org/ 去官网 ...
- Linux服务器安全之 fail2ban的安装与配置
近日在查看Nginx的访问日志中,发现了大量404请求,仔细研究一番发现有人正在试图爆破网站. 我刚上线你就企图攻击我?????? 这怎么能忍.. 于是乎 --- 查资料后得知有一个神奇的工具 fai ...