.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而后者不支持 ...
随机推荐
- [LOJ 6029]「雅礼集训 2017 Day1」市场
[LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...
- ArcGIS pro2.3中添加天地图底图
应用背景: 很多时候,我们需要使用网络上的遥感影像或者百度地图.天地图等在线地图做一些矢量化工作或者其他. 笔者见过很多人都是把百度地图截图,然后把图片导如Arcmap或者Arcgis pro中,然后 ...
- 金三银四求职季,前端面试题小梳理(HTML、CSS、JS)
好久没写学习记录,最近太多事,又到一年求职季,都说金三银四求职季,自己也做一下最近学习的一些前端面试题梳理,还是个小白,写的不对请指正,不胜感激. HTML篇 html语义化 用语义化的代码标签书写, ...
- 禁止选择DIV内的文本(css,js写法)
css:<span style="font-family:SimSun;font-size:18px;">/* 禁止选择div内的文字 */ #hall_body { ...
- tcp尽快尽快了
看的撒积分卡拉斯的放假啊的顺口溜
- 各种SQL查询技巧汇总 (转)
原文地址: https://blog.csdn.net/tim_phper/article/details/54963828 select select * from student; all 查询所 ...
- QT学习笔记8:QDir类及其用法总结
简介 QDir类提供了访问系统目录结构及其内容的与平台无关的方式. 头文件:#include <qdir.h> QDir类用来操作路径名及底层文件系统,获取关于目录路径及文件的相关信息,也 ...
- WorldWind源码剖析系列:星球球体的加载与渲染
WorldWind源码剖析系列:星球球体的加载与渲染 WorldWind中主函数Main()的分析 在文件WorldWind.cs中主函数Main()阐明了WorldWind的初始化运行机制(如图1所 ...
- leetcode650—2 Keys Keyboard
Initially on a notepad only one character 'A' is present. You can perform two operations on this not ...
- PAT B1006 换个格式输出整数 (15 分)
让我们用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<),换个格式来输出任一个不超过 3 位的正整数.例如 234 应该被输出为 BBSSS123 ...