.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", 0);
                        }

                    }
                    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 == 1)
                {
                    switch (cmd.ToLower())
                    {
                        case "checkout":
                            if (vssitem.IsCheckedOut == 0)
                            {
                                vssitem.Checkout(cmd, localPath, 0);
                                return true;
                            }
                            MessageBox.Show("请勿重复CheckOut", "提示");
                            return false;
                        case "checkin":
                            if (vssitem.IsCheckedOut != 0)
                            {
                                vssitem.Checkin(cmd, localPath, 0);
                                return true;
                            }
                            MessageBox.Show("请先CheckOut", "提示");
                            return false;
                        case "get":
                            vssitem.Get(ref localPath, 0);
                            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 == 1)     //项目文件
                    {
                        string tmpLocalPath = localPath + ivssitem.Name;
                        switch (cmd.ToLower())
                        {
                            case "checkout":
                                if (ivssitem.IsCheckedOut == 0)
                                {
                                    ivssitem.Checkout(cmd, tmpLocalPath, 0);
                                }
                                break;
                            case "checkin":
                                if (ivssitem.IsCheckedOut != 0)
                                {
                                    ivssitem.Checkin(cmd, tmpLocalPath, 0);
                                }
                                break;
                            case "get":
                                ivssitem.Get(ref tmpLocalPath, 0);
                                break;
                            default:
                                break;
                        }
                    }
                    else if (ivssitem.Type == 0)    //项目文件夹
                    {
                        //递归调用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 == -2147210253)
                {
                    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

    }
}
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[0], "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show(messboxText[1], "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
        }
时间: 2024-10-27 08:00:10

.net中操作Visual SourceSafe的相关文章

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

转自:http://blog.csdn.net/ruby97/article/details/7406806 Word对象模型  (.Net Perspective) 本文主要针对在Visual Studio中使用C# 开发关于Word的应用程序 来源:Understandingthe Word Object Model from a .NET Developer's Perspective 五大对象 Application           :代表Microsoft Word应用程序本身 D

WinServer2008r2 IIS7 手动布署“Microsoft Visual SourceSafe (Internet)”

前言:布署VSS2005,供互联网访问.教程用于 VSS2005 不能在 IIS7及以上版本中自动布署SourceSafe的情况 前提条件: 1.已有VSS数据库 2.已有可以访问的 https 站点: 3.IIS7需要安装 WebDAV: 布署步骤:1.将VSS数据库所在目录设置共享(共享名以“vss2005”为例),并将共享权限设置为 Everyone:完全控制.可通过 \\LocalHost\vss2005 正常访问即可 2.打开srcsafe.ini,添加两个配置项,并保存 Downlo

webBrowser中操作网页元素全攻略

webBrowser中操作网页元素全攻略 2012-12-20 14:21 188人阅读 评论(0) 收藏 举报 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBrowser1.Document.GetElementById("控件ID").InnerText; 或webBrowser1.Document.GetElementById("控件ID").GetAttr

C#.Net中操作XML方法一

我们知道XML是一种可标记性的语言,用来标记数据.定义数据类型,是一种执行用户对自己的标记语言进行定义的源语言.由于结构好.而且easy理解,就好比一棵树,层次关系分明,因此也经常把一些数据存储到XML文件里,以下就说一下怎样在C#中操作XML文件. 经常使用类 XmlDocument:XML的文档.就好比一棵树. XmlNode:XML中的结点类,就好比树枝. XmlElement:XML中元素,就好比树枝上的叶子. 既然我们已经了解这几个经常使用类的,那么让你画一棵树是不是非常easy呢?

C#中操作Word(1)—— word对象模型介绍

一.开发环境布置 C#中添加对Word的支持,只需添加对Microsoft.Office.Interop.Word的命名空间,如下图所示,右键点击“引用”,在弹出的“添加引用”对话框中选中COM标签页,找到“Microsoft Word 12.0 Object Library”. 点击确定按钮后,可在引用中添加显示名称为Microsoft.Office.Interop.Word的引用: 二.Word的对象模型介绍 Word中共有5种常用的对象模型:应用程序对象Application.文档对象Do

在子页面中操作模板页的内容

Button btn=(Button)this.Master.FindControl("Button1"); btn.Visible=false; 模板页中要注意html控件的url问题 ResolveClientUrl:获得相对路径 ResolveUrl:相对于跟目录的路径 在子页面中操作模板页的内容,布布扣,bubuko.com

在Action中操作域对象

----------------------siwuxie095 在 Action 中操作域对象 1.在 Action 中可以操作的域对象主要有三个: (1)Request (2)Session (3)ServletContext 「PageContext 域对象用于页面中,而非 Action 中」 2.使用 ServletActionContext 类进行操作 // 操作三个域对象 // (1) Request 对象 HttpServletRequest request=ServletActi

WPF中的Visual Tree和Logical Tree与路由事件

1.Visual Tree和Logical TreeLogical Tree:逻辑树,WPF中用户界面有一个对象树构建而成,这棵树叫做逻辑树,元素的声明分层结构形成了所谓的逻辑树!!Visual Tree:可视树(也叫视觉树),可视树是对逻辑树的扩展,可视树将逻辑树的节点打散,分放到核心棵树组件中,它表述了一些详细的可视化实现,而不是把每个元素当做一个”黑盒“.我们以一个简单的程序来观察下逻辑树与可视树: <Window x:Class="WpfApplication28.MainWind

怎样在一个fragment or 随意类中操作还有一个fragment中的方法

1 怎样在acitivty中运行fragment中的方法: 首先获得这个Fragment的对象 xxxFragment fragmentObject = (xxxFragment) getFragmentManager.findFragmentByTag("xx"); 2 怎样在Fragment中运行activity中的方法: 第一种:让acitivity继承接口 另外一种:在fragment中使用getActivity()可是要加上acitivity的名字,即: ((MainActi