[No0000DB]C# FtpClientHelper Ftp客户端上传下载重命名 类封装

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using Shared;namespace Helpers
{public static class FileHelper{#region  Methods/// <summary>///     向文本文件的尾部追加内容/// </summary>/// <param name="filePath"></param>/// <param name="content">写入的内容</param>public static void AppendText(string filePath, string content){File.AppendAllText(filePath, content);}/// <summary>///     清空指定目录下所有文件及子目录,但该目录依然保存./// </summary>/// <param name="directoryPath">指定目录的绝对路径</param>public static void ClearDirectory(string directoryPath){if (IsExistDirectory(directoryPath)){//删除目录中所有的文件var filePaths = GetFileNames(directoryPath);foreach (var filePath in filePaths)DeleteFile(filePath);//删除目录中所有的子目录var directoryPaths = GetDirectories(directoryPath);foreach (var oneDirectoryPath in directoryPaths)DeleteDirectory(oneDirectoryPath);}}/// <summary>///     清空文件内容/// </summary>/// <param name="filePath">文件的绝对路径</param>public static void ClearFile(string filePath){//删除文件
            File.Delete(filePath);//重新创建该文件
            CreateFile(filePath);}/// <summary>///     检测指定目录中是否存在指定的文件,若要搜索子目录请使用重载方法./// </summary>/// <param name="directoryPath">指定目录的绝对路径</param>/// <param name="searchPattern">///     模式字符串,"*"代表0或N个字符,"?"代表1个字符。///     范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。/// </param>public static bool Contains(string directoryPath, string searchPattern){try{//获取指定的文件列表var fileNames = GetFileNames(directoryPath, searchPattern, false);//判断指定文件是否存在return fileNames.Length != 0;}catch (Exception exception){LogHelper.LogError("Error! ", exception);return false;}}/// <summary>///     检测指定目录中是否存在指定的文件/// </summary>/// <param name="directoryPath">指定目录的绝对路径</param>/// <param name="searchPattern">///     模式字符串,"*"代表0或N个字符,"?"代表1个字符。///     范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。/// </param>/// <param name="isSearchChild">是否搜索子目录</param>public static bool Contains(string directoryPath, string searchPattern, bool isSearchChild){try{//获取指定的文件列表var fileNames = GetFileNames(directoryPath, searchPattern, true);//判断指定文件是否存在return fileNames.Length != 0;}catch (Exception exception){LogHelper.LogError("Error! ", exception);return false;}}/// <summary>///     将源文件的内容复制到目标文件中/// </summary>/// <param name="sourceFilePath">源文件的绝对路径</param>/// <param name="destFilePath">目标文件的绝对路径</param>public static void Copy(string sourceFilePath, string destFilePath){File.Copy(sourceFilePath, destFilePath, true);}/// <summary>///     将一个目录的文件拷贝到另外一个目录去/// </summary>/// <param name="srcPath">源目录</param>/// <param name="aimPath">目标目录</param>/// <param name="flag">是否允许覆盖同名文件</param>/// <param name="version">当出现多次调用此方法的时候,能够重命名多次,比如xxx.1.old,xxx.2.old</param>public static void CopyDir(string srcPath, string aimPath, bool flag, int version){// 检查目标目录是否以目录分割字符结束如果不是则添加之if (aimPath[aimPath.Length - 1] != Path.DirectorySeparatorChar)aimPath += Path.DirectorySeparatorChar;// 判断目标目录是否存在如果不存在则新建之
            CreateDirectory(aimPath);// 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组// 如果你指向copy目标文件下面的文件而不包含目录请使用下面的方法var fileList = Directory.GetFileSystemEntries(srcPath);// 遍历所有的文件和目录foreach (var file in fileList)try{// 如果这是一个目录,并且不是update目录,递归if (Directory.Exists(file)){var path = Path.GetDirectoryName(file);if (path != null){var dirName = path.Split('\\');if (dirName[dirName.Length - 1].ToLower() != "update")CopyDir(file, aimPath + Path.GetFileName(file), flag, version);}}// 否则直接Copy文件(不拷贝update.xml文件)else if (!file.ToLower().Contains("update.xml")){//如果是pdb文件,直接忽略if (file.Contains(".pdb") || file.Contains(".vshost.exe"))continue;//如果文件是dll或者exe文件,则可能是正在使用的文件,不能直接替换if (file.ToLower().Contains(".exe") || file.ToLower().Contains(".dll") ||file.ToLower().Contains(".pdb")){var exist = false;//正在使用的文件将不能拷贝var onUsedFiles = AppDomain.CurrentDomain.GetAssemblies();foreach (var onUsedFile in onUsedFiles){var filename = onUsedFile.ManifestModule.Name;//正在使用的文件if (file.Contains(filename)){//先判断这个文件存在if (Contains(aimPath, Path.GetFileName(file)))File.Move(aimPath + Path.GetFileName(file),aimPath + Path.GetFileName(file) + "." + version + ".old");File.Copy(file, aimPath + Path.GetFileName(file), true);exist = true;break;}}//不是依赖项并且本身不是更新程序本身if (!exist)File.Copy(file, aimPath + Path.GetFileName(file), true);//更新程序自身的更新(单独调试此工程的时候需要用到这一段)/*if (Path.GetFileName(file) == "EastMoney.BPF.DataPlatformUpgrade.exe"){try{File.Move(aimPath + Path.GetFileName(file),aimPath + Path.GetFileName(file) + "." + version + ".old");File.Copy(file, aimPath + Path.GetFileName(file), true);}catch (Exception exception){LogHelper.LogError("Error! ", exception);}}*/}else{File.Copy(file, aimPath + Path.GetFileName(file), true);}}}catch (Exception exception){LogHelper.LogError("拷贝文件失败,失败原因为:" + exception.Message + " 文件名为:" + file, exception);}}/// <summary>///     创建一个目录/// </summary>/// <param name="directoryPath">目录的绝对路径</param>public static void CreateDirectory(string directoryPath){//如果目录不存在则创建该目录if (!IsExistDirectory(directoryPath))Directory.CreateDirectory(directoryPath);}/// <summary>///     创建一个文件。/// </summary>/// <param name="filePath">文件的绝对路径</param>public static bool CreateFile(string filePath){try{//如果文件不存在则创建该文件if (!IsExistFile(filePath)){var fileInfo = new FileInfo(filePath); //创建一个FileInfo对象var fileStream = fileInfo.Create(); //创建文件fileStream.Close(); //关闭文件流
                }}catch (Exception exception){LogHelper.LogError("Error! ", exception);return false;}return true;}/// <summary>///     创建一个文件,并将字节流写入文件。/// </summary>/// <param name="filePath">文件的绝对路径</param>/// <param name="buffer">二进制流数据</param>public static bool CreateFile(string filePath, byte[] buffer){try{//如果文件不存在则创建该文件if (!IsExistFile(filePath)){//创建一个FileInfo对象var file = new FileInfo(filePath);//创建文件var fs = file.Create();//写入二进制流fs.Write(buffer, 0, buffer.Length);//关闭文件流
                    fs.Close();}}catch (Exception exception){LogHelper.LogError("Error! ", exception);return false;}return true;}/// <summary>///     删除指定目录及其所有子目录(打开状态下降不能删除)/// </summary>/// <param name="directoryPath">指定目录的绝对路径</param>public static void DeleteDirectory(string directoryPath){if (IsExistDirectory(directoryPath))try{Directory.Delete(directoryPath, true);}catch (Exception exception){LogHelper.LogError("删除出错,可能是因为文件夹被打开了!请关闭后再试!路径为" + directoryPath + exception.Message, exception);}}/// <summary>/// 调用bat删除目录,以防止系统底层的异步删除机制/// </summary>/// <param name="dirPath"></param>/// <returns></returns>public static bool DeleteDirectoryWithCmd(string dirPath){var process = new Process(); //string path = ...;//bat路径  var processStartInfo = new ProcessStartInfo("CMD.EXE", "/C rd /S /Q \"" + dirPath + "\""){UseShellExecute = false,RedirectStandardOutput = true}; //第二个参数为传入的参数,string类型以空格分隔各个参数  process.StartInfo = processStartInfo;process.Start();process.WaitForExit();var output = process.StandardOutput.ReadToEnd();if (string.IsNullOrWhiteSpace(output))return true;return false;}/// <summary>/// 调用bat删除文件,以防止系统底层的异步删除机制/// </summary>/// <param name="filePath"></param>/// <returns></returns>public static bool DelFileWithCmd(string filePath){var process = new Process(); //string path = ...;//bat路径  var processStartInfo = new ProcessStartInfo("CMD.EXE", "/C del /F /S /Q \"" + filePath + "\""){UseShellExecute = false,RedirectStandardOutput = true}; //第二个参数为传入的参数,string类型以空格分隔各个参数  process.StartInfo = processStartInfo;process.Start();process.WaitForExit();var output = process.StandardOutput.ReadToEnd();if (output.Contains(filePath))return true;return false;}/// <summary>///     删除指定文件/// </summary>/// <param name="filePath">文件的绝对路径</param>public static void DeleteFile(string filePath){if (IsExistFile(filePath))File.Delete(filePath);}/// <summary>///     通过后缀名在目录中查找文件/// </summary>/// <param name="directory">目录</param>/// <param name="pattern">后缀名</param>public static void DeleteFiles(DirectoryInfo directory, string pattern){if (directory.Exists && pattern.Trim() != string.Empty){try{foreach (var fileInfo in directory.GetFiles(pattern))fileInfo.Delete();}catch (Exception exception){LogHelper.LogError("Error! ", exception);}foreach (var info in directory.GetDirectories())DeleteFiles(info, pattern);}}/// <summary>///     将文件读取到缓冲区中/// </summary>/// <param name="filePath">文件的绝对路径</param>public static byte[] FileToBytes(string filePath){//获取文件的大小 var fileSize = GetFileSize(filePath);//创建一个临时缓冲区var buffer = new byte[fileSize];//创建一个文件流var fileInfo = new FileInfo(filePath);var fileStream = fileInfo.Open(FileMode.Open);try{//将文件流读入缓冲区fileStream.Read(buffer, 0, fileSize);return buffer;}catch (Exception exception){LogHelper.LogError("Error! ", exception);return null;}finally{fileStream.Close(); //关闭文件流
            }}/// <summary>///     将文件读取到字符串中/// </summary>/// <param name="filePath">文件的绝对路径</param>public static string FileToString(string filePath){return FileToString(filePath, Encoding.Default);}/// <summary>///     将文件读取到字符串中/// </summary>/// <param name="filePath">文件的绝对路径</param>/// <param name="encoding">字符编码</param>public static string FileToString(string filePath, Encoding encoding){//创建流读取器var reader = new StreamReader(filePath, encoding);try{return reader.ReadToEnd(); //读取流
            }catch{return string.Empty;}finally{reader.Close(); //关闭流读取器
            }}/// <summary>///     获取指定目录中所有子目录列表,若要搜索嵌套的子目录列表,请使用重载方法./// </summary>/// <param name="directoryPath">指定目录的绝对路径</param>public static string[] GetDirectories(string directoryPath){try{return Directory.GetDirectories(directoryPath);}catch (Exception exception){LogHelper.LogError("Error! ", exception);return null;}}/// <summary>///     获取指定目录及子目录中所有子目录列表/// </summary>/// <param name="directoryPath">指定目录的绝对路径</param>/// <param name="searchPattern">///     模式字符串,"*"代表0或N个字符,"?"代表1个字符。///     范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。/// </param>/// <param name="isSearchChild">是否搜索子目录</param>public static string[] GetDirectories(string directoryPath, string searchPattern, bool isSearchChild){try{return Directory.GetDirectories(directoryPath, searchPattern,isSearchChild ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);}catch (Exception exception){LogHelper.LogError("Error! ", exception);return null;}}/// <summary>///     从文件的绝对路径中获取扩展名/// </summary>/// <param name="filePath">文件的绝对路径</param>public static string GetExtension(string filePath){var fileInfo = new FileInfo(filePath); //获取文件的名称return fileInfo.Extension;}/// <summary>///     从文件的绝对路径中获取文件名( 包含扩展名 )/// </summary>/// <param name="filePath">文件的绝对路径</param>public static string GetFileName(string filePath){//获取文件的名称var fileInfo = new FileInfo(filePath);return fileInfo.Name;}/// <summary>///     从文件的绝对路径中获取文件名( 不包含扩展名 )/// </summary>/// <param name="filePath">文件的绝对路径</param>public static string GetFileNameNoExtension(string filePath){//获取文件的名称var fileInfo = new FileInfo(filePath);return fileInfo.Name.Split('.')[0];}/// <summary>///     获取指定目录中所有文件列表/// </summary>/// <param name="directoryPath">指定目录的绝对路径</param>public static string[] GetFileNames(string directoryPath){if (!IsExistDirectory(directoryPath)) //如果目录不存在,则抛出异常throw new FileNotFoundException();return Directory.GetFiles(directoryPath); //获取文件列表
        }/// <summary>///     获取指定目录及子目录中所有文件列表/// </summary>/// <param name="directoryPath">指定目录的绝对路径</param>/// <param name="searchPattern">///     模式字符串,"*"代表0或N个字符,"?"代表1个字符。///     范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。/// </param>/// <param name="isSearchChild">是否搜索子目录</param>public static string[] GetFileNames(string directoryPath, string searchPattern, bool isSearchChild){if (!IsExistDirectory(directoryPath)) //如果目录不存在,则抛出异常throw new FileNotFoundException();try{return Directory.GetFiles(directoryPath, searchPattern,isSearchChild ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);}catch (Exception exception){LogHelper.LogError("Error! ", exception);return null;}}/// <summary>///     获取一个文件的长度,单位为Byte/// </summary>/// <param name="filePath">文件的绝对路径</param>public static int GetFileSize(string filePath){//创建一个文件对象var fileInfo = new FileInfo(filePath);//获取文件的大小return (int) fileInfo.Length;}/// <summary>///     获取一个文件的长度,单位为KB/// </summary>/// <param name="filePath">文件的路径</param>public static double GetFileSizeByKB(string filePath){var fileInfo = new FileInfo(filePath); //创建一个文件对象var size = fileInfo.Length / 1024;return double.Parse(size.ToString()); //获取文件的大小
        }/// <summary>///     获取一个文件的长度,单位为MB/// </summary>/// <param name="filePath">文件的路径</param>public static double GetFileSizeByMB(string filePath){var fileInfo = new FileInfo(filePath); //创建一个文件对象var size = fileInfo.Length / 1024 / 1024;return double.Parse(size.ToString()); //获取文件的大小
        }/// <summary>///     得到文件大小/// </summary>/// <param name="filePath"></param>/// <returns></returns>public static long GetFileSizeFromPath(string filePath = null){if (string.IsNullOrEmpty(filePath)) return -1;if (!File.Exists(filePath)) return -1;var objFile = new FileInfo(filePath);return objFile.Length;}/// <summary>///     获取文本文件的行数/// </summary>/// <param name="filePath">文件的绝对路径</param>public static int GetLineCount(string filePath){//将文本文件的各行读到一个字符串数组中var rows = File.ReadAllLines(filePath);//返回行数return rows.Length;}/// <summary>///     检测指定目录是否为空/// </summary>/// <param name="directoryPath">指定目录的绝对路径</param>public static bool IsEmptyDirectory(string directoryPath){try{//判断是否存在文件var fileNames = GetFileNames(directoryPath);if (fileNames.Length > 0)return false;//判断是否存在文件夹var directoryNames = GetDirectories(directoryPath);return directoryNames.Length <= 0;}catch{return false;}}/// <summary>///     检测指定目录是否存在/// </summary>/// <param name="directoryPath">目录的绝对路径</param>public static bool IsExistDirectory(string directoryPath){return Directory.Exists(directoryPath);}/// <summary>///     检测指定文件是否存在,如果存在则返回true。/// </summary>/// <param name="filePath">文件的绝对路径</param>public static bool IsExistFile(string filePath){return File.Exists(filePath);}/// <summary>///     将文件移动到指定目录/// </summary>/// <param name="sourceFilePath">需要移动的源文件的绝对路径</param>/// <param name="descDirectoryPath">移动到的目录的绝对路径</param>public static void Move(string sourceFilePath, string descDirectoryPath){//获取源文件的名称var sourceFileName = GetFileName(sourceFilePath);if (IsExistDirectory(descDirectoryPath)){//如果目标中存在同名文件,则删除if (IsExistFile(descDirectoryPath + "\\" + sourceFileName))DeleteFile(descDirectoryPath + "\\" + sourceFileName);//将文件移动到指定目录File.Move(sourceFilePath, descDirectoryPath + "\\" + sourceFileName);}}/// <summary>///     将流读取到缓冲区中/// </summary>/// <param name="stream">原始流</param>public static byte[] StreamToBytes(Stream stream){try{//创建缓冲区var buffer = new byte[stream.Length];//读取流stream.Read(buffer, 0, int.Parse(stream.Length.ToString()));//返回流return buffer;}catch (Exception exception){LogHelper.LogError("Error! ", exception);return null;}finally{stream.Close(); //关闭流
            }}/// <summary>///     向文本文件中写入内容,默认UTF8编码/// </summary>/// <param name="filePath">文件的绝对路径</param>/// <param name="content">写入的内容</param>/// <param name="encoding"></param>public static void WriteText(string filePath, string content, Encoding encoding = null){if (encoding == null){encoding = Encoding.UTF8;}File.WriteAllText(filePath, content, encoding); //向文件写入内容
        }#endregion/// <summary>   /// 重命名文件夹内的所有子文件夹   ============================/// </summary>   /// <param name="directoryName">文件夹名称</param>   /// <param name="newDirectoryName">新子文件夹名称格式字符串</param>   public static bool RenameDirectories(string directoryName, string newDirectoryName){DirectoryInfo directoryInfo = new DirectoryInfo(directoryName);if (!directoryInfo.Exists){return false;}try{int i = 1;//string[] sDirectories = Directory.GetDirectories(directoryName);foreach (var sDirectory in directoryInfo.GetDirectories()){string sNewDirectoryName = string.Format(newDirectoryName, i++);string sNewDirectory = Path.Combine(directoryName, sNewDirectoryName);sDirectory.MoveTo(sNewDirectory);// Directory.Move(sDirectory, sNewDirectory);
                }return true;}catch (Exception exception){LogHelper.LogError("Error! ", exception);return false;}}/// <summary>/// 文件重命名/// </summary>/// <param name="oldFileName"></param>/// <param name="newFileName"></param>public static bool FileRename(string filePath, string newFileName){FileInfo fileInfo = new FileInfo(filePath); // 列表中的原始文件全路径名if (!fileInfo.Exists){return false;}// fileInfo.DirectoryName // fileInfo.MoveTo(Path.Combine(newStr));// 改名方法return true;// 新文件名
        }}
}

 

