C# ftp帮助类 项目实战优化版
上位机开发中有时要与客户的文件服务器进行数据交互。如Mapping文件下载。结果文件上传等。我在项目中就常用到。现在把项目实战代码进行分享一下。
功能列表:连接服务器,下载文件,上传文件,删除服务器文件,获取当前目录下明细(包含文件和文件夹) ,获取FTP文件列表(包括文件夹),获取当前目录下文件列表(不包括文件夹) ,创建文件夹,获取指定文件大小 ,更改文件名,移动文件 ,删除ftpURI目录下指定的文件夹
调用
1.初始化连接
CommonData.FtpServer_MappingFile = new FTPHelper(ftpIPAddress, ftpUser, ftpPw);
2.下载
//url 服务器下载地址
//savefilePath 保存文件目录
//fileName 文件名,只是文件名
CommonData.FtpServer_MappingFile.DownloadByUrl(url, savefilePath, fileName, true);
3.上传
//currentDirectory 本地文件完整路径包括文件名
//ftpUploadFileName FTP服务器完整上传路径包括文件名
CommonData.FtpServer_MappingFile.Upload(currentDirectory, ftpUploadFileName);
代码
/// <summary>/// ftp帮助类/// </summary>public class FTPHelper{#region 字段string ftpURI;string ftpUserID;string ftpServerIP;string ftpPassword;string ftpRemotePath;/// <summary>/// 下载URL/// </summary>public string DownloadUrl { get; set; }#endregionpublic string GetFtpURI(){return ftpURI;}//public FTPHelper() { }/// <summary> /// 连接FTP服务器/// </summary> /// <param name="FtpServerIP">FTP连接地址</param> /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param> /// <param name="FtpUserID">用户名</param> /// <param name="FtpPassword">密码</param> public FTPHelper(string FtpServerIP, string FtpRemotePath, string FtpUserID, string FtpPassword, bool isFile = false){ftpServerIP = FtpServerIP;ftpRemotePath = FtpRemotePath;ftpUserID = FtpUserID;ftpPassword = FtpPassword;//ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";if (isFile){ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath.Replace("\\", "/");}}/// <summary> /// 连接FTP服务器/// </summary> /// <param name="FtpServerIP">FTP连接地址</param> /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param> /// <param name="FtpUserID">用户名</param> /// <param name="FtpPassword">密码</param> public FTPHelper(string FtpServerIP, string FtpUserID, string FtpPassword){ftpServerIP = FtpServerIP;//ftpRemotePath = FtpRemotePath;ftpUserID = FtpUserID;ftpPassword = FtpPassword;//ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";ftpURI = "ftp://" + ftpServerIP;//+ "/" + ftpRemotePath + "/";//if (isFile)//{// ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath.Replace("\\", "/");//}}/// <summary> /// 上传 filename是本地图片的地址/// </summary> public void Upload(string filename){FileInfo fileInf = new FileInfo(filename);FtpWebRequest reqFTP;reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileInf.Name));reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);reqFTP.Method = WebRequestMethods.Ftp.UploadFile;reqFTP.KeepAlive = false;reqFTP.UseBinary = true;reqFTP.ContentLength = fileInf.Length;int buffLength = 2048;byte[] buff = new byte[buffLength];int contentLen;FileStream fs = fileInf.OpenRead();try{Stream strm = reqFTP.GetRequestStream();contentLen = fs.Read(buff, 0, buffLength);while (contentLen != 0){strm.Write(buff, 0, contentLen);contentLen = fs.Read(buff, 0, buffLength);}strm.Close();fs.Close();}catch (Exception ex){throw new Exception(ex.Message);}}/// <summary>/// 上传/// </summary>/// <param name="fileName">是本地文件全路径</param>/// <param name="ftpUrl"></param>/// <param name="lmDir"></param>/// <returns></returns>public CommonResultModel<string> Upload(string fileName, string ftpUrl){var resultModel = new CommonResultModel<string>();FileInfo fileInf = null;FtpWebRequest reqFTP;Stream strm = null;FileStream fs = null;var uploadUrl = string.Empty;try{//ip/指定目录/lotId/pid.csvuploadUrl = ftpURI + ftpUrl;resultModel.Data = uploadUrl;//var ftpDir = uploadUrl.Replace(lmDir, string.Empty);var ftpDirList = ftpUrl.Split('/').ToList();ftpDirList = ftpDirList.FindAll(t => t.Length > 0).FindAll(t => !t.Contains("."));var newDir = ftpURI;//判断文件夹是否存在//resultModel.Msg = "Upload 判断文件夹是否存在 ";//CommonDefine.SaveWorkLogs(resultModel.Msg);foreach (var item in ftpDirList){//newDir += "/" + item;var isExists = FolderExists(newDir, item);newDir += "/" + item;//resultModel.Msg += "newDir:" + newDir + ",isExists:" + isExists + ",";//CommonDefine.SaveWorkLogs(resultModel.Msg);if (!isExists){var makeDirResultModel = MakeDir(newDir);//CommonDefine.SaveWorkLogs(resultModel.Msg// + ", MakeDir: IsSucceed=" + makeDirResultModel.IsSucceed + ",msg:" + makeDirResultModel.Msg);//if (!makeDirResultModel.IsSucceed)//{// throw new Exception(makeDirResultModel.Msg);//}}}fileInf = new FileInfo(fileName);reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uploadUrl));reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);reqFTP.Method = WebRequestMethods.Ftp.UploadFile;reqFTP.KeepAlive = false;reqFTP.UseBinary = true;reqFTP.ContentLength = fileInf.Length;int buffLength = 2048;byte[] buff = new byte[buffLength];int contentLen;fs = fileInf.OpenRead();strm = reqFTP.GetRequestStream();contentLen = fs.Read(buff, 0, buffLength);while (contentLen != 0){strm.Write(buff, 0, contentLen);contentLen = fs.Read(buff, 0, buffLength);}}catch (Exception ex){//throw new Exception("uploadUrl:" + uploadUrl + ",Message:" + ex.Message);resultModel.Msg = "异常:" + ex.Message;}finally{if (strm != null){strm.Close();}if (fs != null){fs.Close();}}return resultModel;}/// <summary> /// 下载 filePath是下载到本机的地址fileName是需要下载的文件的名字/// </summary> public void Download(string filePath, string fileName, bool isFile = false){try{FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);FtpWebRequest reqFTP;if (isFile){reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));}else{reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName));}reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;reqFTP.UseBinary = true;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();long cl = response.ContentLength;int bufferSize = 2048;int readCount;byte[] buffer = new byte[bufferSize];readCount = ftpStream.Read(buffer, 0, bufferSize);while (readCount > 0){outputStream.Write(buffer, 0, readCount);readCount = ftpStream.Read(buffer, 0, bufferSize);}ftpStream.Close();outputStream.Close();response.Close();}catch (Exception ex){throw new Exception(ex.Message);}}/// <summary>/// 下载 filePath是下载到本机的地址fileName是需要下载的文件的名字/// </summary>/// <param name="ftpFilePath">FTP下载文件的路径(/mapping/xxx)</param>/// <param name="savefilePath">本地保存文件路径</param>/// <param name="savefileName">本地保存文件</param>/// <param name="isFile">是否是文件</param>public void DownloadByUrl(string ftpFilePath, string savefilePath, string savefileName, bool isFile = false){try{FileStream outputStream = new FileStream(savefilePath + "\\" + savefileName, FileMode.Create);FtpWebRequest reqFTP;ftpFilePath = ftpFilePath.Replace("\\", "/");if (isFile){//DownloadUrl = ftpURI;DownloadUrl = ftpURI + ftpFilePath;reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(DownloadUrl));}else{//var url = ftpURI + "//" + ftpFilePath.Trim().TrimStart('\\').TrimStart('/');DownloadUrl = ftpURI + ftpFilePath;reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(DownloadUrl));}reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;reqFTP.UseBinary = true;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();long cl = response.ContentLength;int bufferSize = 2048;int readCount;byte[] buffer = new byte[bufferSize];readCount = ftpStream.Read(buffer, 0, bufferSize);while (readCount > 0){outputStream.Write(buffer, 0, readCount);readCount = ftpStream.Read(buffer, 0, bufferSize);}ftpStream.Close();outputStream.Close();response.Close();}catch (Exception ex){throw new Exception("DownloadUrl:" + DownloadUrl + ", errorMsg:" + ex.Message);}}/// <summary> /// 删除服务器的文件 fileName是需要删除的文件的名字/// </summary> public void Delete(string fileName){try{FtpWebRequest reqFTP;reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName));reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;reqFTP.KeepAlive = false;string result = String.Empty;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();long size = response.ContentLength;Stream datastream = response.GetResponseStream();StreamReader sr = new StreamReader(datastream);result = sr.ReadToEnd();sr.Close();datastream.Close();response.Close();}catch (Exception ex){throw new Exception(ex.Message);}}/// <summary> /// 获取当前目录下明细(包含文件和文件夹) /// </summary> public string[] GetFilesDetailList(){try{StringBuilder result = new StringBuilder();FtpWebRequest ftp;ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));ftp.Credentials = new NetworkCredential(ftpUserID, ftpPassword);ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;WebResponse response = ftp.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream());string line = reader.ReadLine();line = reader.ReadLine();line = reader.ReadLine();while (line != null){result.Append(line);result.Append("\n");line = reader.ReadLine();}result.Remove(result.ToString().LastIndexOf("\n"), 1);reader.Close();response.Close();return result.ToString().Split('\n');}catch (Exception ex){throw new Exception(ex.Message);}}/// <summary> /// 获取FTP文件列表(包括文件夹)/// </summary> private List<string> GetAllList(string url){List<string> list = new List<string>();FtpWebRequest req = (FtpWebRequest)WebRequest.Create(new Uri(url));req.Credentials = new NetworkCredential(ftpUserID, ftpPassword);req.Method = WebRequestMethods.Ftp.ListDirectory;req.UseBinary = true;req.UsePassive = true;try{using (FtpWebResponse res = (FtpWebResponse)req.GetResponse()){using (StreamReader sr = new StreamReader(res.GetResponseStream())){string s;while ((s = sr.ReadLine()) != null){list.Add(s);}}}}catch (Exception ex){throw (ex);}return list;}/// <summary> /// 获取当前目录下文件列表(不包括文件夹) /// </summary> public List<string> GetFileList(string url){var fileNameList = new List<string>();//StringBuilder result = new StringBuilder();FtpWebRequest reqFTP;try{reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));reqFTP.UseBinary = true;reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;WebResponse response = reqFTP.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream());string line = reader.ReadLine();while (line != null){//rwxrwxr-- 1 1001 1001 4520 Oct 31 2023 AD2300225P1.xmlCommonDefine.SaveWorkLogs("GetFileList() " + line);//if (line.IndexOf("<DIR>") == -1)//{// var fileName = Regex.Match(line, @"[\S]+ [\S]+", RegexOptions.IgnoreCase).Value.Split(' ')[1];// CommonDefine.SaveWorkLogs("GetFileList()1 fileName:" + fileName);// result.Append(fileName);// result.Append("\n");//}var textList = line.Split(' ').ToList();var fileName = textList.LastOrDefault();//result.Append(fileName);fileNameList.Add(fileName);line = reader.ReadLine();}//result.Remove(result.ToString().LastIndexOf('\n'), 1);reader.Close();response.Close();}catch (Exception ex){//throw (ex);throw new Exception(ex.Message + ",url:" + url + ",ftpUserID:" + ftpUserID + ",ftpPassword:" + ftpPassword);}//return result.ToString().Split('\n');return fileNameList;}/// <summary> /// 获取当前目录下文件列表(不包括文件夹) /// </summary> public List<string> GetFileListByFilePath(string filePath){var fileList = new List<string>();//var url = ftpURI + "//" + filePath.Trim().TrimStart('\\').TrimStart('/');var url = ftpURI + filePath.Trim();try{//var fileNameArray = GetFileList(ftpURI + "//" + filePath);var fileNameArray = GetFileList(url);if (fileNameArray != null && fileNameArray.Count > 0){fileList = fileNameArray;}}catch (Exception ex){//throw (ex);throw new Exception("url:" + url + ",errormsg:" + ex.Message);}return fileList;}/// <summary> /// 判断当前目录下指定的文件是否存在 /// </summary> /// <param name="RemoteFileName">远程文件名</param> public bool FileExist(string RemoteFileName){var fileList = GetFileList("*.*");foreach (string str in fileList){if (str.Trim() == RemoteFileName.Trim()){return true;}}return false;}/// <summary> /// 创建文件夹 /// </summary> public CommonResultModel<string> MakeDir(string ftpDirName){var resultModel = new CommonResultModel<string>();FtpWebRequest reqFTP;FtpWebResponse response = null;try{//resultModel.Msg = "MakeDir 1";reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpDirName));//resultModel.Msg = "MakeDir 2";reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;//创建文件夹reqFTP.UseBinary = true;reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);//resultModel.Msg = "MakeDir 3";using (response = (FtpWebResponse)reqFTP.GetResponse()){//resultModel.Msg = "MakeDir 4";Stream ftpStream = response.GetResponseStream();//resultModel.Msg = "MakeDir 5";ftpStream.Close();resultModel.IsSucceed = true;}//response.Close();}catch (Exception ex){//resultModel.Msg = ex.Message;throw ex;}finally{if (response != null){response.Close();}}return resultModel;}/// <summary>/// 判断文件夹是否存在/// </summary>/// <param name="ftpServer"></param>/// <param name="ftpFolder">文件夹</param>/// <param name="ftpUsername"></param>/// <param name="ftpPassword"></param>/// <returns></returns>public bool FolderExists(string ftpFolder, string findFolder){bool folderExists = false;string uploadUrl = string.Empty;try{var fileNameList = CommonData.FtpServer_MappingFile.GetAllList(ftpFolder.Trim());foreach (var item in fileNameList){//this.lbFtpFileNames.Items.Add(item);//CommonDefine.SaveWorkLogs("判断文件夹是否存在 获取FTP所有文件 " + ftpFolder + ":" + item);if (item.Contains(findFolder)){folderExists = true;//CommonDefine.SaveWorkLogs("判断文件夹是否存在 获取FTP所有文件 " + ftpFolder + ":" + item + "," + findFolder + "目录存在");break;}}}catch (WebException ex){var response = (FtpWebResponse)ex.Response;if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable){folderExists = false;}else{// 处理其他异常}}return folderExists;}/// <summary> /// 获取指定文件大小 /// </summary> public long GetFileSize(string filename){FtpWebRequest reqFTP;long fileSize = 0;try{reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename));reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;reqFTP.UseBinary = true;reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();fileSize = response.ContentLength;ftpStream.Close();response.Close();}catch (Exception ex){ }return fileSize;}/// <summary> /// 更改文件名 /// </summary> public void ReName(string currentFilename, string newFilename){FtpWebRequest reqFTP;try{reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + currentFilename));reqFTP.Method = WebRequestMethods.Ftp.Rename;reqFTP.RenameTo = newFilename;reqFTP.UseBinary = true;reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();ftpStream.Close();response.Close();}catch (Exception ex){ }}/// <summary> /// 移动文件 /// </summary> public void MovieFile(string currentFilename, string newDirectory){ReName(currentFilename, newDirectory);}/// <summary> /// 切换当前目录 /// </summary> /// <param name="IsRoot">true:绝对路径 false:相对路径</param> public void GotoDirectory(string DirectoryName, bool IsRoot){if (IsRoot){ftpRemotePath = DirectoryName;}else{ftpRemotePath += DirectoryName + "/";}ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";}/// <summary> /// 删除ftpURI目录下指定的文件夹 /// </summary> public void DeleteDir(string dirName){FtpWebRequest reqFTP;try{reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + dirName));reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;reqFTP.UseBinary = true;reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();ftpStream.Close();response.Close();}catch (Exception ex){throw new Exception(ex.Message);}}}
相关文章:
C# ftp帮助类 项目实战优化版
上位机开发中有时要与客户的文件服务器进行数据交互。如Mapping文件下载。结果文件上传等。我在项目中就常用到。现在把项目实战代码进行分享一下。 功能列表:连接服务器,下载文件,上传文件,删除服务器文件,获取当前目…...

