国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C#非常實用的技巧

這篇具有很好參考價值的文章主要介紹了C#非常實用的技巧。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、解壓和壓縮

.NET Framework 4.5以上版本:

string zipFilePath = @"C:\path\to\file.zip";
        string destFolder = @"C:\path\to\destination\folder";

        using (var archive = ZipFile.OpenRead(zipFilePath))
        {
            foreach (var entry in archive.Entries)
            {
                // 如果是文件,則解壓到指定目錄
                if (!entry.FullName.EndsWith("/"))
                {
                    string destinationPath = Path.Combine(destFolder, entry.FullName);
                    entry.ExtractToFile(destinationPath, true);
                }
                // 如果是文件夾,則創(chuàng)建對應(yīng)目錄
                else
                {
                    Directory.CreateDirectory(Path.Combine(destFolder, entry.FullName));
                }
            }
        }

.NET Framework 4以下

雖然微軟的net提供了很多解壓和壓縮的程序,但是如果你的系統(tǒng)是net?Framework4,那上面的代碼就用不了了,此時需要借用7za.exe

1.0 C# 解壓文件

//放置7z的路徑
            string Zip7FileName = Path.Combine("D:\\Project", "7za.exe");
            var tarArgs = string.Format("x \"{0}\" -o\"{1}\" -y", "待解壓路徑", "輸出路徑");
            using (var process = new Process())
            {
                process.StartInfo.FileName = Zip7FileName;
                process.StartInfo.Arguments = tarArgs;
                process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
                process.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
                process.Start();
                process.WaitForExit();
            }

解壓解釋:

var tarArgs = string.Format("x \"{0}\" -o\"{1}\" -y", "待解壓路徑", "輸出路徑");

-y 參數(shù)表示 "yes to all",即自動回答 "yes",也就是在出現(xiàn)任何提示時都自動選擇 "是"。這意味著 7z 命令行工具不會詢問用戶是否覆蓋已有的文件、創(chuàng)建缺失的目錄等等,而是直接按照默認(rèn)行為執(zhí)行。

例如,在以下語句中 -y 參數(shù)告訴 7z 命令行工具在解壓縮文件時自動覆蓋目標(biāo)文件夾中已有的同名文件。

 
 

csharpCopy Code

var tarArgs = string.Format("x \"{0}\" -o\"{1}\" -y", "待解壓路徑", "輸出路徑");

-o 參數(shù)表示 "output directory",即指定解壓縮后的文件輸出目錄。在 7z 命令行工具中,可以使用 -o 參數(shù)來指定輸出目錄的路徑。例如,在以上語句中,-o"{1}" 參數(shù)將解壓縮后的文件輸出到名為 importzipedFolder 的目錄中。

需要注意的是,7z 命令行工具只能解壓縮一些特定的文件格式,例如.zip, .tar, .gz, .bz2 等等。如果需要解壓縮其它類型的文件,可能需要使用相應(yīng)的解壓縮工具,并根據(jù)相應(yīng)工具的使用方法來編寫代碼。

1.1 C# 壓縮文件

//選擇保存壓縮包的的位置(此處以C:\Program Files (x86)\001.tar為例)
            string zipFilePath = "C:\Program Files (x86)\001.tar";
            StringBuilder tarArgs = new StringBuilder($"a -ttar \"{zipFilePath}\"");
            //需要壓縮的文件夾
            DirectoryInfo dirInfo = new DirectoryInfo(Path.Combine(exportzipedFolder));
            foreach (var subDir in dirInfo.GetDirectories())
            {
                tarArgs.Append(" \"").Append(subDir.FullName).Append("\"");
            }
            using (var process = new Process())
            {
                process.StartInfo.FileName = Zip7FileName;
                process.StartInfo.Arguments = tarArgs.ToString();
                process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
                process.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.CreateNoWindow = true;
                process.Start();
                process.WaitForExit();
            }
            if (Directory.Exists(exportzipedFolder))
            {
                Directory.Delete(exportzipedFolder, true);
            }

2 按位讀取二進(jìn)制

2.0 C#讀取二進(jìn)制

