發表文章

目前顯示的是有「dotnet」標籤的文章

C# 使用 Process.Start 執行外部程式

圖片
C# 執行外部程式的方式並不難,也很簡單,首先引入 using System.Diagnostics; 然後使用 Process.Start( "OtherProgram.exe" ) 方式就可以呼叫並執行。 但是,某些情況下會導致程式無法被執行(或是無法正常執行), 很多原因在於『執行程式的起始位置』,由於被呼叫的程式執行時, 它所啟動的路徑其實是在呼叫程式的路徑下, 如果被呼叫程式需要讀取與程式相同路徑下的文件檔案(或是INI),可能會導致找不到的問題。 為了測試這樣的現象,我準備了2支程式, 一支是被呼叫端的程式 HelloConsole.exe 另外一支就是呼叫端程式 CallOtherProgram.exe HelloConsole.exe 這支程式 在啟動時會讀取相同路徑下的 Doc.txt 並將內容顯示出來,如果有參數也會把參數列出來。而這支程式我固定放在 D:\TEST\ 下,以方便測試,如果不是在這路徑下,那呼叫端的程式碼裡面的路徑也要變更。 HelloConsole.exe using System; using System.IO; namespace HelloConsole {     class Program     {         static void Main(string[] args)         {             Console.WriteLine("This is HelloConsole.exe");             Console.WriteLine(" ");             Console.WriteLine("Environment.CurrentDirectory is ");             Console.WriteLine(Environment.CurrentDirectory);             Console.WriteLine(" ");             Console.WriteLine("AppDomain.CurrentDomain.BaseDire

C# 在環境變數路徑下找尋並執行程式

圖片
這個需求是希望在系統環境變數給定的路徑 PATH 下找尋並執行程式 //取得系統環境變數 var enviromentPath = System. Environment . GetEnvironmentVariable ( "PATH" ); //把路徑分割出來 var paths = enviromentPath. Split ( ';' ); //利用LINQ對每個路徑進行 File.Exists 查詢,並取得第一個找到的程式 var exePath = paths.Select(x => Path . Combine (x, "myApp.exe" )).Where(x => File . Exists (x)).FirstOrDefault(); //如果有程式存在才執行 if ( string .IsNullOrWhiteSpace(exePath) == false ) {     Process . Start (exePath); } 參考: Process.Start() and PATH environment variable

國道高速公路交通路況圖擷取小程式

圖片
這是一支專門下載國道高速公路交通路況圖的小程式。 程式下載: FreewayTrafficPics.zip 需要環境: dotNet Framework 4.5 、 dotNet Framework 4.5 語言套件 使用方式: 設定程式設定檔 FreewayTrafficPics.ini 裡面有個 SavePath 路徑,這個是你要儲存圖檔的路徑(該路徑資料夾必須先建立好,程式不會主動建立資料夾)。 設定 Windows 工作排程器,把程式放入排程,設定為每1分鐘執行一次(或5分鐘,程式會自動把缺少的檔案補齊)。 這個國道路況圖的路況,在 交通部高速公路局 發布,每分鐘更新一次圖檔,這個圖檔分成北中南 3 個區塊,檔案名稱命名規則如下: 北部:map_n_3_{分鐘}.jpg 中部:map_c_3_{分鐘}.jpg 南部:map_s_3_{分鐘}.jpg 圖片樣式如下: 北部 中部 南部 由我們的程式依照排程每分鐘去抓一次(原則上是抓前一分鐘比較不會有問題),抓到我們指定的資料夾: ※應用方式: 寫個主動式網頁,不管是透過 ajax 或是 refresh 或是 flash 方式都可以,輪播最新的北中南三個檔案就可以在畫面上讓使用者看到畫面了 下面是使用 HTML 展示的範例: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=big5" /> <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> <META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT"> <META HTTP-EQUIV="PRAGMA" CONTENT=&

ASP.NET Core 2 使用 HttpClientFactory 讀取中央氣象局 OpenData 的 API (json格式)

圖片
帳號申請方式可以參考前一篇文章: ASP.NET Core 2 使用 HttpClientFactory 讀取中央氣象局 OpenData 的XML下載→註冊CWB會員 以下稱中央氣象局 OpenData 平台為 CWBODP 這個API服務是提供給APP使用的,畢竟XML格式對行動裝置的運算解讀能力與傳輸資料量都是很傷的(消耗資源),操作起來也不是那麼便利,雖然它(XML)比較嚴謹。 CWODP 取用 API 資料的 URI: https://opendata.cwb.gov.tw/api/v1/rest/datastore/{資料代碼}?Authorization={授權碼} 前面篇章 已經講述過 HttpClientFactory 的用法了,所以這裡我只演示直接處理接收後的資料方式。 首先在 startup.cs 裡面的 ConfigureServices 定義讀取方法(以讀取F-C0032-001資料為例): startup.cs         public void ConfigureServices( IServiceCollection services)         {             services.AddHttpClient( "CWBAPI" , c =>             {                 c.BaseAddress = new Uri ( "https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=CWB-1234ABCD-78EF-GH90-12XY-IJKL12345678" );                 c.DefaultRequestHeaders.Add( "Accept", "*/*" );                 c.DefaultRequestHeaders.Add( "User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firef