栈和队列相关|有效的括号|用队列实现栈|用栈实现队列|设计循环队列(C)
20. 有效的括号 判断左右括号是否匹配,匹配返回true,不匹配返回false 通过栈来实现,类型和顺序,数量都要匹配 控制数量通过size 每个右括号都要找最近的左括号去判断类型匹配不匹配,顺序匹配不匹配 最后来判断数量匹配…...

云原生后端开发教程
云原生后端开发教程 引言 随着云计算的普及,云原生架构逐渐成为现代软件开发的主流。云原生不仅仅是将应用部署到云上,而是一种构建和运行应用的方式,充分利用云计算的弹性和灵活性。本文将深入探讨云原生后端开发的核心概念、工具和实践&a…...

TortoiseSVN小乌龟下载安装(Windows11)
目录 TortoiseSVN 1.14.7工具下载安装 TortoiseSVN 1.14.7 工具 系统:Windows 11 下载 官网:https://tortoisesvn.subversion.org.cn/downloads.html如图选 TortoiseSVN 1.14.7 - 64 位 下载完成 安装 打开 next,next Browse…...
Android adb命令获取设备id
Android adb命令获取设备id 方式很多,以下均可获得Android device id: adb shell settings get secure android_id adb shell settings get secure android_id adb devices -l adb shell content query --uri content://settings/secure --where "…...
Skywalking教程一
Skywalking教程一 概述Skywalking功能特点: 概述 一个大型分布式系统架构,监控平台是必不可少的,常用的分布式系统监控平台有:SkyWalking和Prometheus。Skywalking是一款比较优秀的分布式系统监控平台,一款分布式系统…...

