`
love19820823
  • 浏览: 974304 次
文章分类
社区版块
存档分类
最新评论

用C#去除代码的SourceSafe管理

 
阅读更多
经常看一些的程序,有些一个解决方案带有多个项目,由于代码比较多,多人开发,所以好多vs.net下的工程是用source safe进行版本控制的。而用sourcesafe进行版本控制需要局域网路径共享,因此好多项目换一台机器打开会出现一些问题,比如“解决方案看起来是受源代码管理,但无法找到它的绑定信息……”之类的提示信息很多。有时候修改了代码还保存不了,所以想把他去掉,下面是对项目管理前后的一些对比。


一、工程项目比较

同没有受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



二、编写实现的类

既然文件增多了,还有有些文件被修改,所以想通过编程把他修改回原样,这样可能可以去掉那些提示信息,所以就写了下面的代码。


//**********************************************************

// 功能:去除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 EventArgs());

}

/// <summary>

/// 递归函数,删除"*.scc","*.vssscc"以及*.vspscc文件。

/// </summary>

/// <param name="path">当前处理路径</param>

private void DeleteVssFile(string path)

{

DeleteFile(Directory.GetFiles(path,"*.scc"));

DeleteFile(Directory.GetFiles(path,"*.vssscc"));

DeleteFile(Directory.GetFiles(path,"*.vspscc"));

foreach(string dir in Directory.GetDirectories(path))

DeleteVssFile(dir);

}

/// <summary>

/// 删除文件,真正删除文件

/// </summary>

/// <param name="files"></param>

private void DeleteFile(string [] files)

{

foreach(string file in files)

{

FileInfo fi = new FileInfo(file);

fi.Attributes = FileAttributes.Normal;

File.Delete(file);

OnOperateNotify(this,new VssEventArgs(file+"删除完成"));

}

}

对于".sln"解决方案文件和".csproj’"C#项目文件的修改也采用了递归实现:


/// <summary>

/// 线程委托函数,去除"*.sln"解决方案文件和"*.csproj"C#项目文件的.Vss关联标签。

/// </summary>

private void RemoveVssIdentify()

{

RemoveVssTag(this.operatePath);

//通知去除标签结束

OnThreadCompleted(this,new EventArgs());

}



/// <summary>

/// 去除"*.sln"解决方案文件和"*.csproj"C#项目文件的.Vss关联标签。

/// </summary>

/// <param name="path">当前处理路径</param>

private void RemoveVssTag(string path)

{

RemoveTagContent(Directory.GetFiles(path,"*.sln"));

RemoveTagContent(Directory.GetFiles(path,"*.csproj"));

foreach(string dir in Directory.GetDirectories(path))

RemoveVssTag(dir);

}

下面的函数用来分析处理文件的修改,因为都是做删除部分文件内容的工作,所以把处理函数写成了一个,


/// <summary>

/// 去除"*.sln"解决方案文件和"*.csproj"C#项目文件的.Vss关联标签。

/// </summary>

/// <param name="file">当前处理文件</param>

private void RemoveTagContent(string [] files)

{

foreach(string file in files)

{

string strStart; //Vss标签文本开始内容

string strEnd; //标签文本结束内容

int offSet;//结束标签文本的偏移量

FileInfo fi = new FileInfo(file);

fi.Attributes =FileAttributes.Normal;

if(fi.Extension == ".sln")//如果是解决方案文件

{

strStart = "GlobalSection(SourceCodeControl)";

strEnd = "EndGlobalSection";

offSet = 19;//包含\r\n和空格

}

else//如果是项目文件

{

strStart = "SccProjectName";

strEnd = ">";

offSet = 0;

}

try

{

int start;//Vss标签文本开始索引

int end;//Vss标签文本结束索引

string content;//文件内容

using(FileStream fs = new FileStream(file,FileMode.Open,FileAccess.ReadWrite,FileShare.ReadWrite))

{

StreamReader sr = new StreamReader(fs);

content = sr.ReadToEnd();

sr.Close();

start = content.IndexOf(strStart);

}

if(start!=-1)//文件需要去除标签

{

using(FileStream fs = new FileStream(file,FileMode.Truncate,FileAccess.Write,FileShare.Read))

{

end = start+content.Substring(start).IndexOf(strEnd)+offSet;

content = content.Substring(0,start)+content.Substring(end);

StreamWriter sw = new StreamWriter(fs);

sw.Write(content);

sw.Close();

}

OnOperateNotify(this,new VssEventArgs(file+"去除标签完成"));

}

}

catch(Exception ex)

{

OnOperateNotify(this,new VssEventArgs(file+"操作错误:"+ex.ToString()));

}

}

}

当此为止,上面的程序实现了主要的功能,不过上面定义的事件,下面就是关于事件的函数,


/// <summary>

/// 操作信息事件通知

/// </summary>

/// <param name="sender">VssConverter</param>

/// <param name="e">参数,</param>

protected virtual void OnOperateNotify(object sender,VssEventArgs e)

{

if(OperateNotify!=null)

OperateNotify(sender,e);

}

/// <summary>

/// 线程结束事件通知

/// </summary>

/// <param name="sender">VssConverter</param>

/// <param name="e">参数</param>

protected virtual void OnThreadCompleted(object sender,EventArgs e)

{

if(ThreadCompleted!=null)

ThreadCompleted(sender,e);

}

}

相对于事件中的参数,这里定义了一个类从EventArgs继承,里面只包含一个字段用来保存信息,


/// <summary>

/// 消息通知事件参数类

/// </summary>

public class VssEventArgs : EventArgs

{

private string message;

/// <summary>

/// 构造函数

/// </summary>

/// <param name="message"></param>

public VssEventArgs(string message)

{

this.message = message;

}

/// <summary>

/// 消息内容

/// </summary>

public string Message

{

get{return this.message;}

}

}

}//命名空间
三、测试使用

程序测试运行界面,


界面部分代码大多数由设计器生成,下面列出了主要添加代码,


//委托,更新文本框

private delegate void AppendTextHandler(string content);

//标记转换操作是否完成

private int convertOK =0;

private System.Windows.Forms.TextBox textBoxFolder;//路径文本框

private System.Windows.Forms.Button buttonFolder;//浏览按钮

private System.Windows.Forms.TextBox textBoxInfo;//信息显示框

private System.Windows.Forms.Button buttonOK;//运行按钮

private System.Windows.Forms.Button buttonCancel;//退出按钮

按钮处理函数用来打开一个路径选择框,

private void buttonFolder_Click(object sender, System.EventArgs e)

{

FolderBrowserDialog myDialog = new FolderBrowserDialog();

myDialog.ShowNewFolderButton = false;

myDialog.Description = "选择需要处理的解决方案或项目目录";

if(myDialog.ShowDialog()==DialogResult.OK)

this.textBoxFolder.Text = myDialog.SelectedPath;

myDialog.Dispose();

}

运行函数,在这里面实例化VssConverter类,并调用了RemoveVss方法,运行时把几个按钮禁了,里面注册了两个事件,起信息传递作用,不过对于直接在地址栏中输入非法路径没有做具体判断,

private void buttonOK_Click(object sender, System.EventArgs e)

{

if(this.textBoxFolder.Text.Length>1)

{

this.textBoxInfo.Clear();

this.convertOK = 0;

this.buttonOK.Enabled = false;

this.buttonFolder.Enabled = false;

this.buttonCancel.Enabled = false;

this.textBoxFolder.Enabled = false;

VssConverter vssConverter = new VssConverter(this.textBoxFolder.Text);

vssConverter.OperateNotify += new OperateNotifyHandler(vssConverter_OperateNotify);

vssConverter.ThreadCompleted += new EventHandler(vssConverter_ThreadCompleted);

vssConverter.RemoveVss();

}

else

MessageBox.Show("请输入解决方案或项目路径!");

}

下面是两个事件处理函数,第一个是用来在前台即时显示当前处理的文件信息,第二个函数是用来通知线程的执行结果。函数如下,

// 信息通知

private void vssConverter_OperateNotify(object sender, VssEventArgs e)

{

AppendTextHandler ath = new AppendTextHandler(this.textBoxInfo.AppendText);

this.textBoxInfo.BeginInvoke(ath,new object[]{e.Message+Environment.NewLine});

}

// 线程结束通知

private void vssConverter_ThreadCompleted(object sender, EventArgs e)

{

if(this.convertOK==0)

this.convertOK++;

else

{

this.buttonOK.Enabled = true;

this.buttonFolder.Enabled = true;

this.buttonCancel.Enabled = true;

this.textBoxFolder.Enabled = true;

this.textBoxInfo.AppendText("#### 转换完成 ####");

}

}

分享到:
评论

相关推荐

    去除VSS代码管理

    在C#开发环境中,如果一个项目之前使用了VSS进行代码管理,那么在尝试移除VSS时,可能会遇到一些挑战。首先,项目文件(.csproj)和解决方案文件(.sln)中可能包含了VSS的特定设置,比如源代码控制绑定信息。这些...

    Microsoft.Visual.SourceSafe.2005代码管理

    Microsoft.Visual.SourceSafe.2005简单VSS源代码管理器VSS 的全称为 Visual Source Safe 。作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目

    C#自动代码生成器源码

    【描述】:“C#代码生成器源码,可根据数据结构生成数据表的实体(Entity),数据操作类(Access).开发环境:vs2005+sql2005。” 这个代码生成器是为C#程序员设计的,能够自动从数据库的数据表结构中生成对应的C#代码...

    配置sourcesafe

    - 在菜单栏中依次选择“工具” -&gt; “选项” -&gt; “源代码管理” -&gt; “当前源代码管理插件”,然后选择“Microsoft Visual SourceSafe”作为源代码管理插件。 - 在“环境”设置中,可以选择在保存文件时提示签出,以及...

    C#版文档版本管理系统源码

    8. **学习和应用**:对于初学者,可以从这个源码中学习如何使用C#进行文件操作、数据库交互以及构建用户界面。对于有经验的开发者,这个系统可以作为一个起点,进行二次开发以满足特定需求,或者借鉴其设计思路来...

    《版本管理利器Visual_SourceSafe_6.0实用指南》

    通过使用Visual SourceSafe 6.0,软件开发团队可以更有效地管理项目,协调团队成员,跟踪代码变更,确保版本的一致性和可追溯性,从而提高开发效率和软件质量。随着软件开发的复杂度日益增加,版本管理系统如VSS 6.0...

    Visual SourceSafe 使用说明

    Visual SourceSafe(VSS)是Microsoft在1994年发布的一款版本控制软件,主要用于管理软件项目的源代码版本控制。随着软件工程领域的不断发展,团队协作变得日益重要,VSS提供了一系列功能帮助开发团队有效地管理源...

    C#源码--权限管理系统源码

    【描述】中的"C#源码--权限管理系统源码"进一步确认了这是使用C#语言编写的权限管理系统的完整源代码。这样的系统通常包括用户认证、角色分配、权限分配等多个功能模块,用于管理和控制不同用户在系统内的操作权限。...

    图解Visual SourceSafe 2005与项目管理

    对于多人协作的软件开发团队而言,使用Visual SourceSafe 2005能够有效管理项目源代码,避免版本混乱、代码冲突等问题,提高团队协作效率和项目管理的专业性。通过本文的详细介绍,开发者可以快速掌握SourceSafe的...

    SourceSafe讲解

    Visual SourceSafe,简称SourceSafe,是一款由微软公司开发的版本控制系统,主要用于团队软件开发中的源代码管理。SourceSafe的核心功能是实现团队成员间的资源共享和文件版本管理,确保开发过程中的一致性和协作...

    Visual Studio.Net(VS) 源码管理器

    一、 开发前的准备1、 在装有...总结使用SourceSafe与VS.Net开发环境,可以为团队开发提供完整的源代码管理方案。通过源代码管理,可以记录项目开发的过程份。 http://www.biancheng168.com/Download/HTML/27.html

    Visual SourceSafe使用说明

    **Visual SourceSafe**(简称 VSS)是一款由微软公司开发的源代码管理工具,主要应用于小型开发团队中。随着软件项目的复杂度不断提高以及团队协作的需求日益增加,版本控制系统成为了不可或缺的一部分。VSS 提供了...

    Visual SourceSafe 6.0 基本操作说明

    ### Visual SourceSafe ...通过上述详细介绍,可以看出Visual SourceSafe 6.0提供了丰富的功能来帮助软件开发团队高效管理代码和文档,确保项目进展顺利。无论是对于小型团队还是中型项目,VSS都是一个值得信赖的选择。

    SourceSafe6.0

    **SourceSafe 6.0:微软的源代码管理工具** SourceSafe 6.0是由微软公司开发的一款版本控制系统,主要用于软件开发团队中的源代码管理。它允许开发者在多个版本之间进行跟踪、协作和控制,确保代码的安全性和一致性...

    Microsoft Visual SourceSafe 6.0

    《Microsoft Visual SourceSafe 6.0:C#团队开发的核心利器》 Microsoft Visual SourceSafe 6.0(简称VSS)是一款由微软公司推出的版本控制系统,尤其在C#团队开发中,它扮演着至关重要的角色。VSS的主要功能是帮助...

    Visual Studio 2005 Team System软件测试专家教程,C#源代码,很实用的例子.

    本教程中,C#被用作实现测试脚本和自动化测试工具的基础语言,学习者可以通过编写C#代码来定制和扩展测试功能。 教程可能包含以下几个关键知识点: 1. **单元测试**:通过编写C#代码创建单元测试,确保代码的各个...

    c#winform人事企业工资管理系统源码毕业设计源码三层架构.rar

    《C# WinForm人事企业工资管理系统源码解析》 C# WinForm人事企业工资管理系统是一款基于C#编程语言和Windows Forms(WinForm)开发平台构建的企业级应用软件,旨在为人力资源部门提供高效、准确的员工薪资管理解决...

    Visual SourceSafe绿色汉化版

    Visual SourceSafe,简称VSS,是由Microsoft开发的一款版本控制系统,主要应用于软件开发团队进行源代码管理。这款工具在早期的Windows环境下广泛使用,提供了一种简单的方式来跟踪和控制代码的变更,支持多人协作...

    Visual SourceSafe 使用手册

    在《Visual SourceSafe 使用说明.pdf》这份文档中,你将找到关于如何安装和配置VSS,如何创建和管理项目,如何进行基本的版本控制操作,以及如何解决可能出现的问题等全面的指导。通过阅读和实践,你将能够熟练掌握...

Global site tag (gtag.js) - Google Analytics