c#

在 C# 解壓縮整個檔案(可覆寫舊檔)

最近在用 C# 寫程式,處理到解壓縮的部份,雖然它有很方便的方法

 

ZipFile.ExtractToDirectory(壓縮檔, 目的目錄);

 

不過實測後,發現一個問題,若目的已有相同的檔案,則會産生錯誤,所以要自行解決這個問題。

 

我原本想過三個方法。

 

第一個是先解壓縮在其它目錄,再全部移到指定的目錄,但缺點是可能會佔用太多空間。如果原本的檔案就很大,要解開的檔案也很大,硬碟空間不夠的情況,解壓縮就會失敗,所以這個方法就先放棄了。

 

第二個方去是先逐一檢查檔案是否存在,存在就先刪除。如此一來,先把舊檔案刪掉,空間就會多一點,比較不擔心空間不夠的問題,最後再用 ZipFile.ExtractToDirectory 解壓縮至指定目錄。

 

第三個方法同上,只是突然想到,乾脆在檢查是否存在之後,就直接解壓縮該檔案,不用等到最後再全部解壓縮。

 

重要度:
文章分類:

C# 使用 HttpClient 非同步下載檔案

因為所寫的 C# 程式需要由網路下載大的檔案,但官方文件所寫的內容不夠多,所以花了點時間,研究了 HttpClient 非同步下載,並且記錄了一些資料,以供自己未來複習及提供有需要的人參考。

 

WebClient vs HttpClient

 

在微軟官方文件中,一開始有找到了 WebClient 和 HttpClient 二種類別,結果在 WebClient 的官方文件中,看到這一段:

 

 

我們不建議您將類別用於 WebClient 新的開發。 請改用 System.Net.Http.HttpClient 類別。
 

 

所以就放棄研究 WebClient,直攻 HttpClient 了。

 

HttpClient 及注意事項

 

HttpClient 雖然比 WebClient 好用,但有一些事要注意。

 

首先是不要大量使用新建立的 HttpClient,底下是官方文件的說明:

 

 

HttpClient 的目的是要具現化一次,並在應用程式的整個生命週期中重複使用。具現化每個要求的 HttpClient 類別,將會耗盡繁重負載下可用的通訊端數目。這會導致 >socketexception 錯誤。以下是正確使用 HttpClient 的範例。
 

 

 

public class GoodController : ApiController

{

    private static readonly HttpClient HttpClient;

 

    static GoodController()

    {

        HttpClient = new HttpClient();

    }

}

 

不過,在實測中,最多同時只能開啟二個連結。

 

查了不少資料,才知道有個變數 ServicePointManager.DefaultConnectionLimit,官方說明

 

 

ServicePoint 物件所允許的同時連線最大數。 ASP.NET 裝載的應用程式預設的連線限制為10,其他則為2。

 

 

所以若要多開啟幾個連結,不知如何做才好?目前我只找到二個方法:

 

1. 增加 ServicePointManager.DefaultConnectionLimit

2. HttpClient 每次都建立新物件,就沒這個問題了。

 

 

在網路上也查詢了其它文章,有人提到若用 static 的方式來執行 HttpClient ,也會有一些限制,例如長期連線時,可能因為網路上的 DNS 更新後,HttpClient 沒有更新解析 DNS,就會有問題。

 

因此有人介紹更好用的 HttpClientFactory,不過官方文件我只有查到 IHttpClientFactory,而且看起來有點複雜,反正我目前的程式不會用到大量的連線,也不會需要長時間使用,不用擔心 DNS 更新的問題,所以決定還是使用 HttpClient 即可。

 

另外,官方還有這個建議:

 

 

想要下載大量資料 (50 mb 或以上的) ,則應用程式應該串流這些下載,而不使用預設的緩衝。如果使用預設緩衝,用戶端記憶體使用量將會變得非常大,可能會大幅降低效能。

 

 

這也是我需要測試的,因為我需要下載的檔案會有超過 GB 的大小。

 

重要度:
文章分類:
電腦標籤:

C# 使用 Skin 套件讓程式更美觀 (下)

 

DarkUI

 

DarkUI 是參考此頁

 

https://ourcodeworld.com/articles/read/517/how-to-use-a-darkui-dark-user-interface-in-winforms-c-sharp

 

首先用 git clone 這個專案

 

https://github.com/RobinPerris/DarkUI.git

 

用 Visual Studio 開啟它,並且 build 它。會在 bin/Debug 中產生新的 DarkUI.dll

 