React中管理state的方式
使用useState 使用useReducer 既然已经有了useState,为什么还需要useReducer呢? 那么useReducer是如何将解决这些问题的呢? reducer是如何更新state的呢? reducer的工作方式非常类似JavaScript中的reduce方法,随着时…...

服务器数据恢复—RAID5阵列中部分成员盘重组RAID5阵列后如何恢复原raid5阵列数据?
服务器数据恢复环境: 一台服务器挂接一台存储,该存储中有一组由5块硬盘组建的RAID5阵列。 服务器故障: 存储raid5阵列中有一块硬盘掉线。由于RAID5的特性,阵列并没有出现问题。工作一段时间后,服务器出现故障ÿ…...
【Linux】文件切割排序 cut sort
文章目录 Linux文件切割命令:cut1. cut命令的基本用法2. cut命令的选项和参数3. cut命令的实际应用案例 Linux文件排序命令:sort1. sort命令的基本用法2. sort命令的选项和参数3. sort命令的实际应用案例 常见问题和解决方案1. cut和sort命令的联合使用2…...

零售EDI:HornBach EDI 项目案例
HornBach 是一家总部位于德国的家居和建筑材料零售商,成立于1968年。它以大型仓储式商店而闻名,提供广泛的产品,包括建筑材料、园艺、家居装饰和工具等。 近期我们帮助HornBach的供应商W公司成功实现了与HornBach的EDI直连,除了满…...