转载于:https://www.cnblogs.com/Chary/p/No0000DB.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF效果第一百九十四篇之伸缩面板

前面一篇玩耍了一下登录实现效果;今天在原来的基础上来玩耍一下伸缩面板的效果;闲话不多扯直接看效果:1、关于前台简单布局:2、左侧面板伸缩动画&#xff1a;<Storyboard x:Key"ShowConfigSb"><ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty…

你不知道的JavaScript(二)

第三章 原生函数 JS有很多原生函数&#xff0c;为基本的数据类型值提供了封装对象&#xff0c;String&#xff0c;Number&#xff0c;Boolean等。我们可以通过{}.call.toString()来查看所有typeof返回object的对象的内置属性[[class]],这个属性无法直接访问。我们基本类型调用的…

[转]guava快速入门

Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库&#xff0c;例如&#xff1a;集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I…

数据库编程1 Oracle 过滤 函数 分组 外连接 自连接

【本文谢绝转载原文来自http://990487026.blog.51cto.com】<大纲>数据库编程1 Oracle 过滤 函数 分组 外连接 自连接本文实验基于的数据表:winsows安装好Oracle11g之后,开始实验SQLplus 登陆 ORaclesqlplus 退出的方式查看用户之下有什么表查看表的所有记录&#xff0c;不…

