最近整理一些资料,发现以前写的一段代码,提供对微软的版本管理软件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的更多相关文章

  1. Microsoft Visual SourceSafe

    Microsoft Visual SourceSafe是美国微软公司出品的版本控制系统,简称VSS.软件支持Windows系统所支持的所有文件格式,兼容Check out-Modify-Check i ...

  2. visual studio 2010 和 VSS(Visual SourceSafe)的连接使用

    visual studio 2010 和 VSS(Visual SourceSafe)的连接使用 1. 在visual vstudio中选择使用VSS插件: 2.       使用VSS进行源码管理: ...

  3. c#中操作word文档-四、对象模型

    转自:http://blog.csdn.net/ruby97/article/details/7406806 Word对象模型  (.Net Perspective) 本文主要针对在Visual St ...

  4. C#中操作WMI的类库-实现远程登录共享

    WMI是Windows Management Instrumentation的简称,即:视窗管理规范.在Windows 2000或以后的版本中均安装得有,NT4.0则需要安装WMI的核心组件.通过WM ...

  5. 【译】在Asp.Net中操作PDF – iTextSharp - 使用表格

    原文 [译]在Asp.Net中操作PDF – iTextSharp - 使用表格 使用Asp.Net生成PDF最常用的元素应该是表格,表格可以帮助比如订单或者发票类型的文档更加格式化和美观.本篇文章并 ...

  6. 【译】在Asp.Net中操作PDF – iTextSharp-列表

    原文 [译]在Asp.Net中操作PDF – iTextSharp-列表 在前文中,我们已经知道了如何利用iTextSharp创建PDF文档,设置字体样式和风格.本文开始讲述iTextSharp中的有 ...

  7. VS2017远程调试C#或 Visual Studio 中的 Visual Basic 项目

    来源:远程调试C#或 Visual Studio 中的 Visual Basic 项目 若要调试已部署在另一台计算机的 Visual Studio 应用程序,安装和在其中部署您的应用程序的计算机上运行 ...

  8. Microsoft Visual SourceSafe 6.0 无法关联项目

    最近遇到Microsoft Visual SourceSafe 6.0 安装好以后, 无法关联项目,导致无法进行版本控制,研究以后,发现需要运行一个程序,在安装目录下 ..\Visual Source ...

  9. Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...

随机推荐

  1. Oracle 导出用户下的所有索引创建语句

    SELECT dbms_lob.substr(dbms_metadata.get_ddl('INDEX', INDEX_NAME))||';'  from dba_indexes where owne ...

  2. UI(四)之拓扑图创建

    关键函数: 1.LoadMap void CTopology::LoadMap() { //m_map.RemoveAllLayers(); AddLayersBasemap(); //AddLaye ...

  3. git pull与本地修改冲突

    1.先将本地修改存储起来 $ git stash 这样本地的所有修改就都被暂时存储起来 . $ git stash list                 可以看到保存的信息: git stash暂 ...

  4. HTML DOM item() 方法

    一直不知道javascript还有类似jQ里面eq()的函数,原来原生javascript的item()有类似功能: 由于是原生javascript,先补习下children和childNodes的区 ...

  5. php可逆加密解密函数

    很多PHP程序员调试使用echo.print_r().var_dump().printf()等,虽然对于有较丰富开发经验的程序员来说这些也已经足够了,他们往往可以在程序执行的过程中,通过输出特定变量的 ...

  6. Thinkphp5.0分页和跳页

    后台查询商品或者会员量需要用到分页展示列表,当页数比较多的时候为了体高用户体验度,需要添加一个跳页也就是手动输入页码数进行快速跳转指定页面.由于手动编写分页比较麻烦,又想使用TP5自带的分页,但是TP ...

  7. Jquery分页组件

    最近工作不是很忙,所以就看看淘宝kissy分页组件源码,感觉代码也不怎么难 容易理解,所以就按照他们的思路自己重新理一遍,来加深自己对他们的理解,同时对他们的分页组件进行一些重构(因为他们分页是做好了 ...

  8. java过滤器filter使用

    一:filter:过滤器,拦截servlet的请求和响应. 1. package jd.com.filter; import javax.servlet.*; import java.io.IOExc ...

  9. Jmeter—开篇

    Jmeter以开源.轻便著称,做接口测试.性能测试都可以借助Jmeter,从这篇开始记录我使用到的Jmeter功能. 安装 Jmeter官网:http://jmeter.apache.org/ 去官网 ...

  10. Linux服务器安全之 fail2ban的安装与配置

    近日在查看Nginx的访问日志中,发现了大量404请求,仔细研究一番发现有人正在试图爆破网站. 我刚上线你就企图攻击我?????? 这怎么能忍.. 于是乎 --- 查资料后得知有一个神奇的工具 fai ...