using Newtonsoft.Json;
using DaZhongDianPing.JsonBeans;
class JsonCrawler
{
private PhaseResultBean PhaseJson(Uri uri, String szResultPath, String szErrorPath)
{
PhaseResultBean result = new PhaseResultBean();
try
{
//取回网页
WebClient client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
Byte[] pageData = client.DownloadData(uri);
string pageHtml = Encoding.UTF8.GetString(pageData);
JsonBeans.TopShopsBean topShops = JsonConvert.DeserializeObject<JsonBeans.TopShopsBean>(pageHtml);
//分析Json
int len = topShops.ShopBeans.Length;
result.total = len;
foreach (ShopBean shop in topShops.ShopBeans)
{
try
{
String szTitle = shop.FilterFullName;
if (szTitle != null) szTitle = szTitle.Replace("\r\n", "-");
String szStar = shop.ShopPowerTitle;
String szMeanPrice = shop.AvgPrice.ToString();
String szRegionName = shop.MainRegionName;
String szAddress = shop.Address;
if (szAddress != null) szAddress.Replace(",", "-");
String szTaste = shop.RefinedScore1;
String szEvn = shop.RefinedScore2;
String szService = shop.RefinedScore3;
//将获取的内容写入文本
using (StreamWriter sw = new StreamWriter(szResultPath, true))
{
sw.WriteLine(szTitle + "," + szStar + "," + szMeanPrice + "," + szRegionName + "," + szAddress + "," + szTaste + "," + szEvn + "," + szService);
}
result.successed += 1;
}
catch (Exception Ex)
{
using (StreamWriter sw = new StreamWriter(szErrorPath, true))
{
sw.WriteLine(Ex.Message);
}
result.failed += 1;
}
}
}
catch (WebException webEx)
{
using (StreamWriter sw = new StreamWriter(szErrorPath, true))
{
sw.WriteLine(webEx.Message);
}
result.bSuccess = false;
}
return result;
}
}
class PhaseResultBean
{
public Boolean bSuccess;
public int total;
public int successed;
public int failed;
}
public enum JsonEnginType
{
JsonEngin_Newtonsoft
}
internal class ShopBean
{
[JsonProperty("addDate")]
public string AddDate { get; set; }
[JsonProperty("addUser")]
public object AddUser { get; set; }
[JsonProperty("addUserName")]
public object AddUserName { get; set; }
[JsonProperty("address")]
public string Address { get; set; }
[JsonProperty("altName")]
public string AltName { get; set; }
[JsonProperty("avgPrice")]
public int AvgPrice { get; set; }
[JsonProperty("branchName")]
public string BranchName { get; set; }
[JsonProperty("branchTotal")]
public int BranchTotal { get; set; }
[JsonProperty("businessHours")]
public string BusinessHours { get; set; }
[JsonProperty("canSendSms")]
public object CanSendSms { get; set; }
[JsonProperty("categoryId")]
public int CategoryId { get; set; }
[JsonProperty("cityId")]
public int CityId { get; set; }
[JsonProperty("crossRoad")]
public string CrossRoad { get; set; }
[JsonProperty("defaultPic")]
public string DefaultPic { get; set; }
[JsonProperty("defaultPicBig")]
public object DefaultPicBig { get; set; }
[JsonProperty("dishTagList")]
public string[][] DishTagList { get; set; }
[JsonProperty("dishTags")]
public string DishTags { get; set; }
[JsonProperty("district")]
public int District { get; set; }
[JsonProperty("districtName")]
public object DistrictName { get; set; }
[JsonProperty("filterFullAdress")]
public string FilterFullAdress { get; set; }
[JsonProperty("filterFullName")]
public string FilterFullName { get; set; }
[JsonProperty("firstReviewId")]
public int FirstReviewId { get; set; }
[JsonProperty("firstUserFace")]
public object FirstUserFace { get; set; }
[JsonProperty("firstUserNickName")]
public object FirstUserNickName { get; set; }
[JsonProperty("fullAdress")]
public string FullAdress { get; set; }
[JsonProperty("fullName")]
public string FullName { get; set; }
[JsonProperty("glat")]
public object Glat { get; set; }
[JsonProperty("glng")]
public object Glng { get; set; }
[JsonProperty("groupFlag")]
public object GroupFlag { get; set; }
[JsonProperty("hasStaticMap")]
public object HasStaticMap { get; set; }
[JsonProperty("hits")]
public int Hits { get; set; }
[JsonProperty("isUserCanUpdate")]
public object IsUserCanUpdate { get; set; }
[JsonProperty("lastDate")]
public string LastDate { get; set; }
[JsonProperty("lastIp")]
public object LastIp { get; set; }
[JsonProperty("lastUser")]
public object LastUser { get; set; }
[JsonProperty("lastUserName")]
public object LastUserName { get; set; }
[JsonProperty("mainCategoryId")]
public int MainCategoryId { get; set; }
[JsonProperty("mainCategoryName")]
public object MainCategoryName { get; set; }
[JsonProperty("mainRegionId")]
public int MainRegionId { get; set; }
[JsonProperty("mainRegionName")]
public string MainRegionName { get; set; }
[JsonProperty("minUserMana")]
public object MinUserMana { get; set; }
[JsonProperty("monthlyHits")]
public int MonthlyHits { get; set; }
[JsonProperty("nearByTags")]
public object NearByTags { get; set; }
[JsonProperty("nearbyShops")]
public object NearbyShops { get; set; }
[JsonProperty("oldChainId")]
public object OldChainId { get; set; }
[JsonProperty("phoneNo")]
public string PhoneNo { get; set; }
[JsonProperty("phoneNo2")]
public string PhoneNo2 { get; set; }
[JsonProperty("picTotal")]
public int PicTotal { get; set; }
[JsonProperty("popularity")]
public int Popularity { get; set; }
[JsonProperty("power")]
public int Power { get; set; }
[JsonProperty("prevWeeklyHits")]
public object PrevWeeklyHits { get; set; }
[JsonProperty("priceInfo")]
public object PriceInfo { get; set; }
[JsonProperty("priceLevel")]
public int PriceLevel { get; set; }
[JsonProperty("primaryTag")]
public string PrimaryTag { get; set; }
[JsonProperty("promoId")]
public int PromoId { get; set; }
[JsonProperty("publicTransit")]
public string PublicTransit { get; set; }
[JsonProperty("refinedScore1")]
public string RefinedScore1 { get; set; }
[JsonProperty("refinedScore2")]
public string RefinedScore2 { get; set; }
[JsonProperty("refinedScore3")]
public string RefinedScore3 { get; set; }
[JsonProperty("regionId")]
public int RegionId { get; set; }
[JsonProperty("score")]
public int Score { get; set; }
[JsonProperty("score1")]
public int Score1 { get; set; }
[JsonProperty("score2")]
public int Score2 { get; set; }
[JsonProperty("score3")]
public int Score3 { get; set; }
[JsonProperty("score4")]
public int Score4 { get; set; }
[JsonProperty("searchKeyWord")]
public object SearchKeyWord { get; set; }
[JsonProperty("searchName")]
public object SearchName { get; set; }
[JsonProperty("shopGroupId")]
public int ShopGroupId { get; set; }
[JsonProperty("shopId")]
public int ShopId { get; set; }
[JsonProperty("shopName")]
public string ShopName { get; set; }
[JsonProperty("shopPower")]
public int ShopPower { get; set; }
[JsonProperty("shopPowerTitle")]
public string ShopPowerTitle { get; set; }
[JsonProperty("shopTagList")]
public string[][] ShopTagList { get; set; }
[JsonProperty("shopTags")]
public string ShopTags { get; set; }
[JsonProperty("shopTotalName")]
public string ShopTotalName { get; set; }
[JsonProperty("shopType")]
public int ShopType { get; set; }
[JsonProperty("similarShops")]
public object SimilarShops { get; set; }
[JsonProperty("suggestGA")]
public object SuggestGA { get; set; }
[JsonProperty("suggestReason")]
public object SuggestReason { get; set; }
[JsonProperty("todayHits")]
public object TodayHits { get; set; }
[JsonProperty("voteTotal")]
public int VoteTotal { get; set; }
[JsonProperty("webSite")]
public object WebSite { get; set; }
[JsonProperty("weeklyHits")]
public int WeeklyHits { get; set; }
[JsonProperty("wishTotal")]
public object WishTotal { get; set; }
[JsonProperty("writeUp")]
public string WriteUp { get; set; }
}
internal class TopShopsBean
{
[JsonProperty("categoryId")]
public int CategoryId { get; set; }
[JsonProperty("cityId")]
public int CityId { get; set; }
[JsonProperty("maxResults")]
public int MaxResults { get; set; }
[JsonProperty("rankType")]
public int RankType { get; set; }
[JsonProperty("shopBeans")]
public ShopBean[] ShopBeans { get; set; }
[JsonProperty("shopType")]
public int ShopType { get; set; }
[JsonProperty("skipResults")]
public int SkipResults { get; set; }
}
Tag Archives: CSharp
CSharp抓取HTML网页内容
using mshtml;
using HtmlAgilityPack;
class HTMLCrawler
{
private PhaseResultBean PhaseHtml(int index, Uri uri, String szResultPath, String szErrorPath, HTMLEnginType htmlEngin)
{
PhaseResultBean result = new PhaseResultBean();
try
{
WebClient client = new WebClient();
client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
Byte[] pageData = client.DownloadData(uri);
string pageHtml = Encoding.UTF8.GetString(pageData);
if (checkSavePages.Checked)
{
String szHtmlPath = XWin32.getExeParentPath() + index.ToString()+".html";
using (StreamWriter sw = new StreamWriter(szHtmlPath, true))
{
sw.WriteLine(pageHtml);
}
}
switch(htmlEngin)
{
case HTMLEnginType.HTMLEngin_mshtml:
PhaseHtml_mshtml(pageHtml, szResultPath, szErrorPath, result);
break;
case HTMLEnginType.HTMLEngin_HtmlAgilityPack:
PhaseHtml_HtmlAgilityPack(pageHtml, szResultPath, szErrorPath, result);
break;
}
}
catch (WebException webEx)
{
using (StreamWriter sw = new StreamWriter(szErrorPath, true))
{
sw.WriteLine(webEx.Message);
}
result.bSuccess = false;
}
return result;
}
private void PhaseHtml_mshtml(String pageHtml, String szResultPath, String szErrorPath, PhaseResultBean result)
{
mshtml.HTMLDocument docObject = new mshtml.HTMLDocument();
mshtml.IHTMLDocument2 doc2 = docObject as mshtml.IHTMLDocument2;
doc2.write(pageHtml);
doc2.close();
mshtml.IHTMLDocument3 doc3 = docObject as mshtml.IHTMLDocument3;
int len = doc3.getElementById("shop-all-list").children[0].children.length;
result.total += len;
foreach (IHTMLElement li in doc3.getElementById("shop-all-list").children[0].children)
{
try
{
IHTMLElement title = li.children[1].children[0];
String szTitle = title.innerText;
if (szTitle != null) szTitle = szTitle.Replace("\r\n", "-");
IHTMLElement star = li.children[1].children[1].children[0];
String szStar = star.getAttribute("title");
IHTMLElement reviewNum = li.children[1].children[1].children[1];
String szReviewNum = reviewNum.innerText;
IHTMLElement meanPrice = li.children[1].children[1].children[3];
String szMeanPrice = meanPrice.innerText;
IHTMLElement category = li.children[1].children[2].children[0];
String szCategory = category.innerText;
IHTMLElement address = li.children[1].children[2].children[3];
String szAddress = address.innerText;
if (szAddress != null) szAddress.Replace(",", "-");
IHTMLElement taste = li.children[1].children[3].children[0];
String szTaste = taste.innerText;
IHTMLElement evn = li.children[1].children[3].children[1];
String szEvn = evn.innerText;
IHTMLElement service = li.children[1].children[3].children[2];
String szService = service.innerText;
//将获取的内容写入文本
using (StreamWriter sw = new StreamWriter(szResultPath, true))
{
sw.WriteLine(szTitle + "," + szStar + "," + szReviewNum + "," + szMeanPrice + "," + szCategory + "," + szAddress + "," + szTaste + "," + szEvn + "," + szService);
}
}
catch (Exception Ex)
{
using (StreamWriter sw = new StreamWriter(szErrorPath, true))
{
sw.WriteLine(Ex.Message);
}
result.failed += 1;
}
}
}
private void PhaseHtml_HtmlAgilityPack(String pageHtml, String szResultPath, String szErrorPath, PhaseResultBean result)
{
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(pageHtml);
HtmlAgilityPack.HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("/html[1]/body[1]/div[4]/div[3]/div[1]/div[1]/div[2]/ul[1]/li");
result.total += nodes.Count;
foreach (HtmlAgilityPack.HtmlNode li in nodes)
{
try
{
HtmlAgilityPack.HtmlNode titleA = li.SelectNodes("div[2]/div[1]/a[1]")[0];
HtmlAgilityPack.HtmlNode titleB = li.SelectNodes("div[2]/div[1]/a[2]") == null ? null : li.SelectNodes("div[2]/div[1]/a[2]")[0];
String szTitle = (titleA==null?"":titleA.InnerText) + "-" + (titleB == null ? "" : titleB.InnerText);
if (szTitle != null) szTitle = szTitle.Replace("\n", "");
if (szTitle != null) szTitle = szTitle.Replace(" ", "");
HtmlAgilityPack.HtmlNode star = li.SelectNodes("div[2]/div[2]/span[1]")[0];
String szStar = star.Attributes["title"].Value.ToString();
HtmlAgilityPack.HtmlNode reviewNum = li.SelectNodes("div[2]/div[2]/a[1]")[0];
String szReviewNum = reviewNum.InnerText;
if (szReviewNum != null) szReviewNum = szReviewNum.Replace("\n", "");
if (szReviewNum != null) szReviewNum = szReviewNum.Replace(" ", "");
HtmlAgilityPack.HtmlNode meanPrice = li.SelectNodes("div[2]/div[2]/a[2]")[0];
String szMeanPrice = meanPrice.InnerText;
if (szMeanPrice != null) szMeanPrice = szMeanPrice.Replace("\n", "");
if (szMeanPrice != null) szMeanPrice = szMeanPrice.Replace(" ", "");
HtmlAgilityPack.HtmlNode category = li.SelectNodes("div[2]/div[3]/a[1]")[0];
String szCategory = category.InnerText;
HtmlAgilityPack.HtmlNode addressA = li.SelectNodes("div[2]/div[3]/a[2]")[0];
HtmlAgilityPack.HtmlNode addressB = li.SelectNodes("div[2]/div[3]/span[1]")[0];
String szAddress = addressA.InnerText + "-" + addressB.InnerText;
if (szAddress != null) szAddress.Replace(",", "-");
HtmlAgilityPack.HtmlNode taste = li.SelectNodes("div[2]/span[1]/span[1]")[0];
String szTaste = taste.InnerText;
HtmlAgilityPack.HtmlNode evn = li.SelectNodes("div[2]/span[1]/span[2]")[0];
String szEvn = evn.InnerText;
HtmlAgilityPack.HtmlNode service = li.SelectNodes("div[2]/span[1]/span[3]")[0];
String szService = service.InnerText;
//将获取的内容写入文本
using (StreamWriter sw = new StreamWriter(szResultPath, true))
{
sw.WriteLine(szTitle + "," + szStar + "," + szReviewNum + "," + szMeanPrice + "," + szCategory + "," + szAddress + "," + szTaste + "," + szEvn + "," + szService);
}
}
catch (Exception Ex)
{
using (StreamWriter sw = new StreamWriter(szErrorPath, true))
{
sw.WriteLine(Ex.Message);
}
result.failed += 1;
}
}
}
}
class PhaseResultBean
{
public Boolean bSuccess;
public int total;
public int successed;
public int failed;
}
public enum HTMLEnginType
{
HTMLEngin_mshtml,
HTMLEngin_HtmlAgilityPack
}
C#命令行打印PDF文档
1、使用Windows命令行
BAT Code
print /D:"\\COMPUTERNAME\打印机名" "PDF文件路径"
C# Code
ProcessStartInfo psInfo = new ProcessStartInfo();
psInfo.Verb = "Print"; // or "PrintTo"
psInfo.FileName = pdfFileName;
psInfo.Arguments = String.Format("/p /h \"{0}\" \"{1}\"", pdfFileName, printerName);
psInfo.WindowStyle = ProcessWindowStyle.Hidden;
psInfo.CreateNoWindow = true;
psInfo.UseShellExecute = true;
Process process = Process.Start(psInfo);
2、使用adobe命令行
BAT Code
#发送到默认打印机 AcroRd32.exe /s /o /h /p “PDF文件路径” #发送到指定打印机 AcroRd32.exe /s /o /h /t “PDF文件路径” “打印机名” “驱动” “端口”
C# Code
ProcessStartInfo psInfo = new ProcessStartInfo();
psInfo.FileName = @"C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe";
psInfo.Arguments = String.Format("/s /o /h /p{0}", pdfFileName);
psInfo.WindowStyle = ProcessWindowStyle.Hidden;
psInfo.CreateNoWindow = true;
psInfo.UseShellExecute = true;
Process p= Process.Start(psInfo);
p.WaitForInputIdle();
System.Threading.Thread.Sleep(3000);
if (false == p.CloseMainWindow())p.Kill();
3、使用gostscript命令行
BAT Code
gswin32c.exe -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=ljet4 -sOutputFile="\\spool\打印机名称" "PDF文件路径"
C# Code
ProcessStartInfo psInfo = new ProcessStartInfo();
psInfo.Arguments = String.Format(" -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=ljet4 -sOutputFile=\"\\\\spool\\{0}\" \"{1}\"", printerName, pdfFileName);
psInfo.FileName = @"C:\Program Files\gs\gs8.70\bin\gswin32c.exe";
psInfo.UseShellExecute = false;
Process p= Process.Start(psInfo);
p.WaitForInputIdle();
System.Threading.Thread.Sleep(3000);
if (false == p.CloseMainWindow())p.Kill();
4、使用PrintDocument+第三方渲染插件(参考资料3)
PrintDocument pd = new PrintDocument(); pd.DocumentName = pdfName; pd.PrinterSettings.PrinterName =printerName; pd.PrinterSettings.PrintFileName = fileName; pd.PrintController = new StandardPrintController(); pd.OriginAtMargins = false; pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage); pd.Print();
参考资料:
PDF: direct printing with .NET
How to Silently Print PDFs using Adobe Reader and C#
100% .NET component for rendering PDF documents
Windows服务程序访问NAS
由于服务程序授权与用户桌面授权互不影响,所以即使在用户桌面映射了NAS盘符,在Windows服务程序下仍然是不可以访问的。
一般来说有这样几种做法来访问NAS或共享盘:
1、加入域,通过“域用户认证”或“通过将NAS资源设置对某台计算机授权”来达到访问NAS的目的
2、不加域,在Windows中添加与NAS相同的用户名及密码,服务程序通过该用户名密码登录,可以访问NAS
3、不加域,通过调阅API的方式来获得访问NAS的权限
A、VC实现如下:
DWORD AcessNetDrtive(TCHAR* szRemotePath, TCHAR* szLocalDriver, const TCHAR* szUsername, const TCHAR* szPassword)
{
DWORD dwRetVal;
DWORD dwFlags;
NETRESOURCE nr;
memset(&nr, 0, sizeof(NETRESOURCE));
nr.dwScope = RESOURCE_GLOBALNET;
nr.dwType = RESOURCETYPE_ANY;
nr.lpLocalName = szLocalDriver;
nr.lpRemoteName = szRemotePath;
nr.lpProvider = NULL;
//CONNECT_REDIRECT;CONNECT_UPDATE_PROFILE;
dwFlags = 0;
dwRetVal = WNetAddConnection2(&nr, szPassword, szUsername, dwFlags);
retrun dwRetVal;
}
B、C#实现如下:
public class NetworkDrive
{
public enum ResourceScope
{
RESOURCE_CONNECTED = 1,
RESOURCE_GLOBALNET,
RESOURCE_REMEMBERED,
RESOURCE_RECENT,
RESOURCE_CONTEXT
}
public enum ResourceType
{
RESOURCETYPE_ANY,
RESOURCETYPE_DISK,
RESOURCETYPE_PRINT,
RESOURCETYPE_RESERVED
}
public enum ResourceUsage
{
RESOURCEUSAGE_CONNECTABLE = 0x00000001,
RESOURCEUSAGE_CONTAINER = 0x00000002,
RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
RESOURCEUSAGE_SIBLING = 0x00000008,
RESOURCEUSAGE_ATTACHED = 0x00000010,
RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
}
public enum ResourceDisplayType
{
RESOURCEDISPLAYTYPE_GENERIC,
RESOURCEDISPLAYTYPE_DOMAIN,
RESOURCEDISPLAYTYPE_SERVER,
RESOURCEDISPLAYTYPE_SHARE,
RESOURCEDISPLAYTYPE_FILE,
RESOURCEDISPLAYTYPE_GROUP,
RESOURCEDISPLAYTYPE_NETWORK,
RESOURCEDISPLAYTYPE_ROOT,
RESOURCEDISPLAYTYPE_SHAREADMIN,
RESOURCEDISPLAYTYPE_DIRECTORY,
RESOURCEDISPLAYTYPE_TREE,
RESOURCEDISPLAYTYPE_NDSCONTAINER
}
[StructLayout(LayoutKind.Sequential)]
private class NETRESOURCE
{
public ResourceScope dwScope = 0;
public ResourceType dwType = 0;
public ResourceDisplayType dwDisplayType = 0;
public ResourceUsage dwUsage = 0;
public string lpLocalName = null;
public string lpRemoteName = null;
public string lpComment = null;
public string lpProvider = null;
}
[DllImport("mpr.dll")]
private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword, string lpUsername, int dwFlags);
public static int MapNetworkDrive(string remotePath, string localDrive, string userName, string passWord)
{
NETRESOURCE myNetResource = new NETRESOURCE();
myNetResource.lpLocalName = localDrive;
myNetResource.lpRemoteName = remotePath;
myNetResource.lpProvider = null;
int result = WNetAddConnection2(myNetResource, passWord, userName, 0);
return result;
}
}
IIS程序访问NAS
IIS程序访问NAS,一般有两种情况,加域和没加域
1、加域后,什么都好办,可以通过两种方式认证
A、采用域帐户认证
B、NAS资源可以直接授权给指定计算机访问
2、不加域,那一般有三种方式设置访问权限
A、通过指定程序的用户名和密码访问(这里指定的不是本地的用户名和密码,而是NAS的用户名和密码)
B、不指定用户名和密码,直接通过pass-through authentication方式访问,其规则为:
首先通过用户的真实id进行验证
如果用户没有授权,会尝试使用应用池的账户进行验证
如果应用池账号为NetworkService或LocalSystem,将使用计算机账号进行验证
采取这样的方式IIS会提出警告,因为IIS只有在运行之后,才知道能否访问NAS
C、通过代码实现
//NAS访问封装类
public class NetworkDrive
{
public enum ResourceScope
{
RESOURCE_CONNECTED = 1,
RESOURCE_GLOBALNET,
RESOURCE_REMEMBERED,
RESOURCE_RECENT,
RESOURCE_CONTEXT
}
public enum ResourceType
{
RESOURCETYPE_ANY,
RESOURCETYPE_DISK,
RESOURCETYPE_PRINT,
RESOURCETYPE_RESERVED
}
public enum ResourceUsage
{
RESOURCEUSAGE_CONNECTABLE = 0x00000001,
RESOURCEUSAGE_CONTAINER = 0x00000002,
RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
RESOURCEUSAGE_SIBLING = 0x00000008,
RESOURCEUSAGE_ATTACHED = 0x00000010,
RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
}
public enum ResourceDisplayType
{
RESOURCEDISPLAYTYPE_GENERIC,
RESOURCEDISPLAYTYPE_DOMAIN,
RESOURCEDISPLAYTYPE_SERVER,
RESOURCEDISPLAYTYPE_SHARE,
RESOURCEDISPLAYTYPE_FILE,
RESOURCEDISPLAYTYPE_GROUP,
RESOURCEDISPLAYTYPE_NETWORK,
RESOURCEDISPLAYTYPE_ROOT,
RESOURCEDISPLAYTYPE_SHAREADMIN,
RESOURCEDISPLAYTYPE_DIRECTORY,
RESOURCEDISPLAYTYPE_TREE,
RESOURCEDISPLAYTYPE_NDSCONTAINER
}
[StructLayout(LayoutKind.Sequential)]
private class NETRESOURCE
{
public ResourceScope dwScope = 0;
public ResourceType dwType = 0;
public ResourceDisplayType dwDisplayType = 0;
public ResourceUsage dwUsage = 0;
public string lpLocalName = null;
public string lpRemoteName = null;
public string lpComment = null;
public string lpProvider = null;
}
[DllImport("mpr.dll")]
private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword, string lpUsername, int dwFlags);
public static int MapNetworkDrive(string remotePath, string localDrive, string userName, string passWord)
{
NETRESOURCE myNetResource = new NETRESOURCE();
myNetResource.lpLocalName = localDrive;
myNetResource.lpRemoteName = remotePath;
myNetResource.lpProvider = null;
int result = WNetAddConnection2(myNetResource, passWord, userName, 0);
return result;
}
}
//调用示例
NetworkDrive.MapNetworkDrive("NAS paht with ip", "Local Driver Letter", "user", "password");
CS进程单例模式
1、SingletonExeController.cs
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace SingletonExeTest
{
//通过检测Mutex,确认只会启用一个进程
//第一个进程,会启用Tcp监听,接收参数
//后续进程,通过TcpChannel,将参数传递给第一个进程
//使用前,必须先调用InitSingleton,使用后必须调用UninitSingleton
class SingletonExeController : MarshalByRefObject
{
private static Mutex m_Mutex = null;
private static TcpChannel m_TCPChannel = null;
//初始化
public static void InitSingleton()
{
string assemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName(false).CodeBase;
string uniqueIdentifier = assemblyName.Replace("\\", "_");
m_Mutex = new Mutex(false, uniqueIdentifier);
}
//回收资源
public static void UninitSingleton()
{
if (m_Mutex != null)
{
m_Mutex.Close();
}
m_Mutex = null;
if (m_TCPChannel != null)
{
m_TCPChannel.StopListening(null);
}
m_TCPChannel = null;
}
//判断是否为第一个进程
public static bool FirstProcToRun(int tcpPort,String serviceName)
{
if (m_Mutex.WaitOne(1, true))
{
CreateTCPChannel(tcpPort,serviceName);
return true;
}
else
{
m_Mutex.Close();
m_Mutex = null;
return false;
}
}
//创建TCP监听
private static void CreateTCPChannel(int tcpPort,String serviceName)
{
try
{
m_TCPChannel = new TcpChannel(tcpPort);
ChannelServices.RegisterChannel(m_TCPChannel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(SingletonExeController), serviceName, WellKnownObjectMode.SingleCall);
}
catch(Exception ex)
{
//Fix me...
//port in use
MessageBox.Show(ex.Message);
}
}
//后续进程,向第一个进程发送自己的参数
public static void Send(int port,String serviceName, string[] s)
{
try
{
SingletonExeController ctrl;
TcpChannel channel = new TcpChannel();
ChannelServices.RegisterChannel(channel, false);
try
{
String address = "tcp://localhost:" + port + "/" + serviceName;
ctrl = (SingletonExeController)Activator.GetObject(typeof(SingletonExeController), address);
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
throw;
}
ctrl.Receive(s);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//第一个进程,接收传入参数
public void Receive(string[] s)
{
//Do something here
//...
//Test Code
MessageBox.Show(s[0]);
}
//查找第一个进程
public static Process findMainProcess()
{
Process currentProcess = Process.GetCurrentProcess();
string processName = currentProcess.ProcessName;
Process mainProcess = null;
Process[] allProcesses = Process.GetProcessesByName(processName);
if (allProcesses != null)
{
foreach (Process p in allProcesses)
{
if (p.Id != currentProcess.Id)
{
if (p.MainWindowHandle != null)
{
mainProcess = p;
break;
}
}
}
}
return mainProcess;
}
//查找第一个进程的主窗口
public static IntPtr findMainWnd()
{
IntPtr mainWnd = IntPtr.Zero;
Process p = findMainProcess();
if(p!=null && p.MainWindowHandle != null)
{
mainWnd=p.MainWindowHandle;
}
return mainWnd;
}
}
}
2、Program.cs
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
namespace SingletonExeTest
{
static class Program
{
[STAThread]
static void Main(string[] args)
{
//Debugger.Launch();
//Debugger.Break();
int tcpPort = 9999;
String serviceName = "MyTestService";
SingletonExeController.InitSingleton();
if (SingletonExeController.FirstProcToRun(tcpPort, serviceName))
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Do something here
//...
//Test Code
Application.Run(new MainForm());
}
else
{
IntPtr mainWnd = SingletonExeController.findMainWnd();
Win32Utils.ShowWindow(mainWnd, Win32Utils.SW_RESTORE);
//Real Code
//SingletonExeController.Send(tcpPort, serviceName, args);
//Test Code
String[] msgs = {"hi","hello","good"};
SingletonExeController.Send(tcpPort, serviceName, msgs);
}
SingletonExeController.UninitSingleton();
}
}
}
CS获取可执行文件所在文件夹
//Form程序
private static String getExeFileFolder()
{
String strExeFolder = System.Reflection.Assembly.GetExecutingAssembly().Location;
int nPos = strExeFolder.LastIndexOf("\\");
if (nPos >= 0)
{
strExeFolder = strExeFolder.Substring(0, nPos + 1);
}
else
{
strExeFolder = strExeFolder + "\\";
}
return strExeFolder;
}
//IIS程序
String rootPath = Request.PhysicalApplicationPath;
String strExeFolder = getExeFileFolder(rootPath);
private static String getExeFileFolder(String strExeFolder)
{
int nPos = strExeFolder.LastIndexOf("\\");
if (nPos >= 0)
{
strExeFolder = strExeFolder.Substring(0, nPos + 1);
}
else
{
strExeFolder = strExeFolder + "\\";
}
return strExeFolder;
}
多线程处理
int nMaxThreadNum = 5;
List<List<JobParam>> jobQueue = new List<List<JobParam>>();
//...
for (int i = 0; i < nMaxThreadNum;i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncDoRetrieve), jobQueue[i]);
}
static void AsyncDoRetrieve(object state)
{
if (!(state == null && state is List<JobParam>)) return;
List<JobParam> jobParams= state as List<JobParam> ;
foreach(JobParam param in jobParams)
{
param.delegateDoSomeThing.BeginInvoke(param,null,null);
}
}
使用命名管道实现进程间通信(下)
1、服务端C#
private const String MY_PIPE_NAME = "__MY__PIPE__TEST__";
private const int BUFFER_SIZE = 1024;
NamedPipeServerStream pipe;
StreamWriter writer;
String msg = "Message is comming";
private void PipeCreate()
{
if (pipe != null && pipe.IsConnected)
{
pipe.Close();
}
pipe = new NamedPipeServerStream(MY_PIPE_NAME, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.None);
if (pipe == null)
{
textBox1.Text = textBox1.Text + "Pipe is null";
return;
}
if (pipe.IsConnected)
{
textBox1.Text = textBox1.Text + "Pipe is already connected";
return;
}
pipe.WaitForConnection();
textBox1.Text = textBox1.Text + "Pipe is ready to connect\r\n";
}
private void PipeWrite()
{
if (pipe!=null && pipe.IsConnected)
{
if(writer==null)
{
//关闭BOM(Byte Order Mark 0xfeff)
UnicodeEncoding unicodeWithoutBom = new System.Text.UnicodeEncoding(false, false);
writer = new StreamWriter(pipe, unicodeWithoutBom);
//写完后直接flush,会阻塞
writer.AutoFlush = true;
}
writer.Write(msg);
textBox1.Text = textBox1.Text + "Pipe message sent \r\n";
}
else
{
textBox1.Text = textBox1.Text + "Pipe is not connected \r\n";
}
}
private void PipeClose()
{
if (pipe!=null && pipe.IsConnected)
{
writer.Close();
pipe.Close();
writer = null;
pipe = null;
}
}
2、客户端C#
private const String MY_PIPE_NAME = "__MY__PIPE__TEST__";
private const int BUFFER_SIZE = 1024;
NamedPipeClientStream pipe;
StreamReader reader;
private void PipeConnect()
{
if (pipe != null && pipe.IsConnected)
{
pipe.Close();
}
pipe = new NamedPipeClientStream(".", MY_PIPE_NAME, PipeDirection.InOut);
if (pipe != null)
{
if (!pipe.IsConnected)
{
pipe.Connect();
textBox1.Text = textBox1.Text + "\r\npipe is connected";
}
else
{
textBox1.Text = textBox1.Text + "\r\npipe is already connected";
}
}
else
{
textBox1.Text = textBox1.Text + "\r\npipe is null";
}
}
private void PipeRead()
{
if (pipe.IsConnected)
{
if (reader == null)
{
reader = new StreamReader(pipe, Encoding.Unicode);
}
char[] buffer = new char[BUFFER_SIZE];
int byteRead = reader.Read(buffer, 0, BUFFER_SIZE);
String msgTxt = new String(buffer, 0, byteRead);
textBox1.Text = textBox1.Text + "\r\nPipe msg received: " + msgTxt;
}
else
{
textBox1.Text = textBox1.Text + "\r\nPipe is not connected";
}
}
private void PipeClose()
{
if (reader != null)
{
reader.Close();
reader = null;
}
if (pipe != null && pipe.IsConnected)
{
pipe.Close();
}
textBox1.Text = textBox1.Text + "\r\npipe is closed";
}
匿名管道重定向命令行输出
首先是MFC,注意事项:
1、管道读写是FIFO
2、读写指针,要记得关闭
3、编译时用了UNICODE,但CMD读取回来时ANSI,所以要转换一下字符集
SECURITY_ATTRIBUTES sa;
ZeroMemory(&sa, sizeof(sa));
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE hRead, hWrite;
if (!CreatePipe(&hRead, &hWrite, &sa, 0)) {
MessageBox(L"Error On CreatePipe()");
return;
}
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
if (!::CreateProcess(L"C:\\Windows\\System32\\cmd.exe", L"/c dir /b D:\\Downloads"
, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)) {
showMeErrorInfo();
return;
}
CloseHandle(hWrite);
char buffer[4096] = { 0 };
DWORD bytesRead;
while (true) {
if (ReadFile(hRead, buffer, 4095, &bytesRead, NULL) == NULL)
{
break;
}
UINT CodePage = 0;
DWORD dwNum;
dwNum = MultiByteToWideChar(CodePage, 0, buffer, -1, NULL, 0);
if (dwNum)
{
wchar_t *pwText;
pwText = new TCHAR[dwNum];
if (pwText)
{
MultiByteToWideChar(CodePage, 0, buffer, -1, pwText, dwNum);
}
//m_Edit.SetWindowText(pwText);
delete[]pwText;
pwText = NULL;
}
UpdateData(false);
Sleep(200);
}
CloseHandle(hRead);
C#的话,就简单多了:
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "C:\\Windows\\System32\\cmd.exe";
startInfo.Arguments = "/c dir /b D:\\Downloads";
startInfo.RedirectStandardOutput = true;
//startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = false;
Process p=Process.Start(startInfo);
String cmdOut = "";
while(!p.HasExited)
{
cmdOut = p.StandardOutput.ReadLine();
textBox1.Text += cmdOut + "\r\n";
p.WaitForExit(10);
}
cmdOut = p.StandardOutput.ReadToEnd() + "\r\n";
textBox1.Text += cmdOut ;