最近整理一些资料,发现以前写的一段代码,提供对微软的版本管理软件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. vue2.0学习笔记之路由(二)路由嵌套

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. bower包管理工具

    安装: npm install bower -g (全局安装) 验证: bower --version 指令( 以vue为例 ): 1.  bower info vue              查看 ...

  3. [CTSC2018]混合果汁

    题目连接:https://www.luogu.org/problemnew/show/P4602 因为题中说是让最小值最大,所以自然想到二分答案.对于每一个二分的值,判断是否合法,若合法,在右区间二分 ...

  4. Spark项目之电商用户行为分析大数据平台之(十)IDEA项目搭建及工具类介绍

    一.创建Maven项目 创建项目,名称为LogAnalysis 二.常用工具类 2.1 配置管理组建 ConfigurationManager.java import java.io.InputStr ...

  5. Redux入门学习

    一.Redux三大原则 1. 单一数据源 应用中所有的state都以一个对象树的形式储存在一个单一的store中. 2. state只读 唯一改变state的办法是触发action.action是一个 ...

  6. HDU1754

    https://vjudge.net/contest/66989#problem/B 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜 ...

  7. 安装ubuntu系统 ——分区

    安装ubuntu 系统主要分四个区 目录 建议大小 格式 描述 / 10G-20G ext4 根目录 swap <2048M swap 交换空间 /boot 400M左右 ext4 Linux的 ...

  8. 树莓派学习笔记(5):成功实现NAS家庭服务器(流媒体播放、文件共享及下载机)

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyiQQ群:64770604 一.家庭服务器实现的主要功能 1.流媒体播放服务:利用DLNA实现电视.手机.电脑播放其上面 ...

  9. Android解决自定义View获取不到焦点的情况

    引言: 我们在使用Android View或者SurfaceView进行图形绘制,可以绘制各种各样我们喜欢的图形,然后满怀信心的给我们的View加上onTouchEvent.onKeyDown.onK ...

  10. 网络运营商名称显示&amp;SIM名称显示

    一 网络名称显示这部分比較复杂.Spec对这也有明白的规定,依据其优先级由高往低介绍(其优先级參考TS 22.101), 1.       Enhanced Operator Name String. ...