用C#去除代码的SourceSafe管理
作者:秋枫
经常看一些的程序,有些一个解决方案带有多个项目,由于代码比较多,多人开发,所以好多vs.net下的工程是用source safe进行版本控制的。而用source safe进行版本控制需要局域网路径共享,因此好多项目换一台机器打开会出现一些问题,比如“解决方案看起来是受源代码管理,但无法找到它的绑定信息……”之类的提示信息很多。有时候修改了代码还保存不了,所以想把他去掉,下面是对项目管理前后的一些对比。
一、工程项目比较
同没有受Source Safe代码管理的工程相比:
1. 多出了.scc、.vssscc和.vspscc文件;
2. C#项目文件(.csproj)里面添加了几行标签:
SccProjectName = "SAK"
SccLocalPath = "SAK"
SccAuxPath = "SAK"
SccProvider = "SAK"
3.在解决方案文件(.sln)中,中增加了如下节点原素:
GlobalSection(SourceCodeControl) = preSolution
SccNumberOfProjects = 4
SccLocalPath0 = .
……
SccLocalPath3 = SUBSCRIBE_TOOLS
CanCheckoutShared = false
EndGlobalSection
二、编写实现的类
既然文件增多了,还有有些文件被修改,所以想通过编程把他修改回原样,这样可能可以去掉那些提示信息,所以就写了下面的代码。
//**********************************************************
// 程序:郑佐 zhzuocn@163.com 2004/06/10
// 功能:去除C#.net的原代码Source safe 管理
//**********************************************************
using System;
using System.IO;
using System.Text;
using System.Threading;
namespace ZZ
{
/// <summary>
/// 操作信息事件代理
/// </summary>
public delegate void OperateNotifyHandler(object sender,VssEventArgs e);
/// <summary>
/// VssConverter 处理解决方案或项目的SourceSafe关联。
/// </summary>
public class VssConverter
{
//操作根目录
private string operatePath;
/// <summary>
/// 操作信息事件
/// </summary>
public event OperateNotifyHandler OperateNotify;
/// <summary>
/// 线程结束通知事件
/// </summary>
public event EventHandler ThreadCompleted;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="operatePath">项目路径</param>
public VssConverter(string operatePath)
{
this.operatePath = operatePath;
}
OperatePath属性,用来设置或获取当前需要处理的工程路径,不过在运行时最好不要设置他,
/// <summary>
/// 设置解决方案工程路径
/// </summary>
public string OperatePath
{
get{return this.operatePath;}
set{this.operatePath = value;}
}
下面是一个public 修饰符的函数,也是类实例的惟一对外公开的方法,里面用了两个线程来分别删除文件和修改文件。
/// <summary>
/// 去除Source Safe代码管理
/// </summary>
public void RemoveVss()
{
Thread deleteThread = new Thread(new ThreadStart(DeleteVssFile));
Thread RemoveVssIdentifyThread = new Thread(new ThreadStart(RemoveVssIdentify));
deleteThread.Start();
RemoveVssIdentifyThread.Start();
}
后来测试了一下deleteThread的完成要比RemoveVssIdentifyThread快一些,当然也可以再开一个线程来分担文件的修改,不过这里需要注意的是好多文件是带只读属性的,所以还要把文件属性设置成Normal才能顺利完成操作,否则会抛出异常。
这里使用了递归来删除相关文件,由三个函数构成:
/// <summary>
/// 线程委托函数,完成删除"*.scc","*.vssscc"以及*.vspscc文件功能。
/// </summary>
private void DeleteVssFile()
{
DeleteVssFile(this.operatePath);
//通知删除文件结束
OnThreadCompleted(this,new Ev