ASP.NET Core 2 使用 HttpClientFactory 讀取中央氣象局 OpenData 的XML 下載

圖片
這是使用 ASP.NET Core 2 來讀取 CWB 的開放資料的 XML 檔,並讓 Client 端下載方式 註冊CWB會員 CWB OpenData 平台(以下稱CWBODP)取用資料必須先註冊會員→ 這裡註冊 然後,登入OpenData平台→ 這裡登入 選擇 『資料選擇說明』頁面 ,在下方可以找到『取得授權碼』,這個頁面下有使用教學 要取得資料代碼可以從 『資料清單』頁面 取得需要的代碼 有了上述資訊後,就可以著手開始做 .NET Core 2 的取用程式了。 CWODP取用 XML 檔案的 URI: http://opendata.cwb.gov.tw/opendataapi?dataid= {資料代碼} &authorizationkey= {授權碼} .NET Core 2 使用 HttpClient 有以下幾種: 一般 HttpClient 方式 直接使用 HttpClientFactory 具名式 Client 型別式 Client 產生式 Client 一般 HttpClient 方式 FileController.cs using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using System.Net.Http; namespace CWBReader.Controllers {     [Route("[controller]")]     public class FileController : Controller     {         [Route("")]         public async Task<string> DownloadFile()         {             using (var client = new HttpClient())             {                 string url = "http://opendata.cwb.gov.tw/opendataapi?dataid=F-C0032-0

C# 存取 Sybase 資料庫

圖片
要讓 dotNet 程式存取 Sybase 資料庫,首先,你必須取得 Sybase PC Client 的幾個DLL檔案: Sybase.Data.AseClient.dll sybdrvado11.dll sybdrvssl.dll 如果是開發者,可能需要先安裝 PC Client <<這裡下載>> ,安裝完後再到 Visual Studio的專案下,把 Sybase.Data.AseClient.dll 加入參考 當要執行時,記得把 sybdrvado11.dll、sybdrvssl.dll 一並複製到執行路徑下(Sybase.Data.AseClient.dll 會自動在編譯時加入到路徑下所以不用特別拷貝) 使用時要引用: using Sybase.Data.AseClient; 程式流程部分 : 1、建立連線 → 2、建立SQL命令 → 3、建立傳遞參數(如果需要) → 4、傳遞參數值(如果有建立傳遞參數) → 5、執行命令 → 6、取得查詢資料 連線資料庫 //連線資料庫 AseConnection aseCon; aseCon = new AseConnection ( "DataSource= ServerIPorName ;Port= 5000 ;Database= Windstone ;UID= sa ;PWD= adminPassw0rd " ); aseCon.Open(); SQL指令準備有兩種處理方式 : 一次性執行或是重複執行。 //一次執行的方式 string employeeNo = "052419" ; DateTime inDate = new DateTime (2016,5,1); AseCommand GetEmplName = new AseCommand ( "SELECT empl_name FROM employee WHERE empl_no = '" + employeeNo + "' and job_date > '" + inDate.toString( "yyyy/MM/dd"

C# INI Profile Read and Write Class

圖片
C# dotNet 程式對INI的設定檔存取,因為 微軟考量到 INI 存取的多程序存取無法達到同步問題,故從 dotNet 取消對 INI 檔案的支援,但是實際上卻還是有許多地方需要用到它。 所以,將它提出製作成一個 Class,方便以後用到: using System; using System.Text; using System.Runtime.InteropServices; using System.IO; namespace Profile.Interop {     class IniFile     {         public string FileName { get ; set ; }         public IniFile()         {             //在預設情況下,會使用執行檔案名稱做為INI的檔案名稱(與執行檔案相同位置)             string path = System.Diagnostics. Process .GetCurrentProcess().MainModule.FileName;             string filename = Path .GetFileNameWithoutExtension(path) + ".ini" ;             string dir = AppDomain .CurrentDomain.BaseDirectory;             FileName = Path .Combine(dir, filename);         }         public IniFile( string fileName)         {             //使用者指定             FileName = fileName;         }         [ DllImport ( "kernel32" )]         private static extern long WritePrivateProfileString( string section,