【.NET 6】开发minimal api以及依赖注入的实现和代码演示

前言&#xff1a;.net 6 LTS版本发布已经有一段时间了。此处做一个关于使用.net 6 开发精简版webapi&#xff08;minimal api&#xff09;的入门教程演示。1、新建一个项目。此处就命名为 SomeExample:2、选择 .net6版本&#xff0c;并且此处先去掉HTTPS配置以及去掉使用控制器…

(转载)VS2010/MFC编程入门之四(MFC应用程序框架分析)

上一讲鸡啄米讲的是VS2010应用程序工程中文件的组成结构&#xff0c;可能大家对工程的运行原理还是很模糊&#xff0c;理不出头绪&#xff0c;毕竟跟C编程入门系列中的例程差别太大。这一节鸡啄米就为大家分析下MFC应用程序框架的运行流程。 一.SDK应用程序与MFC应用程序运行过…

个人博客开发-开篇

迈出第一步&#xff1a; 很久以前就有这个想法&#xff0c;自己动手开发一套个人博客系统&#xff0c;终于&#xff0c;现在开始迈出了第一步。做这件事一点是做一个有个人风格的博客系统&#xff0c;第二点是对做这件事所使用的技术栈进行学习&#xff0c;所谓最好的学习就是实…

2022年中国中小学教育信息化行业研究报告

