using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using Shared; namespace PublishPart.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 != ;
}
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 != ;
}
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 - ] != 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 - ].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, , 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, , 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('.')[];
} /// <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 / ;
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 / / ;
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 -;
if (!File.Exists(filePath)) return -;
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 > )
return false; //判断是否存在文件夹
var directoryNames = GetDirectories(directoryPath);
return directoryNames.Length <= ;
}
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, , 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 = ; //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;// 新文件名
}
}
}

[No0000DC]C# FileHelper 本地文件、文件夹操作类封装FileHelper的更多相关文章

  1. c# 封装的文件夹操作类之复制文件夹

    c#  封装的文件夹操作类之复制文件夹 一.复制文件夹原理: 1.递归遍历文件夹 2.复制文件 二.FolderHelper.cs /// <summary> /// 文件夹操作类 /// ...

  2. 011PHP文件处理——文件处理 文件内容分页操作类

    <?php /** * 文件内容分页操作类: */ //访问地址:http://basicphp.com/006file/011.php?&page=1 class StrPage { ...

  3. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  4. 基于 Aspose.Cells与XML导入excel 数据----操作类封装

    前言 导入excel数据, 在每个项目中基本上都会遇到,第三方插件或者基于微软office,用的最多的就是npoi,aspose.cells和c#基于office这三种方式,其中各有各的优缺点,在这也 ...

  5. php-redis 操作类 封装

    <?php /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时,才会返回false. * 这点可用于防止缓存穿透 * */ cla ...

  6. 【PHP+Redis】 php-redis 操作类 封装

    <?php /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时,才会返回false. * 这点可用于防止缓存穿透 * */ cla ...

  7. [IO] C# DirFileHelper文件与文件夹操作类教程与源码下载 (转载)

    点击下载 DirFileHelper.zip 主要功能如下所示 // 摘要: // 向文本文件的尾部追加内容 // // 参数: // filePath: // 文件的绝对路径 // // conte ...

  8. FileOperator 文件(夹)操作类

    public class FileOperator { /** * 复制文件目录 * @param srcDir 要复制的源目录 eg:/mnt/sdcard/DB * @param destDir ...

  9. c# 文件及目录操作类

    18位长度的计时周期数: DateTime.Now.Ticks.ToString() 多数是收集而来,加上测试感觉很不错,分享一下或许有些帮助吧: 引用: using System; using Sy ...

随机推荐

  1. 基于Centos搭建Django 环境搭建

    CentOS 7.2 64 位操作系统 安装 Django 先安装 PIP,再通过 PIP 安装 Django 安装 PIP cd /data; mkdir tmp; cd tmp; wget htt ...

  2. ceph 对象存储跨机房容灾

    场景分析 每个机房的Ceph都是独立的cluster,彼此之间没有任何关系. 多个机房都独立的提供对象存储功能,每个Ceph Radosgw都有自己独立的命名空间和存储空间. 这样带来两个问题: 针对 ...

  3. android listview优化:滑动时颜色错乱问题

      最近android的listview写多了,也学习了各种listview的优化,列如viewHolder的使用.今天做item颜色设置时遇到一个新的问题.我这里设置“未完成”是灰色的,“已完成”是 ...

  4. 有关volatile关键字和transient关键字

    (1)volatile关键字['vɑlətl]的作用 让变量每次在使用的时候,都从主存中取,而不是从各个线程的“工作内存”. 也就是说,volatile变量对于每次使用,线程都能得到当前volatil ...

  5. mysql索引hash索引和b-tree索引的区别

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...

  6. 常用七种排序的python实现

    1 算法复杂度 算法复杂度分为时间复杂度和空间复杂度.其中, 时间复杂度是指执行算法所需要的计算工作量:而空间复杂度是指执行这个算法所需要的内存空间. 算法的复杂性体现在运行该算法时的计算机所需资源的 ...

  7. Ansible and FileBeta

    使用Ansible通过ssh批量读取和修改Client设备 1. 安装ansible工具 apt-get install ansible 2. 添加需要访问的client信息 ansible配置文件如 ...

  8. Java知多少(61)线程优先级

    线程优先级被线程调度用来判定何时每个线程允许运行.理论上,优先级高的线程比优先级低的线程获得更多的CPU时间.实际上,线程获得的CPU时间通常由包括优先级在内的多个因素决定(例如,一个实行多任务处理的 ...

  9. 实时折射、镜面反射shader

    原文链接:http://www.ceeger.com/forum/read.php?tid=3162&fid=2 Unity没有原生的实时镜面反射Shader,分享几个自己写的,希望能抛砖引玉 ...

  10. 巧妙解决windows下 copy命令不接受太长路径的问题

    今天遇到了写的bat文件中执行xcopy成功,但是部分文件丢失的问题,查看日志,发现很多提示 : “the system can not find the path specified.“ 但是去指定 ...