SpringBoot 集成RabbitMQ 实现钉钉日报定时发送功能
文章目录 一、RabbitMq 下载安装二、开发步骤:1.MAVEN 配置2. RabbitMqConfig 配置3. RabbitMqUtil 工具类4. DailyDelaySendConsumer 消费者监听5. 测试延迟发送 一、RabbitMq 下载安装 官网:https://www.rabbitmq.com/docs 二、开发步骤:…...

基于java ssm springboot女士电商平台系统源码+文档设计
基于java ssm springboot女士电商平台系统源码文档设计 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统…...

Matlab数字信号处理——基于改进小波变换的图像去噪方法(7种去噪算法)
1.基于小波变换的阈值收缩法去噪 该方法利用小波变换分离出信号中的噪声成分,并通过设置合适的阈值对小波系数进行收缩,保留主要信息的同时,去除噪声。 %基于小波变换的阈值收缩法去噪算法 clear clc Iimread(nana.png); X im2double(I); …...
leetcode hot100【LeetCode 70. 爬楼梯】java实现
LeetCode 70. 爬楼梯 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意: 给定 n 是一个正整数。 示例 1: 输入:n 2 输出:2 解释&…...
Java异常2
异常抛出的两种形式: 系统隐式抛出;int n10/0;—隐式抛出一个异常;手动抛出异常:throw new Exception(); import java.util.InputMismatchException; import java.util.Scanner;public class Main {public static void main(Str…...
2024熵密杯初始题2
问题简要: 已知 counter 0x7501E6EA token 0xF4CE927C79B616E8E8F7223828794EEDF9B16591AE572172572D51E135E0D21A 伪造出另一个可以通过验证的counter和token。 给出token生成及验证代码如下: import binascii from gmssl import sm3# 读取HMAC ke…...
echarts属性之title
title 标题组件,包含主标题和副标题。 在 ECharts 2.x 中单个 ECharts 实例最多只能拥有一个标题组件。但是在 ECharts 3 中可以存在任意多个标题组件,这在需要标题进行排版,或者单个实例中的多个图表都需要标题时会比较有用。 例如下面不…...

VUE errolog, vue 错误集
I) installation As to command “npm install” on cmd or powershell, we must execute it under the program folder...
驱动开发系列13 - Linux tasklet用法介绍
一:概述 Tasklet 是 Linux 内核中的一种轻量级任务调度机制,通常用于在中断上下文中执行短小的任务。它们在软中断处理过程中被调用,允许将较长的处理工作延后到一个较低优先级的上下文中,以减少中断处理的延迟。Tasklet 的使用可以帮助开发者更好地管理系统资源,提高性能…...

redis实现分布式锁,go实现完整code
Redis分布式锁 Redis 分布式锁是一种使用 Redis 数据库实现分布式锁的方式,可以保证在分布式环境中同一时间只有一个实例可以访问共享资源。 实现机制 以下是实现其加锁步骤: 获取锁 在 Redis 中,一个相同的key代表一把锁。是否拥有这把锁&…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...