点击超链接从VSTF、SVN及文件共享服务器上下载文件

编程入门 行业动态 更新时间:2024-10-26 20:34:30

点击超链接从VSTF、SVN及<a href=https://www.elefans.com/category/jswz/34/1767880.html style=文件共享服务器上下载文件"/>

点击超链接从VSTF、SVN及文件共享服务器上下载文件

最近实现一个公司的需求, 不同部门的产品文档路径放在不同地址、不同种类的服务器上, 草草做完一版, 发现文档路径中还有文件共享路径(\\192.168.0.0类型)、还有svn(http://192.168.0.0类型)、还有VSTF路径($/Document/ss....), 各种坑啊, 领导们说起来都很轻松哈, 这样那样就行..... 这个应该不难吧....  都懒得跟他们解释, 爱咋咋吧

 

言归正传, 文档路径是放在不同类型的服务器上, 目标是一点击文档的链接就能直接下载文件, 还是所有的人都可以下载, 还不能影响用户的原有权限.开始想的简单了, 后来发现这东西头疼啊.

思路:

对于VSTF文件: 当点击的时候文档连接的时候, 通过VSTF的提供的工具, 将代码及Sql脚本获取到固定地址的文件夹, 该文件夹需要发布为网站且能够通过浏览器直接访问文件.

对于SVN文件: 可以通过HTTP访问, 但是涉及到权限问题, 需要给请求附加临时的账户信息, 这里没有考虑修改Cookie信息, 这会是用户的权限变成临时账户. 实现方法就是由WebServer发起请求, 附加账户信息, 将获得的信息返回给客户端浏览器.

对于文件共享: 为了达到练习的效果, 使用了WMI方式和CMD.exe两种方式.

 

总体思路: 就是返回给客户端的超链接为xxx/WebRequestHandler?url=, 一般处理程序接收到请求后, 更具请求类型、地址类型做相应处理.

领导催促的比较急, 所以好多地方都直接偷懒了, 没有封装, 想的是下回搞TD的时候在整理下吧

 

具体代码如下:

页面中的超链接代码:

View Code
            lnkDocPath.Text = Common.StringChange.HtmlSignChange(txtDocPath.Text = info.DocPath);lnkDocPath.NavigateUrl = string.Format("http://{0}/common/WebRequestTransferHandler.ashx?url={1}", Request.Url.Authority, Server.UrlEncode(lnkDocPath.Text.Trim()));

 

//请求转发器代码, WebRequestTransferHandler.ashx

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;using System.Net;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Reflection;
using System.Management;
using System.Web.UI;namespace WebSite.Common
{/// <summary>/// 透明的跨站访问处理器/// </summary>public class WebRequestTransferHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState{private static readonly string[] _allowFileType = new string[] { "*.doc", "*.docx", "*.xls", "*.xlsx", "*.ppt", "*.pptx","*.sql","*.txt","*.gz", "*.rtf" };public void ProcessRequest(HttpContext context){context.Response.Cache.SetCacheability(HttpCacheability.NoCache);context.Response.ContentType = "text/plain";if (!string.IsNullOrEmpty(context.Request.Url.PathAndQuery) && context.Request.Url.PathAndQuery.StartsWith("/common/WebRequestTransferHandler.ashx?url=")){string newUrl = context.Request.RawUrl.Trim().Replace(" ", "%20").Replace("/common/WebRequestTransferHandler.ashx?url=", "");//处理请求地址DocumentFileType docType = FileHelper.GetTransferedUrl(context, ref newUrl);if (docType != DocumentFileType.SharedDir){HttpWebRequest hwrRequest = HttpWebRequest.Create(newUrl) as HttpWebRequest;//添加请求头, 其中Accept、Content-Length、Content-Type、User-Agent只能通过如下方式设置foreach (string str in context.Request.Headers.Keys){switch (str){case "Accept":hwrRequest.Accept = context.Request.Headers["Accept"];break;case "Connection":hwrRequest.KeepAlive = true;break;case "Content-Length":hwrRequest.ContentLength = int.Parse(context.Request.Headers["Content-Length"]);break;case "Content-Type"://hwrRequest.ContentType = context.Request.Headers["Content-Type"];hwrRequest.ContentType = "application/x-www-form-urlencoded";   //表头的格式必须要写,否则请求响应的页面得不到要传递的值break;case "Expect":goto default;break;case "Date":goto default;break;case "Host":break;case "If-Modified-Since":goto default;break;case "Range":goto default;break;case "Referer":hwrRequest.Referer = context.Request.Headers["Referer"];break;case "Transfer-Encoding":goto default;break;case "User-Agent"://hwrRequest.UserAgent = context.Request.Headers["User-Agent"];//模拟客户端浏览器为IEhwrRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)";break;case "Accept-Encoding":hwrRequest.Headers.Add("Accept-Encoding", context.Request.Headers["Accept-Encoding"]);break;case "Accept-Language":hwrRequest.Headers.Add("Accept-Language", context.Request.Headers["Accept-Language"]);break;default:if (context.Request.Headers.AllKeys.Contains(str))hwrRequest.Headers.Add(str, context.Request.Headers[str]);break;}}hwrRequest.AllowAutoRedirect = true;switch (context.Request.HttpMethod){case "GET":hwrRequest.Method = "GET";break;case "POST":hwrRequest.Method = "POST";string postBodyStr = "";    //Post请求包体内容//获取POST请求包体using (Stream stream = context.Request.InputStream)using (StreamReader sReader = new StreamReader(stream, Encoding.UTF8)){try{postBodyStr = sReader.ReadToEnd();  //读取请求参数的包体内容if (!string.IsNullOrEmpty(postBodyStr)){byte[] postBodyBytes = Encoding.Default.GetBytes(postBodyStr);//传递的值hwrRequest.ContentLength = postBodyBytes.Length;//把传递的值写到流中using (System.IO.Stream newStream = hwrRequest.GetRequestStream()){try{newStream.Write(postBodyBytes, 0, postBodyBytes.Length);}catch (Exception ex){throw ex;}}}}catch (Exception ex){throw ex;}}break;default:throw new HttpException("未支持的请求方式!");}//为请求添加验证信息
                FileHelper.AttachAuthenticationInfo(newUrl, hwrRequest, docType);//处理返回信息using (HttpWebResponse hwrResponse = hwrRequest.GetResponse() as HttpWebResponse)using (Stream stream = hwrResponse.GetResponseStream())//using (StreamReader sReader = new StreamReader(stream, Encoding.UTF8))
                {StreamReader sReader = null;try{string fileType = string.Format("*{0}", newUrl.Substring(newUrl.LastIndexOf(".")));switch (fileType){case "*.sql":sReader = new StreamReader(stream, Encoding.GetEncoding("GB2312"));break;default:sReader = new StreamReader(stream, Encoding.UTF8);break;}if (_allowFileType.Contains(fileType)){string fileName = newUrl.Substring(newUrl.LastIndexOf("/") + 1);//设置文件类型//context.Response.ContentType = getFileContentTypeTag(fileType);context.Response.ContentType = hwrResponse.Headers["Content-Type"];//文件名称//context.Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName));  //HttpUtility以UTF-8编码,会截断文件名。context.Response.AddHeader("Content-Disposition", "attachment;filename=" + context.Server.UrlEncode(fileName).Replace("+","%20"));//处理文件byte[] fileBuffer = new byte[1024];byte[] srcTrans;int readFileSize = 0;while ((readFileSize = stream.Read(fileBuffer, 0, fileBuffer.Length)) > 0){srcTrans = copyContentFromByteArray(fileBuffer, readFileSize);context.Response.BinaryWrite(srcTrans);}context.Response.End();}else{//处理htmlstring responseHTML = sReader.ReadToEnd();if (!string.IsNullOrEmpty(responseHTML)){string pattern = "<\\s*a\\s*href=[\"'](?!http://).*?<\\s*/\\s*a\\s*>";Regex reg = new Regex(pattern, RegexOptions.IgnoreCase);MatchCollection matches = reg.Matches(responseHTML);string tmpLnkTag = "";string tmpFront = "";switch (docType){case DocumentFileType.Vstf:tmpFront = "http://" + hwrRequest.RequestUri.Authority;break;case DocumentFileType.InnerSvn:goto case DocumentFileType.OuterSvn;break;case DocumentFileType.OuterSvn:tmpFront = hwrRequest.RequestUri.AbsoluteUri;break;case DocumentFileType.SharedDir:goto default;break;case DocumentFileType.TD:goto default;break;default:break;}foreach (Match match in matches){tmpLnkTag = match.Value.Replace("HREF=\"", "HREF=\"" + tmpFront).Replace("href=\"", "href=\"" + tmpFront);responseHTML = responseHTML.Replace(match.Value, tmpLnkTag);}context.Response.Write(responseHTML);context.Response.End();}}}catch (Exception ex){throw ex;}finally{if (sReader != null)sReader.Close();}}}else{//处理共享文件//StreamReader sReader = null;string fileType = string.Format("*{0}", newUrl.Substring(newUrl.LastIndexOf(".")));//switch (fileType)//{//    case "*.sql"://        sReader = new StreamReader(stream, Encoding.GetEncoding("GB2312"));//        break;//    default://        sReader = new StreamReader(stream, Encoding.UTF8);//        break;//}string resourcePath = "";try{if (_allowFileType.Contains(fileType)){string fileName = newUrl.Substring(newUrl.LastIndexOf("\\") + 1);resourcePath = newUrl.Replace(fileName, "");int status = FileSharedHelper.ConnectResource(resourcePath);if (status == 1219)         //1219表示文件共享连接已建立, 需强制断开.
                            {FileSharedHelper.ForceDisconnectResource(resourcePath);status = FileSharedHelper.ConnectResource(resourcePath);}if (status != 0)throw new FileLoadException("ConnectionError: ERROR_ID " + status.ToString());string filePath = resourcePath + fileName;//设置文件类型context.Response.ContentType = getFileContentTypeTag(fileType);//文件名称context.Response.AddHeader("Content-Disposition", "attachment;filename=" + context.Server.UrlEncode(fileName).Replace("+", "%20"));//处理文件using (FileStream fsStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)){byte[] fileBuffer = new byte[1024];byte[] srcTrans;int readFileSize = 0;while ((readFileSize = fsStream.Read(fileBuffer, 0, fileBuffer.Length)) > 0){srcTrans = copyContentFromByteArray(fileBuffer, readFileSize);context.Response.BinaryWrite(srcTrans);}}//context.Response.End();
                        }else{//处理共享文件目录bool status = FileSharedHelper.OpenShareFolder(newUrl);if (!status){FileSharedHelper.CloseShareFolder(newUrl);FileSharedHelper.OpenShareFolder(newUrl);FileSharedHelper.ExplorerShareFolderByWinMsg(newUrl);}elseFileSharedHelper.ExplorerShareFolderByWinMsg(newUrl);}}catch (Exception ex){throw new Exception("共享文件无法打开, 请检查用户名及口令! \r\n错误信息:" + ex.Message);}finally{if (!string.IsNullOrEmpty(resourcePath))FileSharedHelper.DisconnectResource(resourcePath);context.Response.Write(getCloseWindowHTML());}}}}public bool IsReusable{get{return false;}}private byte[] copyContentFromByteArray(byte[] conByte, int conLength){byte[] result = new byte[conLength];for (int i = 0; i < conLength; i++)result[i] = conByte[i];return result;}private string getFileContentTypeTag(string fileType){string result = "";switch (fileType.ToLower()){case "*.asf ":result = "video/x-ms-asf ";break;case "*.avi ":result = "video/avi ";break;case "*.doc ":result = "application/msword ";break;case "*.docx ":result = "application/vnd.openxmlformats-officedocument.wordprocessingml.document ";break;case "*.ppt ":result = "application/vnd.ms-powerpoint ";break;case "*.pptx ":result = "application/vnd.openxmlformats-officedocument.presentationml.presentation ";break;case "*.zip ":result = "application/zip ";break;case "*.xls ":result = "application/vnd.ms-excel ";break;case "*.xlsx ":result = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet ";break;case "*.gif ":result = "image/gif ";break;case "*.jpg ":result = "image/jpeg ";break;case "*.jpeg ":result = "image/jpeg ";break;case "*.wav ":result = "audio/wav ";break;case "*.mp3 ":result = "audio/mpeg3 ";break;case "*.mpg ":result = "video/mpeg ";break;case "*.mepg ":result = "video/mpeg ";break;case "*.rtf ":result = "application/rtf ";break;case "*.html ":result = "text/html ";break;case "*.htm ":result = "text/html ";break;case "*.txt ":result = "text/plain ";break;case "*.sql ":result = "text/plain ";break;default:result = "application/octet-stream ";break;}return result;}/// <summary>/// 生成一段用来关闭窗口的HTML/// </summary>/// <returns>System.String类型, 表示用来关闭窗口的HTML内容. </returns>private string getCloseWindowHTML(){string content = @"<html><head><script type='text/javascript'>function closeWindow(){window.opener=null;window.open('','_self','');window.close();}</script></head><body οnlοad='closeWindow()'></body></html>";return content;}}
}

 

//文件地址变换代码, FileHelper

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;using System.Configuration;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using System.Text.RegularExpressions;
using System.Net;
using System.Text;namespace WebSite.Common
{public class FileHelper{private static readonly string _vstfPath = ConfigurationManager.AppSettings["VstfPath"];private static readonly string _vstfUName = ConfigurationManager.AppSettings["VstfUName"];private static readonly string _vstfPwd = ConfigurationManager.AppSettings["VstfPwd"];private static readonly string _vstfDomain = ConfigurationManager.AppSettings["VstfDomain"];private static readonly string _svnPath = ConfigurationManager.AppSettings["SVNPath"];private static readonly string _svnName = ConfigurationManager.AppSettings["SVNUName"];private static readonly string _svnPwd = ConfigurationManager.AppSettings["SVNPwd"];private static readonly string _vstfFileCenter = ConfigurationManager.AppSettings["VstfFileCenter"];private static readonly string _OuterDepSvnName = ConfigurationManager.AppSettings["OutDepartmentSVNName"];private static readonly string _OuterDepSvnPwd = ConfigurationManager.AppSettings["OutDepartmentSVNPwd"]; /// <summary>/// VSTF映射本地路径/// </summary>private static readonly string _localPath = ConfigurationManager.AppSettings["LocalPath"];private static TeamFoundationServer tfs = new TeamFoundationServer(_vstfPath, new System.Net.NetworkCredential(_vstfUName, _vstfPwd, _vstfDomain));private static VersionControlServer vcs = tfs.GetService(typeof(VersionControlServer)) as VersionControlServer;private static readonly string[] _allowFileType = new string[] { "*.doc", "*.docx", "*.xls", "*.xlsx", "*.ppt", "*.pptx", "*.sql", "*.gz","*.txt", "*.rtf" };/// <summary>/// 根据请求的源地址, 获取文档文件的Web响应对象./// </summary>/// <param name="srcFilePath">System.String类型, 表示原始文档文件的地址.</param>/// <param name="docType">System.Enum类型, 表示文档文件的类型. </param>/// <returns>System.Net.HttpWebResponse类型, 表示返回的Web响应对象. </returns>public static DocumentFileType GetTransferedUrl(HttpContext context, ref string srcFilePath){//srcFilePath = HttpUtility.UrlDecode(srcFilePath);srcFilePath = context.Server.UrlDecode(srcFilePath);DocumentFileType result = DocumentFileType.OuterSvn;if(!string.IsNullOrEmpty(srcFilePath)){srcFilePath = HttpUtility.UrlDecode(srcFilePath);if (srcFilePath.StartsWith("$/")){srcFilePath = filePathTranslator(srcFilePath, DocumentFileType.Vstf);result = DocumentFileType.Vstf;}else if (srcFilePath.StartsWith("\\")){srcFilePath = filePathTranslator(srcFilePath, DocumentFileType.SharedDir);result = DocumentFileType.SharedDir;}else if (srcFilePath.StartsWith("http://")){if (srcFilePath.EndsWith("/tdbin/start_a.htm")){srcFilePath = filePathTranslator(srcFilePath, DocumentFileType.TD);result = DocumentFileType.TD;}else if (srcFilePath.StartsWith(_svnPath)){srcFilePath = filePathTranslator(srcFilePath, DocumentFileType.InnerSvn);result = DocumentFileType.InnerSvn;}else{srcFilePath = filePathTranslator(srcFilePath, DocumentFileType.OuterSvn);result = DocumentFileType.OuterSvn;}}elsesrcFilePath = "";}return result;}/// <summary>/// 根据文档所属的服务器类型将身份验证信息添加到给定的Web请求对象中./// </summary>/// <param name="srcPath">System.String类型, 表示文档文件的地址. </param>/// <param name="request">System.Net.HttpWebRequest类型, 表示用于转发请求的Request对象. </param>/// <param name="docType"></param>/// <param name="docType">System.Enum类型, 表示请求文档所属的服务器类型. </param>public static void AttachAuthenticationInfo(string url, HttpWebRequest request, DocumentFileType docType){string name = "";string pwd = "";switch (docType){case DocumentFileType.InnerSvn:name = _svnName;pwd = _svnPwd;break;case DocumentFileType.SharedDir:goto case DocumentFileType.OuterSvn;break;case DocumentFileType.OuterSvn:name = _OuterDepSvnName;pwd = _OuterDepSvnPwd;break;case DocumentFileType.TD:break;case DocumentFileType.Vstf:break;default:break;}attachCredentialCache(url, request, name, pwd, docType);}#region private Method/// <summary>/// 根据请求的文档文件路径级文档的类型, 获取对应文档文件的Web地址./// </summary>/// <param name="srcFilePath">System.String类型, 表示原始文档文件的地址. </param>/// <param name="docType">System.Enum类型, 表示文档文件的类型. </param>/// <returns>System.String类型, 表示经过变换的文档文件的地址. </returns>private static string filePathTranslator(string srcFilePath, DocumentFileType docType){string result = "";if (!string.IsNullOrEmpty(srcFilePath)){switch(docType){case DocumentFileType.Vstf:string regStr = "^\\$/[\\w\\.]+/[^\\s/]";         //必须以$/xxx/s开头的文件才行Regex reg = new Regex(regStr);if (reg.IsMatch(srcFilePath)){getFileFromVstfTo160(srcFilePath);result = srcFilePath.Replace("$/", _vstfFileCenter);}break;case DocumentFileType.InnerSvn:goto default;break;case DocumentFileType.OuterSvn:goto default;break;case DocumentFileType.SharedDir://result = string.Format("file:{0}", srcFilePath.Replace("\\", "/"));goto default;break;case DocumentFileType.TD:result = "";break;default:result = srcFilePath;break;}}return result;}/// <summary>/// 根据允许访问的文件类型从VSTF上获取文件到ServerDeploy目录/// </summary>/// <param name="srcFilePath">System.String类型, 表示以$开头的VSTF文件路径. </param>private static void getFileFromVstfTo160(string srcFilePath){if (srcFilePath.StartsWith("$/")){//srcFilePath = HttpUtility.UrlDecode(srcFilePath);Item[] items = vcs.GetItems(srcFilePath, RecursionType.Full).Items;string csprojPath; string fileType;foreach (Item it in items){if (it.ServerItem.Contains(".")){fileType = it.ServerItem.Substring(it.ServerItem.LastIndexOf("."));if (_allowFileType.Contains("*" + fileType)){csprojPath = _localPath + it.ServerItem.Substring(2);it.DownloadFile(csprojPath);}}}}}/// <summary>/// 根据请求的文档文件路径、用户名及密码获取HttpWebResponse对象/// </summary>/// <param name="srcPath">System.String类型, 表示文档文件的地址. </param>/// <param name="request">System.Net.HttpWebRequest类型, 表示用于转发请求的Request对象. </param>/// <param name="svnName">System.String类型, 表示发起请求的账户名. </param>/// <param name="svnPwd">System.String类型, 表示发起请求的密码. </param>/// <param name="docType">System.Enum类型, 表示请求文档所属的服务器类型. </param>private static void attachCredentialCache(string srcPath,HttpWebRequest request, string svnName, string svnPwd, DocumentFileType docType){if (!(string.IsNullOrEmpty(svnName) || string.IsNullOrEmpty(svnPwd))){CredentialCache myCache = new CredentialCache();NetworkCredential netCredential = new NetworkCredential(svnName,svnPwd);switch (docType){case DocumentFileType.SharedDir:netCredential.Domain = "feinno";break;case DocumentFileType.TD:break;default:break;}myCache.Add(new Uri(srcPath), "Basic", netCredential);request.Credentials = myCache;request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(svnName + ":" + svnPwd));}}#endregion}public enum DocumentFileType{Vstf = 1,InnerSvn = 2,OuterSvn = 3,SharedDir = 4,TD = 5}
}

 

//文件共享服务器中的文件处理代码, FileSharedHelper

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;using System.Runtime.InteropServices;
using System.Configuration;
using System.Text.RegularExpressions;
using System.Diagnostics;namespace WebSite.Common
{public class FileSharedHelper{private static readonly string _OuterDepSvnName = ConfigurationManager.AppSettings["OutDepartmentSVNName"];private static readonly string _OuterDepSvnPwd = ConfigurationManager.AppSettings["OutDepartmentSVNPwd"]; #region WMI访问文件共享/// <summary>/// 建立到服务器资源的连接/// </summary>/// <param name="resourcePath">System.String类型, 表示指定本地驱动器或远程共享资源.</param>/// <returns>System.Unit类型, 如果方法执行成功返回0(NO_ERROR), 否则返回ERROR_CODE.</returns>public static int ConnectResource(string resourcePath){int result = -1;if (resourcePath.StartsWith("\\")){//string pattern = "[\\d]{1,3}.[\\d]{1,3}.[\\d]{1,3}.[\\d]{1,3}";//Regex reg = new Regex(pattern);//if (reg.IsMatch(resourcePath))//{//    string ipAddress = "";//    ipAddress = reg.Match(resourcePath).Value;//result = Convert.ToInt32(WNetAddConnection(string.Format("{0}/{1}", "", _OuterDepSvnName), _OuterDepSvnPwd, resourcePath, null));result = Convert.ToInt32(WNetAddConnection(_OuterDepSvnName, _OuterDepSvnPwd, resourcePath, ""));//}
            }return result;}/// <summary>/// 断开到服务器资源的连接/// </summary>/// <param name="resourcePath">System.String类型, 表示指定本地驱动器或远程共享资源.</param>/// <returns>System.Unit类型, 如果方法执行成功返回0(NO_ERROR), 否则返回ERROR_CODE.</returns>public static int DisconnectResource(string resourcePath){int result = -1;if (resourcePath.StartsWith("\\")){result = Convert.ToInt32(WNetCancelConnection(resourcePath, 1, true));}return result;}/// <summary>/// 强制断开资源/// </summary>/// <param name="resourcePath">System.String类型, 表示资源的路径. </param>public static void ForceDisconnectResource(string resourcePath){string cmd = string.Format("NET USE {0} /DELETE /Y", resourcePath);WinExec(cmd, Convert.ToUInt16((int)ShowWindow.SW_HIDE)); }/// <summary>/// 强制断开远程资源/// </summary>/// <param name="winExecCommand">System.String类型, 表示要断开资源的命令</param>/// <param name="showWindowOption">System.Unit类型, 表示显示窗口的相关属性.</param>/// <returns>System.Unit, 表示是否成功断开资源. </returns>[DllImport("kernel32.dll", EntryPoint = "WinExec")]private static extern uint WinExec(string winExecCommand, uint showWindowOption);//mpr.dll是Windws操作系统网络通讯相关模块,通过对功能需求的分析,直接调用mpr.dll来实现该功能。/// <summary>/// 添加远程网络连接./// </summary>/// <param name="lpNetResource">WebSite.Common.NetResource类型, 表示包含网络访问资源的结构. </param>/// <param name="lpPassword">System.String类型, 表示远程计算机的密码. </param>/// <param name="lpUsername">System.String类型, 表示远程计算机的用户名. </param>/// <param name="dwFlags">System.Unit类型, 表示连接选项. 可选值CONNECT_INTERACTIVE、CONNECT_PROMPT、CONNECT_REDIRECT、CONNECT_UPDATE_PROFILE、CONNECT_COMMANDLINE、CONNECT_CMD_SAVECRED</param>/// <returns>System.Unit类型, 如果方法执行成功返回0(NO_ERROR), 否则返回ERROR_CODE.</returns>[DllImport("mpr.dll", EntryPoint = "WNetAddConnection2")]private static extern uint WNetAddConnection2(NetResource lpNetResource, string lpPassword, string lpUsername, uint dwFlags);/// <summary>/// 释放存在的网络连接./// </summary>/// <param name="lpName">System.String类型, 表示指定本地驱动器或远程共享资源. </param>/// <param name="dwFlags">System.Unit类型, 表示断开连接方式, 可设置0或CONNECT_UPDATE_PROFILE. </param>/// <param name="fForce">System.Boolean类型, 表示是否强制断开连接. </param>/// <returns>System.Unit类型, 如果方法执行成功返回0(NO_ERROR), 否则返回ERROR_CODE.</returns>[DllImport("Mpr.dll", EntryPoint = "WNetCancelConnection2")]private static extern uint WNetCancelConnection2(string lpName, uint dwFlags, bool fForce);/// <summary>/// 添加远程网络连接./// </summary>/// <param name="netResource">WebSite.Common.NetResource类型, 表示包含网络访问资源的结构. </param>/// <param name="username">System.String类型, 表示远程计算机的用户名.</param>/// <param name="password">System.String类型, 表示远程计算机的密码.</param>/// <returns>System.Unit类型, 如果方法执行成功返回0(NO_ERROR), 否则返回ERROR_CODE.</returns>private static uint WNetAddConnection(NetResource netResource, string username, string password){uint result = WNetAddConnection2(netResource, password, username, 0);return result;}/// <summary>/// 添加远程网络连接./// </summary>/// <param name="username">System.String类型, 表示远程计算机的用户名.</param>/// <param name="password">System.String类型, 表示远程计算机的密码.</param>/// <param name="remoteName">System.String类型, 表示远程计算机资源路径.</param>/// <param name="localName">System.String类型, 表示将远程计算机映射为本地资源的名称.</param>/// <returns>System.Unit类型, 如果方法执行成功返回0(NO_ERROR), 否则返回ERROR_CODE.</returns>private static uint WNetAddConnection(string username, string password, string remoteName, string localName){NetResource netResource = new NetResource();netResource.dwScope = 2;                                    //RESOURCE_GLOBALNETnetResource.dwType = 1;                                     //RESOURCETYPE_DISKnetResource.dwDisplayType = 3;                              //RESOURCEDISPLAYTYPE_SHAREnetResource.dwUsage = 1;                                    //RESOURCEUSAGE_CONNECTABLEnetResource.lpLocalName = localName;netResource.lpRemoteName = remoteName.TrimEnd('\\');//netResource.lpRemoteName = lpComment;//netResource.lpProvider = null;uint result = WNetAddConnection2(netResource, password, username, 0);return result;}/// <summary>/// 释放存在的网络连接./// </summary>/// <param name="name">System.String类型, 表示指定本地驱动器或远程共享资源. </param>/// <param name="flags">System.Unit类型, 表示断开连接方式, 可设置0或CONNECT_UPDATE_PROFILE.</param>/// <param name="force">System.Boolean类型, 表示是否强制断开连接. </param>/// <returns>System.Unit类型, 如果方法执行成功返回0(NO_ERROR), 否则返回ERROR_CODE.</returns>private static uint WNetCancelConnection(string name, uint flags, bool force){uint nret = WNetCancelConnection2(name, flags, force);return nret;}#endregion#region CMD访问文件共享/// <summary>/// 打开给定的文件共享内容/// </summary>/// <param name="sourcePath">System.String类型, 表示给定的共享资源路径. </param>/// <returns>System.Boolean类型, 表示是否成功打开共享资源. </returns>private static bool openShareFolder(string sourcePath, string name, string pwd){string cmdLineInfo = "net use " + sourcePath + " /User:\"" + name + "\" \"" + pwd + "\" /PERSISTENT:NO";return executeCommandLine(cmdLineInfo);}public static bool ExplorerShareFolder(string sourcePath){string cmdLineInfo = "explorer " + sourcePath;return executeCommandLine(cmdLineInfo);}public static void ExplorerShareFolderByWinMsg(string sourcePath){explorerShareFolder(sourcePath);}/// <summary>/// 打开给定的文件共享内容/// </summary>/// <param name="sourcePath">System.String类型, 表示给定的共享资源路径. </param>/// <returns>System.Boolean类型, 表示是否成功打开共享资源. </returns>public static bool OpenShareFolder(string sourcePath){return openShareFolder(sourcePath, _OuterDepSvnName, _OuterDepSvnPwd);}/// <summary>/// 断开给定的文件共享内容/// </summary>/// <param name="sourcePath">System.String类型, 表示给定的共享资源路径. </param>/// <returns>System.Boolean类型, 表示断开是否成功. </returns>public static bool CloseShareFolder(string sourcePath){return closeShareFolder(sourcePath, _OuterDepSvnName, _OuterDepSvnPwd);}/// <summary>/// 断开给定的文件共享内容/// </summary>/// <param name="sourcePath">System.String类型, 表示给定的共享资源路径. </param>/// <returns>System.Boolean类型, 表示断开是否成功. </returns>private static bool closeShareFolder(string sourcePath, string name, string pwd){//string cmdLineInfo = "net use " + sourcePath + " /User:\"" + name + "\" \"" + pwd + "\" /DELETE";string cmdLineInfo = "net use " + sourcePath + " /DELETE";return executeCommandLine(cmdLineInfo);}/// <summary>/// 强制断开资源/// </summary>/// <param name="resourcePath">System.String类型, 表示资源的路径. </param>private static void explorerShareFolder(string resourcePath){string cmd = string.Format("explorer {0}", resourcePath);WinExec(cmd, Convert.ToUInt16((int)ShowWindow.SW_HIDE));}/// <summary>/// 在Command命令行窗口执行给定的指令./// </summary>/// <param name="commandLineInfo">System.String类型, 表示将要在命令行窗口执行的指令. </param>/// <returns>System.Boolean类型, 表示命令行是否成功执行. </returns>private static bool executeCommandLine(string commandLineInfo){bool result = false;using (Process proc = getCommandLineProcess()){//try//{
                    proc.Start();proc.StandardInput.WriteLine(commandLineInfo);proc.StandardInput.WriteLine("exit");while (!proc.HasExited)proc.WaitForExit();string errorInfo = proc.StandardError.ReadToEnd();proc.StandardError.Close();if (string.IsNullOrEmpty(errorInfo))result = true;//    else//        throw new Exception(errorInfo);//}//catch (Exception ex)//{//    throw ex;//}
            }return result;}/// <summary>/// 获取CMD命令行对象/// </summary>/// <returns>System.Diagnostics.Process, 表示返回的CMD进程对象. </returns>private static Process getCommandLineProcess(){Process proc = new Process();proc.StartInfo.FileName = "cmd.exe";proc.StartInfo.UseShellExecute = false;proc.StartInfo.RedirectStandardInput = true;proc.StartInfo.RedirectStandardOutput = true;proc.StartInfo.RedirectStandardError = true;proc.StartInfo.CreateNoWindow = true;return proc;}#endregion}/// <summary>/// 通过多个字段指定网络连接资源信息.   /// </summary>
    [StructLayout(LayoutKind.Sequential)]public class NetResource{//dwScope: 指定枚举范围. 设置RESOURCE_CONNECTED,RESOURCE_GLOBALNET,RESOURCE_REMEMBERED三值之一.public int dwScope;//指定访问的资源类型. 设置三个值之一. RESOURCETYPE_ANY表示所有资源; RESOURCETYPE_DISK表示磁盘资; RESOURCETYPE_PRINT表示打印机.public int dwType;//指出资源显示类型. RESOURCEDISPLAYTYPE_DOMAIN;RESOURCEDISPLAYTYPE_SERVER;RESOURCEDISPLAYTYPE_SHARE;RESOURCEDISPLAYTYPE_GENERIC.public int dwDisplayType;//描述资源的使用方式. 设置RESOURCEUSAGE_CONNECTABLE或RESOURCEUSAGE_CONTAINER.public int dwUsage;//lpLocalName: 同dwScope关联, 指定本地映射.public string lpLocalName;//远程访问文件夹路径.public string lpRemoteName;//资源描述.public string lpComment;//资源提供者, 可以设置为NULL.public string lpProvider;}public enum ShowWindow{SW_FORCEMINIMIZE = 0,           SW_HIDE = 1,                   SW_MAXIMIZE = 2,                SW_MINIMIZE = 3,                SW_RESTORE = 4,                 SW_SHOW = 5,                    SW_SHOWDEFAULT = 6,             SW_SHOWMAXIMIZED = 7,           SW_SHOWMINIMIZED = 8,SW_SHOWMINNOACTIVE = 9,SW_SHOWNA = 10,SW_SHOWNOACTIVATE = 11,SW_SHOWNORMAL = 12}
}

 

 

偷懒的地方太多, 仅仅为了实现功能, 考虑不周还望见谅!

更多推荐

点击超链接从VSTF、SVN及文件共享服务器上下载文件

本文发布于:2024-02-11 07:23:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1679824.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:文件共享   超链接   器上   文件   SVN

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!