string filePath = "C:\Program Files (x86)\001.bin";
            using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                using (var reader = new BinaryReader(fs, Encoding.Default))
                {
                    //此處需要知道,需要讀取多少位、用什么類型讀取
                    var readType =Type;
                    object countent = new object();
                    switch (readType)
                    {
                        case Hmi.DataType.UInt16:
                            countent = reader.ReadUInt16();
                            break;
                        case Hmi.DataType.Int16:
                            countent = reader.ReadInt16();
                            break;
                        case Hmi.DataType.UInt32:
                            countent = reader.ReadUInt32();
                            break;
                        case Hmi.DataType.Int32:
                            countent = reader.ReadInt32();
                            break;
                        case Hmi.DataType.BCD16:
                            countent = reader.ReadUInt16();
                            break;
                        case Hmi.DataType.BCD32:
                            countent = reader.ReadInt32();
                            break;
                        case Hmi.DataType.Single:
                            countent = reader.ReadSingle();
                            break;
                        case Hmi.DataType.Double:
                            countent = reader.ReadDouble();
                            break;
                        case Hmi.DataType.String:
                            byte[] data = new byte[recipeDataType[i].StringLength];
                            int bytesRead = reader.Read(data, 0, data.Length);
                            string result = Encoding.Default.GetString(data, 0, bytesRead);
                            int byteCount = Encoding.Default.GetByteCount(result);
                            fs.Seek(byteCount, SeekOrigin.Current);
                            string str = string.Join("", result).TrimEnd('\0');
                            countent = str;
                            break;
                        case Hmi.DataType.Hex16:
                            countent = reader.ReadUInt16();
                            break;
                        case Hmi.DataType.Hex32:
                            countent = reader.ReadUInt16();
                            break;
                        case Hmi.DataType.Binary16:
                            countent = reader.ReadUInt16();
                            break;
                        case Hmi.DataType.Binary32:
                            countent = reader.ReadUInt16();
                            break;
                        case Hmi.DataType.UInt64:
                            countent = reader.ReadUInt64();
                            break;
                        case Hmi.DataType.Int64:
                            countent = reader.ReadInt64();
                            break;
                        case Hmi.DataType.Bool:
                            countent = reader.ReadInt16();
                            break;
                        default:
                            break;
                    }

                }
            }

?代碼解釋:讀取二進(jìn)制的時候,需要注意中文的讀取方式,即類型中的string類型,如果需要讀取18個字節(jié),但是中文只有三個(UTF8編碼中,中文占用3個字節(jié),用Encoding.Default讀取,默認(rèn)使用的是GB2312編碼,一個中文占用2個字節(jié),ASCII碼中一個中文也是占用2個字節(jié))按照GB2312讀取,實際只能讀取到6個字節(jié),此時18個字節(jié)是浪費掉的,此時需要使用調(diào)用fs.Seek(byteCount, SeekOrigin.Current);將文件流的當(dāng)前位置移動指定的字節(jié)數(shù);讀取二進(jìn)制還需要額外注意的類似的bool類型,bool類型在編程語言中是True和False,但是在二進(jìn)制下只有1和0