教育信息化丨研究报告 核心摘要&#xff1a; 背景篇 目前&#xff0c;我国中小学教育主要呈现信息时代教育的特征&#xff0c;智能时代教育特征初露端倪&#xff1b;中小学教育信息化正从量变迈向质变&#xff0c;创新引领与生态变革成为行业纵深的主旋律&#xff1b; 2021年…

使用curl指令发起websocket请求

昨日的文章没指出websocket请求协商切换的精髓&#xff0c;删除重发。前文相关&#xff1a;• .NET WebSockets 核心原理初体验[1]• SignalR 从开发到生产部署避坑指南[2]tag&#xff1a;浏览器--->nginx--> server其中提到nginx默认不会为客户端转发Upgrade、Connectio…

Yii 2 的安装 之 踩坑历程

由于刚接触yii2 ,决定先装个试试&#xff1b;可是这一路安装差点整吐血&#xff0c;可能还是水平有限吧&#xff0c; 但还是想把这个过程分享出来&#xff0c;让遇到同样问题的同学有个小小的参考&#xff0c;好了言归正传&#xff01;&#xff01; <(~.~)> 下面是安装流…

设计模式之代理模式(上) 静态代理与JDK动态代理

2019独角兽企业重金招聘Python工程师标准>>> 代理模式 给某一个对象提供一个代理&#xff0c;并由代理对象控制对原对象的引用。静态代理 静态代理是由我们编写好的类&#xff0c;在程序运行之前就已经编译好的的类&#xff0c;此时就叫静态代理。 说理论还是比较懵…