再開新專案,將此 dll 的元件加入工具箱中,會看到一堆暗色系的元件。

 

image

 

重要度:
文章分類:

C# 使用 Skin 套件讓程式更美觀 (中)

Material Skin

 

Material Skin 有不少人推薦,安裝方法同上,先在 NuGet 套件中搜尋 material skin,底下可以看到有不少種,應該是挑比較新的版本吧?我多挑幾個來試試。

 

image

 

在測試時有好幾個是無法順利安裝的,例如:

 

image

 

再把安裝好的套件一一加入工具箱中。

 

image

 

全部一一安裝時,發現會有衝突,底下改試著逐一安裝。

 

重要度:
文章分類:

C# 使用 Skin 套件讓程式更美觀 (上)

Iris Skin

 

首先建立一個專案,放上一堆元件。

 

image

 

在專案「參考」按右鍵,選取「管理 NuGet 套件」。

 

image

 

在 NuGet 套件管理員瀏覽頁上方的搜尋框中輸入「irisskin」,會找到 HiNetCloud.IrisSkin4,選擇它並在右方選擇安裝,就會安裝到專案中。

 

重要度:
文章分類:

C# WinForm 取得傳入的參數

C# WinForm 程式要取得使用者傳入的參數,可以使用

 

Environment.GetCommandLineArgs();

 

所取得的第一個元素就是執行檔的檔案名稱。

 

 

public MainForm()

{

    InitializeComponent();

    string[] args = Environment.GetCommandLineArgs();

    foreach(string s in args) {

        MessageBox.Show(s);

    }

}

 

另一種在網路上常看到的方法,就是手動在 Main 主程式的參數中加上 string[] args。

這個方式取得的參數,並不包含執行檔的檔案名稱,這是和上面方法不同的地方,在使用上要注意。

 

[STAThread]

static void Main(string[] args)

{

    foreach(string s in args) {

        MessageBox.Show(s);

    }

    Application.EnableVisualStyles();

    Application.SetCompatibleTextRenderingDefault(false);

    Application.Run(new MainForm());

}

 

 

重要度:
文章分類:
電腦標籤:

C# 單元測試

C# 單元測試

參考:

https://docs.microsoft.com/zh-tw/visualstudio/test/getting-started-with-unit-testing?view=vs-2019&tabs=mstest

 

建立測試程式

先建立測試程式

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace UnitTest {

    public class Sample {

 

        int a = 0;

        int b = 0;

 

        public Sample(int x, int y) {

            a = x;

            b = y;

        }

 

        public int Add() {

            return a + b;

        }

 

        public int Add2() {

            return a * 2 + b * 2;

        }

 

        public int AddAnother (int x) {

            return a + b + x;

        }

    }

}

 

建立測試單元

在程式視窗中按滑鼠右鍵,選擇「建立單元測試」

 

image

重要度:
文章分類:

在 Visual Studio 上使用 GitHub 進行版本控制

本文簡單示範 Visual Studio 建立 C# 專案並使用 GitHub 基本功能。

雖然 Windows 的 TortoiseGit 很好用,但如果可以直接在 Visual Studio 上直接操作,那還是比較方便。

建立專案

image

 

image

重要度:
文章分類:

Perl C++ C# 使用 POST GET 存取 JSON 等網路資源

 

前言

因為工作上有需要使用 POST 存取網路上的 JSON 資料,最初得到的方法是使用 CURL,但一開始就失敗了。後來改用程式來測試,希望藉由程式傳回的資料來找出錯誤的原因。結果由 CRUL、Perl、C++、C# 一路用過去,一直都失敗。

最後,在 C# 終於試出一組成功的方法,再利用這個成功的模式一路再試回其他程式,最後只有 CURL 還是失敗,其他都成功了,所以在此記錄結果。

 

初試啼聲:CURL

最初得到的方法是使用 curl ,格式如下:

 

curl -X POST http://localhost/test.php -H "content-Type: application/json" -d '[{"src":"如是我聞"}]'

 

在 Win10 底下也有 curl,測試時卻失敗。使用 Mac 和 Linux 系統的人則告知有得到正確的結果。

首先上網查詢,有人說要把傳出去的字串最外面的單引號改成雙引號,裡面的雙引號要加斜線。

 

"[{\"src\":\"如是我聞\"}]"

 

結果還是失敗。

最後我知道這樣是正確的,只是送出去中文變成亂碼,我改用 code page  65001 送出資料也是不行,但若送英文資料則沒有問題。

 

重要度:
文章分類:
訂閱 c#