2.0 C#寫二進(jìn)制

 string filePath = "C:\Program Files (x86)\001.bin";
            using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
            {
                using (BinaryWriter writer = new BinaryWriter(fileStream, Encoding.Default))
                {
                    string content =String.Empty;
                    //此處需要知道,需要讀取多少位、用什么類型讀取
                    var readType = Type;
                    switch (readType)
                    {
                        case DataType.UInt16:
                            writer.Write(Convert.ToUInt16(content));
                            break;
                        case DataType.Int16:
                            writer.Write(Convert.ToUInt16(content));
                            break;
                        case DataType.UInt32:
                            writer.Write(Convert.ToUInt32(content));
                            break;
                        case DataType.Int32:
                            writer.Write(Convert.ToInt32(content));
                            break;
                        case DataType.BCD16:
                            writer.Write(Convert.ToUInt16(content));
                            break;
                        case DataType.BCD32:
                            writer.Write(Convert.ToInt32(content));
                            break;
                        case DataType.Single:
                            writer.Write(Convert.ToSingle(content));
                            break;
                        case DataType.Double:
                            writer.Write(Convert.ToDouble(content));
                            break;
                        case DataType.String:
                            //string類型需要處理需要讀取多少位
                            int byteCount =100;
                            byte[] buffer = Encoding.Default.GetBytes(content);
                            if (buffer.Length < byteCount)
                            {
                                byte[] paddedBytes = new byte[byteCount];
                                Buffer.BlockCopy(buffer, 0, paddedBytes, 0, buffer.Length);
                                buffer = paddedBytes;
                            }
                            writer.Write(buffer, 0, byteCount);
                            fileStream.Seek(byteCount, SeekOrigin.Current);
                            break;
                        case DataType.Hex16:
                            writer.Write(Convert.ToUInt16(content));
                            break;
                        case DataType.Hex32:
                            writer.Write(Convert.ToUInt16(content));
                            break;
                        case DataType.Binary16:
                            writer.Write(Convert.ToUInt16(content));
                            break;
                        case DataType.Binary32:
                            writer.Write(Convert.ToUInt16(content));
                            break;
                        case DataType.UInt64:
                            writer.Write(Convert.ToUInt64(content));
                            break;
                        case DataType.Int64:
                            writer.Write(Convert.ToInt64(content));
                            break;
                        case DataType.Bool:
                            writer.Write(Convert.ToInt16(content));
                            break;
                        default:
                            break;
                    }
                }
            }

?和讀二進(jìn)制類型,寫二進(jìn)制依舊主要注意編碼方式、讀取的字節(jié)類型。以上代碼能幫助我們讀取二進(jìn)制,但是請注意,我們讀取的僅僅是某些位的數(shù)據(jù),實際的二進(jìn)制是長這樣的:
C#非常實用的技巧

?實際上,我們上面代碼,僅僅讀取了二進(jìn)制文件39,用UTF-7(推薦使用UTF-7)編碼GB2123讀取出來的是57,沒錯,這么多00 01 02加那么多代碼僅讀取了一個57,后面的怎么讀,可能需要根據(jù)實際情況進(jìn)行考慮。

3、MQTT發(fā)布訂閱

using System;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Protocol;

public class MqttClient
{
    private IMqttClient mqttClient;

    public async Task ConnectAsync(string brokerIp, int brokerPort, string username, string password)
    {
        var factory = new MqttFactory();
        mqttClient = factory.CreateMqttClient();

        var options = new MqttClientOptionsBuilder()
            .WithTcpServer(brokerIp, brokerPort)
            .WithCredentials(username, password)
            .WithClientId("mqtt-client")
            .WithCleanSession()
            .Build();

        await mqttClient.ConnectAsync(options);
    }

    public void Disconnect()
    {
        if (mqttClient != null && mqttClient.IsConnected)
        {
            mqttClient.DisconnectAsync().Wait();
            mqttClient.Dispose();
            mqttClient = null;
        }
    }

    public async Task PublishAsync(string topic, string payload)
    {
        if (mqttClient == null || !mqttClient.IsConnected)
        {
            throw new InvalidOperationException("MQTT client is not connected.");
        }

        var message = new MqttApplicationMessageBuilder()
            .WithTopic(topic)
            .WithPayload(payload)
            .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
            .Build();

        await mqttClient.PublishAsync(message);
    }

    public async Task SubscribeAsync(string topic, Action<MqttApplicationMessageReceivedEventArgs> handler)
    {
        if (mqttClient == null || !mqttClient.IsConnected)
        {
            throw new InvalidOperationException("MQTT client is not connected.");
        }

        await mqttClient.SubscribeAsync(new TopicFilterBuilder()
            .WithTopic(topic)
            .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
            .Build());

        mqttClient.UseApplicationMessageReceivedHandler(handler);
    }

    public async Task UnsubscribeAsync(string topic)
    {
        if (mqttClient == null || !mqttClient.IsConnected)
        {
            throw new InvalidOperationException("MQTT client is not connected.");
        }

        await mqttClient.UnsubscribeAsync(topic);
    }
}

