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)制是長這樣的:
?實際上,我們上面代碼,僅僅讀取了二進(jìn)制文件39,用UTF-7(推薦使用UTF-7)編碼GB2123讀取出來的是57,沒錯,這么多00 01 02加那么多代碼僅讀取了一個57,后面的怎么讀,可能需要根據(jù)實際情況進(jìn)行考慮。文章來源:http://www.zghlxwxcb.cn/news/detail-429522.html
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)!