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; } }
Category Archives: Language
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 }
Python抓取网页内容
1、BeautifulSoup解析网页
''' Created on 20150203 @author: Hansen ''' import urllib2 import sys import io from bs4 import BeautifulSoup #Fetch HTML from URL def fecth_html(index,url,keepHtml,resultFile): req = urllib2.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.2; rv:16.0) Gecko/20100101 Firefox/16.0') rsp = urllib2.urlopen(req) content = rsp.read() #receive_header = rsp.info() #print(sys.getfilesystemencoding()) #content = content.decode('utf-8','replace') if keepHtml: fileinfo = open(str(index)+'.html','w') fileinfo.write(content) print("save file "+ str(index)+'.html: ok') parse_html(content,resultFile) #Parse HTML def parse_html(html,resultFile): soup = BeautifulSoup(html,fromEncoding="utf8") lis = soup.select('div.shop-all-list li') print(len(lis)) for li in lis: szTitle = (li.select('div:nth-of-type(2) div:nth-of-type(1) a h4'))[0].get_text() szTitle = szTitle.replace("\r\n", "-").replace(" ",""); szStar = (li.select('div:nth-of-type(2) div:nth-of-type(3) span'))[0]['title'] szReviewNum = (li.select('div:nth-of-type(2) div:nth-of-type(3) a:nth-of-type(1)'))[0].get_text() szReviewNum = szReviewNum.replace("\n", "").replace(" ",""); szMeanPrice = (li.select('div:nth-of-type(2) div:nth-of-type(3) a:nth-of-type(2)'))[0].get_text() szMeanPrice = szMeanPrice.replace("\n", "").replace(" ",""); szCategory = (li.select('div:nth-of-type(2) div:nth-of-type(4) a:nth-of-type(1)'))[0].get_text() szAddressA = (li.select('div:nth-of-type(2) div:nth-of-type(4) a:nth-of-type(2)'))[0].get_text() szAddressB = (li.select('div:nth-of-type(2) div:nth-of-type(4) span:nth-of-type(3)'))[0].get_text() szAddress = (szAddressA+"-"+szAddressB).replace("\r\n", "-").replace(" ",""); szTaste = (li.select('div:nth-of-type(2) span:nth-of-type(5) span:nth-of-type(1)'))[0].get_text() szEvn = (li.select('div:nth-of-type(2) span:nth-of-type(5) span:nth-of-type(2)'))[0].get_text() szService = (li.select('div:nth-of-type(2) span:nth-of-type(5) span:nth-of-type(3)'))[0].get_text() fileinfo = io.open(resultFile,'a',encoding='utf_16') fileinfo.write(szTitle+","+szStar+","+szReviewNum+","+szMeanPrice+","+szCategory+"," +szAddress+","+szTaste+","+szEvn+","+szService+"\n")
2、PyQuery解析网页
''' Created on 20150203 @author: Hansen ''' import urllib2 import sys import io from pyquery import PyQuery #Fetch HTML from URL def fecth_html(index,url,keepHtml,resultFile): req = urllib2.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.2; rv:16.0) Gecko/20100101 Firefox/16.0') rsp = urllib2.urlopen(req) content = rsp.read() #receive_header = rsp.info() #print(sys.getfilesystemencoding()) #content = content.decode('utf-8','replace') if keepHtml: fileinfo = open(str(index)+'.html','w') fileinfo.write(content) print("save file "+ str(index)+'.html: ok') parse_html(content,resultFile) #Parse HTML def parse_html(html,resultFile): doc = PyQuery(html) lis = doc('div.shop-all-list li') print(len(lis)) for li in lis: li_doc = PyQuery(li) szTitle = li_doc('li div div a h4').text() szTitle = szTitle.replace("\r\n", "-").replace(" ",""); szStar = li_doc("li div div span").filter('.sml-rank-stars').attr('title') szReviewNum = li_doc('li div div a').filter('.review-num').text() szReviewNum = szReviewNum.replace("\n", "").replace(" ",""); szMeanPrice = li_doc('li div div a').filter('.mean-price').text() szMeanPrice = szMeanPrice.replace("\n", "").replace(" ",""); szCategory = li_doc('li div div a span').filter('.tag').eq(1).text() szAddressA = li_doc('li div div a span').filter('.tag').eq(1).text() szAddressB = li_doc('li div div span').filter('.addr').eq(0).text() szAddress = (szAddressA+"-"+szAddressB).replace("\r\n", "-").replace(" ",""); szTaste = li_doc('li div span span').eq(0).text() szEvn = li_doc('li div span span').eq(1).text() szService = li_doc('li div span span').eq(2).text() fileinfo = io.open(resultFile,'a',encoding='utf_16') fileinfo.write(szTitle+","+szStar+","+szReviewNum+","+szMeanPrice+","+szCategory+"," +szAddress+","+szTaste+","+szEvn+","+szService+"\n")
从WIN ADT复制到MAC ADT
Android SDK超级大(我现在有26.5G),而连接Google的速度超级慢,一次下载要好久。
最近准备在MAC进行Android开发,别的都好下载,但Adroid SDK就有些太大了,于是考虑从WIN下直接复制到MAC。
Android SDK主要由下面几部分组成:
/add-ons:GoogleAPI,操作系统无关 /build-tools:构建工具,这个和操作系统相关的,要重新下载 /docs:文档,操作系统无关 /extras:扩展内容,是否需要重新下载与其功能有关 /extras/android:操作系统无关 /extras/google:操作系统无关 /extras/intel:intel的硬件加速驱动,操作系统相关,需重新下载 /platforms:android平台,早期操作系统相关,后期将操作系统相关内容放到了build-tools中,可以全部拷贝过去,系统相关内容会自动重新下载 /platform-tools:管理工具,这个和操作系统相关的,要重新下载 /samples:demo,操作系统无关 /sources:android源码,操作系统无关 /system-images:android系统映像,操作系统无关 /temp:下载缓存,不需要拷贝 /tools:管理工具,这个和操作系统相关的,要重新下载
MAC设置AndroidStudio初始环境
1、从Oracle下载MAC版本的JDK7
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2、从Google下载MAC版本Android Studio和Android SDK Manager
http://developer.android.com/sdk/index.html
3、安装JDK7、Android Studio、Android SDK Manager,并下载需要版本的Android SDK
4、此时双击Android Studio会报错:
Android Studio was unable to find a valid JVM.
这是因为Android Studio默认使用JDK1.6.*的原因
在Finder中打开Application文件夹,在“Android Studio.app”上右键,显示程序包内容 编辑Content/Info.plist,修改属性JVMOptions->JVMVersion一行,从1.6.*修改为1.7.*
5、此时双击Android Studio会尝试从Google获取最新的Android SDK信息
Fetching Android SDK component information
当然你读不到啦,只好屏蔽初始化方法:
编辑Content/idea.properties/bin/idea.properties文件,添加一行 disable.android.first.run=true
6、现在Android Studio可以启动了,但是不能新建项目
需要告诉Android Studio,Android SDK在哪里:
主界面-》Configure-》Project Defaults-》Project Structure-》Android SDK location 填写Android SDK的绝对路径,保存,然后就能新建应用了
7、那就新建一个简单应用测试一下吧,当然先是虚拟机:
Starting emulator for AVD 'new' emulator: ERROR: x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is properly installed and usable. CPU acceleration status: HAX kernel module is not installed!
这是因为HAXM模块没有安装,前往Android SDK根目录
安装下面的软件: PATH_TO_SDK/extras/intel/Hardware_Accelerated_Execution_Manager/IntelHAXM_1.1.1_for_10_9_and_above.dmg
8、然后就是在设备上测试,Android SDK找不到我的设备
#添加adb路径 echo "export PATH=${PATH}:/PATH_TO_SDK/android-sdk-macosx/platform-tools/">>~/.bash_profile #然后刷新一下 source .bash_profile #添加设备厂商ID(我的是小米),可以在系统报告中看到设备厂商ID信息 echo"0x2717">>~/.android/adb_usb.ini #杀掉adb服务 adb kill-server #重启adb服务 adb sever #PTP模式连上手机,当然要开启手机调试咯,这样就能看到设备了 adb devices
9、连上设备了,运行时报错:
Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.neohope.testapp/.LoginActivity } from null (pid=29619, uid=2000) not exported from uid 10139
这个错误是因为Main Activity没有设置,在Manifest中对应的Activity中增加如下设置即可
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
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");
不支持一个STA线程上针对多个句柄的WaitAll
最近项目中用了COM控件,同时也用了多线程,在等待线程退出的地方,使用了
AutoResetEvent[] tEevents; //... WaitHandle.WaitAll(tEevents);
程序运行到这里,就会报错:
不支持一个STA线程上针对多个句柄的WaitAll
当时事情很急,将其调整为
AutoResetEvent[] tEevents; //... foreach(var tEvent in tEevents) { tEvent.WaitOne(); }
就将这个问题绕了过去。
后来,在Stackoverflow上面,查了STA和MTA的区别。COM线程模型称为Apartment模型,分为STA和MTA两种。
STA(Single Thread Apartment):
STA是非线程安全的,常用于UI界面,其他线程要访问STA模式的COM组件,需要通过STA线程进行访问(其实就变成了单线程调用)
MTA(Multi Thread Apartment):
MTA是线程安全的,COM的程序员自己处理了并发的问题,其他线程可以直接访问COM组件
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(); } } }