mysql 分页查询

使用limit函数 limit关键字的用法&#xff1a; LIMIT [offset,] rows offset指定要返回的第一行的偏移量&#xff0c;rows第二个指定返回行的最大数目。初始行的偏移量是0(不是1)。转载于:https://www.cnblogs.com/xping/p/6703986.html

WPF 实现更换主题色

WPF 实现更换主题色WPF 使用 WPFDevelopers.Minimal 如何更换主题色作者&#xff1a;WPFDevelopersOrg原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal框架使用大于等于.NET40&#xff1b;Visual Studio 2022;项目使用 MIT 开源许可协议&a…

vue3与vue2的区别

先来说说当下市场开发使用的问题&#xff0c;目前2021年使用vue3开发的企业还是少&#xff0c;基本上都还是以vue2的形式进行开发&#xff0c;vue3的开发模式跟react很像&#xff0c;这时候有人就会想那我学vue3有用么&#xff0c;淦&#xff0c;他喵的&#xff0c;先别激动&am…

Spring Data REST API集成Springfox、Swagger

原文: Documenting a Spring Data REST API with Springfox and Swagger 使用Spring Date REST&#xff0c;你可以迅速为Spring Date repositories的创建REST API&#xff0c;并提供CRUD和更多功能。然而&#xff0c;在严谨的API开发过成功&#xff0c;您还希望拥有自动生成的最…

