最近整理一些资料,发现以前写的一段代码,提供对微软的版本管理软件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. [LOJ 6029]「雅礼集训 2017 Day1」市场

    [LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...

  2. ArcGIS pro2.3中添加天地图底图

    应用背景: 很多时候,我们需要使用网络上的遥感影像或者百度地图.天地图等在线地图做一些矢量化工作或者其他. 笔者见过很多人都是把百度地图截图,然后把图片导如Arcmap或者Arcgis pro中,然后 ...

  3. 金三银四求职季,前端面试题小梳理(HTML、CSS、JS)

    好久没写学习记录,最近太多事,又到一年求职季,都说金三银四求职季,自己也做一下最近学习的一些前端面试题梳理,还是个小白,写的不对请指正,不胜感激. HTML篇 html语义化 用语义化的代码标签书写, ...

  4. 禁止选择DIV内的文本(css,js写法)

    css:<span style="font-family:SimSun;font-size:18px;">/* 禁止选择div内的文字 */ #hall_body { ...

  5. tcp尽快尽快了

    看的撒积分卡拉斯的放假啊的顺口溜

  6. 各种SQL查询技巧汇总 (转)

    原文地址: https://blog.csdn.net/tim_phper/article/details/54963828 select select * from student; all 查询所 ...

  7. QT学习笔记8:QDir类及其用法总结

    简介 QDir类提供了访问系统目录结构及其内容的与平台无关的方式. 头文件:#include <qdir.h> QDir类用来操作路径名及底层文件系统,获取关于目录路径及文件的相关信息,也 ...

  8. WorldWind源码剖析系列:星球球体的加载与渲染

    WorldWind源码剖析系列:星球球体的加载与渲染 WorldWind中主函数Main()的分析 在文件WorldWind.cs中主函数Main()阐明了WorldWind的初始化运行机制(如图1所 ...

  9. leetcode650—2 Keys Keyboard

    Initially on a notepad only one character 'A' is present. You can perform two operations on this not ...

  10. PAT B1006 换个格式输出整数 (15 分)

    让我们用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<),换个格式来输出任一个不超过 3 位的正整数.例如 234 应该被输出为 BBSSS123 ...