?低版本可能需要做一個兼容:
?文章來源地址http://www.zghlxwxcb.cn/news/detail-429522.html

 private void Subscribe_ClickAsync(object sender, RoutedEventArgs e)
        {
            try
            {
                if (mqttClient == null || !mqttClient.IsConnected)
                {
                    throw new InvalidOperationException("MQTT client is not connected.");
                }
                mqttClient.SubscribeAsync(new MqttTopicFilterBuilder()
                   .WithTopic(txt_topic.Text)
                   .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
                   .Build());
                mqttClient.ApplicationMessageReceivedAsync += MqttClient_ApplicationMessageReceivedAsync1;
            }
            catch (Exception ex)
            {
                MessageBox.Show("系統(tǒng)異常:" + ex.Message);
            }
        }

        StringBuilder StringBuilder = new StringBuilder();
        private async Task MqttClient_ApplicationMessageReceivedAsync1(MqttApplicationMessageReceivedEventArgs arg)
        {
            try
            {
                this.Dispatcher.Invoke(new Action(delegate
                {
                    byte[] buffer = arg.ApplicationMessage.Payload;
                    string result = Encoding.Default.GetString(buffer, 0, buffer.Length);
                    StringBuilder.Append($"接受到:{result}\n");
                    txt_read.Text = StringBuilder.ToString();
                }));
               
            }
            catch (Exception ex)
            {
                MessageBox.Show("系統(tǒng)異常:" + ex.Message);
            }
        }

        private void Publish_ClickAsync(object sender, RoutedEventArgs e)
        {
            try
            {
                if (mqttClient == null || !mqttClient.IsConnected)
                {
                    throw new InvalidOperationException("MQTT client is not connected.");
                }
                byte[] payload = Encoding.Default.GetBytes(txt_writ.Text);

                var message = new MqttApplicationMessageBuilder()
                    .WithTopic(txt_topic.Text)
                    .WithPayload(payload)
                    .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
                    .Build();
                mqttClient.PublishAsync(message);
                txt_read.Text = StringBuilder.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show("系統(tǒng)異常:" + ex.Message);
            }
        }