【系统设计】S3 对象存储

在本文中&#xff0c;我们设计了一个类似于 Amazon Simple Storage Service (S3) 的对象存储服务。S3 是 Amazon Web Services (AWS) 提供的一项服务&#xff0c; 它通过基于 RESTful API 的接口提供对象存储。根据亚马逊的报告&#xff0c;到 2021 年&#xff0c;有超过 100 万…

转: telnet命令学习

1.每天一个linux命令&#xff08;58&#xff09;&#xff1a;telnet命令 转自&#xff1a; http://www.cnblogs.com/peida/archive/2013/03/13/2956992.html telnet命令通常用来远程登录。telnet程序是基于TELNET协议的远程登录客户端程序。Telnet协议是TCP/IP协议族中的一员&a…

禅道、码云、coding、redmine、jira、teambition几大敏捷开发项目管理系统试用对比体验

作为一个软件公司的管理人员&#xff0c;在项目和人员多起来后&#xff0c;就需要通过系统来对项目和人员进行管理。 我们是典型的软件外包公司&#xff0c;专为客户定制软件&#xff0c;所以我们的业务都是项目型的。因此&#xff0c;在管理模式上&#xff0c;我们就要用所谓…

Dubbo中的SPI机制

Dubbo中的SPI机制 概述 Service Provider Interface 即 SPI&#xff0c;是JDK内置的一种服务提供发现机制&#xff0c;可以用来启用框架扩展和替换组件。可以让不同的厂商针对统一接口编写不同的实现 SPI实际上是“接口策略模式配置文件”实现的动态加载机制。在系统设计中&…