發表文章

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(Env...

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

Xamarin : Designer show error : you need to use a theme.appcompat theme (or descendant) with the design library

圖片
這個問題是出現在使用 Visual Studio 2017 Xamarin 建立 Android 單一檢視應用程式時發生的問題,主要原因應該 原因是這個專案預設使用了 appcompat 主題的 android.support.design.widget.CoordinatorLayout 框架,而預設主題無法解析這個框架導致錯誤 如果你在 Designer 的畫面上點擊 show error 就可以看到這個相關訊息 java.lang.IllegalArgumentException was throw  you need to use a theme.appcompat theme (or descendant) with the design library 如果堅持使用 CoordinatorLayout 解決方式就是去更改 Designer 上的 主題(Theme),將它改為 Theme.AppCompat 樣式 就可以正常顯示了

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

圖片
這是一支專門下載國道高速公路交通路況圖的小程式。 程式下載: 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", "*/*"...

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())  ...

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"...