到了這里,關(guān)于C#非常實用的技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 實用指南:C#中優(yōu)雅更新GUI的基礎(chǔ)和高級技巧(WinForms和WPF)

    實用指南:C#中優(yōu)雅更新GUI的基礎(chǔ)和高級技巧(WinForms和WPF)

    ? 概述: 以上內(nèi)容詳細(xì)介紹了在C#中如何從另一個線程更新GUI,包括基礎(chǔ)功能和高級功能。對于WinForms,使用`Control.Invoke`;對于WPF,使用`Dispatcher.Invoke`。高級功能使用`SynchronizationContext`實現(xiàn)線程間通信,確保清晰、可讀性高的代碼。 在C#中,從另一個線程更新GUI通常需要使用

    2024年03月18日
    瀏覽(28)
  • Linux :: 壓縮與解壓指令【1】:zip / unzip 指令:壓縮與解壓用法詳解

    前言:本篇是 Linux 基本操作篇章的內(nèi)容! 筆者使用的環(huán)境是基于騰訊云服務(wù)器:CentOS 7.6 64bit。 學(xué)習(xí)集: C++ 入門到入土?。?!學(xué)習(xí)合集 Linux 從命令到網(wǎng)絡(luò)再到內(nèi)核!學(xué)習(xí)合集 目錄索引: 1. 基本用法及功能 2. 基本用法:壓縮/解壓指定文件【注意代碼示例內(nèi)容!】 3. 「-r」

    2024年01月25日
    瀏覽(22)
  • Linux下壓縮解壓命令

    2.命令:gzip 特點:只能壓縮文件,壓縮后原文件刪除,生成 xxx.gz文件 壓縮: 用法:gzip [需壓縮文件] 解壓: 用法:gunzip [壓縮包] 3.命令:bzip2 特點:只能壓縮文件,壓縮后原文件刪除,生成 xxx.bz2 壓縮: 用法:bzip2 [需壓縮文件] 解壓: 用法:bunzip2 [壓縮包] 4.命令:tar 特

    2024年02月06日
    瀏覽(35)
  • 【方法】7Z壓縮包如何解壓?

    【方法】7Z壓縮包如何解壓?

    你知道7Z壓縮包如何解壓嗎? 7Z是一種主流高效的壓縮格式,它可以用多種壓縮解壓軟件來解壓,像7-Zip、WinRAR等常用的解壓縮軟件都可以解壓7Z壓縮包。 首先我們可以從官網(wǎng)或者軟件商店里免費下載7-Zip或者WinRAR解壓縮軟件,再安裝在電腦里。 安裝完成后,用鼠標(biāo)選中壓縮包

    2024年02月13日
    瀏覽(18)
  • Linux的壓縮與解壓

    Linux的壓縮與解壓

    一、tar命令 常用組合: 1.tar -cvf test.tar 1.txt 2.txt 3.txt :將3個文本文件壓縮到test.tar文件內(nèi) 2.tar -zcvf test.tar.gz 1.txt 2.txt :將2個文件壓縮到test.tar.gz文件內(nèi) 1.tar -xvf test.tar 2.tar -zxvf test.tar.gz -C /home 將文件解壓到指定目錄 二、zip命令 語法:zip [-r] 參數(shù)1 參數(shù)2 參數(shù)3 .... -r:壓縮文

    2024年01月21日
    瀏覽(35)
  • Linux 壓縮和解壓

    Linux 壓縮和解壓

    1、tar命令(復(fù)雜) 使用tar命令均可以進(jìn)行壓縮和解壓縮的操作 語法:tar [-c -v -x -f -z -C] 參數(shù)1 參數(shù)2 ... 參數(shù)N -c,創(chuàng)建壓縮文件,用于壓縮模式 -v,顯示壓縮、解壓過程,用于查看進(jìn)度 -x,解壓模式 -f,要創(chuàng)建的文件,或要解壓的文件,-f選項必須在所有選項中位置處于最后

    2024年02月07日
    瀏覽(23)
  • zip解壓和壓縮

    引言 介紹zip文件的概念 涉及到的Java類和包: java.util.zip https://blog.csdn.net/u012998680/article/details/126060855 壓縮文件 準(zhǔn)備壓縮的源文件和目標(biāo)zip文件的路徑 創(chuàng)建 FileOutputStream 和 ZipOutputStream 對象 創(chuàng)建源文件的 File 和 FileInputStream 對象 創(chuàng)建 ZipEntry 對象,并設(shè)置其名稱為源文件的名

    2024年02月11日
    瀏覽(30)
  • Linux文件壓縮與解壓

    Linux文件壓縮與解壓

    目錄 1、分步壓縮 1.1、文件打包 1.2、關(guān)于為何需要f參數(shù) 1.3、壓縮包 2、分步解壓 2.1、解壓 2.2、解包 3、一步壓縮與解壓 ? ? ? 在Windows上我們常用壓縮軟件完成文件的壓縮,在Linux上我們可以使用命令來完成文件壓縮。 ? ? ? ? 首先,任意創(chuàng)建兩個測試文件:main.c 和 test。

    2024年02月08日
    瀏覽(15)
  • Linux 壓縮解壓

    ? (注:tar是打包,不是壓縮?。?解包:tar xvf FileName.tar -C DirName 打包:tar cvf FileName.tar DirName 解壓1:gunzip FileName.gz 解壓2:gzip -d FileName.gz 壓縮:gzip FileName 解壓:tar zxvf FileName.tar.gz -C DirName 壓縮:tar zcvf FileName.tar.gz DirName 解壓1:bzip2 -d FileName.bz2 解壓2:bunzip2 FileName.bz2 壓縮

    2024年01月19日
    瀏覽(20)
  • java 解壓rar壓縮包

    記錄下引入maven的相關(guān)坐標(biāo)后,在archivers包下沒有找到rar包 Java本身不提供解壓RAR壓縮包的功能,需要借助第三方庫來實現(xiàn)。以下是使用Apache Commons Compress庫來解壓RAR壓縮包的示例代碼: 這個示例代碼通過解析RAR文件的文件頭來提取壓縮包中的文件。在解壓過程中,他們將提取

    2024年02月11日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包