using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms; namespace DocDecrypt.Common
{
public class FileHelper
{
private static readonly log4net.ILog _logger = log4net.LogManager.GetLogger("FileHelper"); private static void PrintExcetpion(string errors, Exception ex)
{
_logger.ErrorFormat(errors + " {0} \r\n {1}", ex.Message, ex.StackTrace);
} public static string GetTempFileName(string fileName)
{
return Path.Combine(Path.GetTempPath(), string.IsNullOrEmpty(fileName) ? "~temp.tmp" : fileName);
} ///////////////////////////////////
// 文件基本操作
public static void ClearOrCreatePath(string dstPath)
{
if (Directory.Exists(dstPath))
ClearPath(dstPath);
else
CreateDirectoy(dstPath);
} public static void ClearPath(string dstPath)
{
try
{
if (!new System.IO.DirectoryInfo(dstPath).Exists)
return; foreach (string d in System.IO.Directory.GetFileSystemEntries(dstPath))
{
if (System.IO.File.Exists(d))
{
System.IO.FileInfo fi = new System.IO.FileInfo(d);
DeleteFile(fi); // 直接删除其中的文件
}
else
{
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(d);
DeletePath(di.FullName); // 删除子文件夹
}
}
}
catch (Exception ex)
{
PrintExcetpion(string.Format("清除文件夹失败-{0}", dstPath),ex);
}
} /// <summary>
/// 删除目录下的所有文件(只删除文件)
/// </summary>
/// <param name="dstPath"></param>
public static void DeleteFiles(string dstPath)
{
try
{
if (!new System.IO.DirectoryInfo(dstPath).Exists)
return; foreach (string d in System.IO.Directory.GetFiles(dstPath))
{
if (System.IO.File.Exists(d))
{
System.IO.FileInfo fi = new System.IO.FileInfo(d);
DeleteFile(fi); // 直接删除其中的文件
}
}
}
catch (Exception ex)
{
PrintExcetpion(string.Format("删除目录下的所有文件失败-{0}", dstPath), ex);
}
} public static void DeletePath(string dstPath)
{
try
{
if (!Directory.Exists(dstPath))
return; foreach (string d in System.IO.Directory.GetFileSystemEntries(dstPath))
{
if (System.IO.File.Exists(d))
{
System.IO.FileInfo fi = new System.IO.FileInfo(d);
DeleteFile(fi); // 直接删除其中的文件
}
else
DeletePath(d); // 递归删除子文件夹
} System.IO.Directory.Delete(dstPath); // 删除已空文件夹
}
catch (Exception ex)
{
PrintExcetpion(string.Format("删除文件夹失败-{0}", dstPath), ex);
}
} public static void CopyFile(string src, string dst)
{
try
{
if (src.ToLower() == dst.ToLower())
return; if (!File.Exists(src))
return; FileHelper.DeleteFile(dst);
FileHelper.CreateDirectoy(Path.GetDirectoryName(dst)); System.IO.File.Copy(src, dst);
}
catch (Exception ex)
{
PrintExcetpion(string.Format("拷贝文件失败-{0}:{1}", src,dst), ex);
}
} public static bool IsFileExist(string file)
{
return !string.IsNullOrEmpty(file) && File.Exists(file);
} public static bool IsDirExist(string dir)
{
return !string.IsNullOrEmpty(dir) && Directory.Exists(dir);
} public static void MoveFile(string src, string dst)
{
try
{
if (string.Equals(src, dst, StringComparison.CurrentCultureIgnoreCase))
return; if (!File.Exists(src))
return; FileHelper.DeleteFile(dst);
FileHelper.CreateDirectoy(Path.GetDirectoryName(dst)); System.IO.File.Move(src, dst);
}
catch (Exception ex)
{
PrintExcetpion($"移动文件失败-{src}:{dst}", ex);
}
} public static void MovePath(string srcPath, string dstPath)
{
try
{
if (srcPath.ToLower() == dstPath.ToLower())
return; if (!Directory.Exists(srcPath))
return; ClearOrCreatePath(dstPath); System.IO.Directory.Move(srcPath, dstPath);
}
catch (Exception ex)
{
PrintExcetpion(string.Format("拷贝文件失败-{0}:{1}", srcPath, dstPath), ex);
}
} public static string DiskTypeInfo = "Disk"; public static void MovePath_copy_delete(string srcPath, string dstPath)
{
try
{
if (srcPath.ToLower() == dstPath.ToLower())
return; if (!Directory.Exists(srcPath))
return; ClearOrCreatePath(dstPath); MoveDirectory(srcPath, dstPath);
if (DiskTypeInfo == "Disk")
{
DeletePath(srcPath);
} }
catch (Exception ex)
{
PrintExcetpion($"拷贝删除文件失败-{srcPath}:{dstPath}", ex);
}
} /// <summary>
/// 移动整个文件夹
/// </summary>
/// <param name="srcDir"></param>
/// <param name="tgtDir"></param>
public static void MoveDirectory(string srcDir, string tgtDir)
{
if (string.Equals(srcDir, tgtDir, StringComparison.CurrentCultureIgnoreCase))
return; if (!Directory.Exists(srcDir))
return; DirectoryInfo source = new DirectoryInfo(srcDir);
DirectoryInfo target = new DirectoryInfo(tgtDir); if (target.FullName.StartsWith(source.FullName, StringComparison.CurrentCultureIgnoreCase))
{
throw new Exception("父目录不能拷贝到子目录!");
} if (!source.Exists)
{
return;
} if (!target.Exists)
{
target.Create();
} FileInfo[] files = source.GetFiles(); foreach (var file in files)
{
if (DiskTypeInfo == "Disk")
{
File.Move(file.FullName, target.FullName + @"\" + file.Name);
}
else
File.Copy(file.FullName, target.FullName + @"\" + file.Name);
} DirectoryInfo[] dirs = source.GetDirectories(); foreach (var dir in dirs)
{
MoveDirectory(dir.FullName, target.FullName + @"\" + dir.Name);
}
} public static void CopyDirectory(string srcDir, string tgtDir)
{
if (srcDir.ToLower() == tgtDir.ToLower())
return; if (!Directory.Exists(srcDir))
return; DirectoryInfo source = new DirectoryInfo(srcDir);
DirectoryInfo target = new DirectoryInfo(tgtDir); if (target.FullName.StartsWith(source.FullName, StringComparison.CurrentCultureIgnoreCase))
{
throw new Exception("父目录不能拷贝到子目录!");
} if (!source.Exists)
{
return;
} if (!target.Exists)
{
target.Create();
} FileInfo[] files = source.GetFiles(); foreach (var file in files)
{
File.Copy(file.FullName, target.FullName + @"\" + file.Name, true);
} DirectoryInfo[] dirs = source.GetDirectories(); foreach (var dir in dirs)
{
CopyDirectory(dir.FullName, target.FullName + @"\" + dir.Name);
}
} public static void DeleteFile(string fileName)
{
try
{
FileInfo fi = new System.IO.FileInfo(fileName);
DeleteFile(fi);
}
catch (Exception ex)
{
PrintExcetpion($"删除文件失败-{fileName}", ex);
}
} public static void DeleteFile(FileInfo fi)
{
try
{
if (fi.Exists)
{
if (fi.Attributes.ToString().IndexOf("ReadOnly") != -)
fi.Attributes = System.IO.FileAttributes.Normal;
System.IO.File.Delete(fi.FullName); fi.Delete();
}
}
catch (Exception ex)
{
PrintExcetpion($"删除文件失败-{fi.FullName}", ex);
}
} public static void CreateDirectoyFromFileName(string fileName)
{
try
{
string path = Path.GetDirectoryName(fileName);
if (!new System.IO.DirectoryInfo(path).Exists)
System.IO.Directory.CreateDirectory(path);
}
catch (Exception ex)
{
PrintExcetpion($"创建文件夹失败-{fileName}", ex);
}
} public static void CreateDirectoyByFileName(string fileName)
{
try
{
string dir = Path.GetDirectoryName(fileName);
CreateDirectoy(dir);
}
catch (Exception ex)
{
PrintExcetpion($"由文件创建文件夹失败-{fileName}", ex);
}
} public static void CreateDirectoy(string dir)
{
try
{
if (!new System.IO.DirectoryInfo(dir).Exists)
System.IO.Directory.CreateDirectory(dir);
}
catch (Exception ex)
{
PrintExcetpion($"创建文件夹失败-{dir}", ex);
}
} public static string[] GetAllSubDirs(string root, SearchOption searchOption)
{
string[] all = null;
try
{
all = Directory.GetDirectories(root, "*", searchOption);
}
catch
{
// ignored
} return all;
} public static List<string> GetAllPureSubDirs(string root)
{
List<string> list = new List<string>();
try
{
string[] all = Directory.GetDirectories(root, "*", SearchOption.TopDirectoryOnly);
foreach (string path in all)
{
string s = System.IO.Path.GetFileName(path);
list.Add(s);
}
}
catch
{
// ignored
} return list;
} public static long GetFilesSize(string[] fileNames)
{
return fileNames.Sum(fileName => GetFileSize(fileName));
} public static long GetFileSize(string fileName)
{
if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName))
return new FileInfo(fileName).Length; return ;
} /// <summary>
/// Files the content.
/// </summary>
/// <param name="fileName">Name of the file.</param>
/// <returns></returns>
public static byte[] FileContent(string fileName)
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
try
{
byte[] buffur = new byte[fs.Length];
fs.Read(buffur, , (int)fs.Length); return buffur;
}
catch (Exception ex)
{
Console.WriteLine("读取文件字节流失败: {0}", ex.Message);
return null;
}
finally
{
if (fs != null)
{
//关闭资源
fs.Close();
}
}
} public static bool SaveString2File(string content, string fileName)
{
StreamWriter sw = null; try
{
CreateDirectoyFromFileName(fileName); sw = new StreamWriter(fileName);
sw.WriteLine(content);
}
catch (Exception ex)
{
PrintExcetpion($"保存内容错误-{fileName}", ex);
return false;
} if (sw != null)
sw.Close(); return true;
} public static string LoadStringFromFile(string fileName)
{
string content = string.Empty; StreamReader sr = null;
try
{
sr = new StreamReader(fileName,System.Text.Encoding.UTF8);
content = sr.ReadToEnd();
}
catch (Exception ex)
{
PrintExcetpion($"读取内容错误-{fileName}", ex);
} if (sr != null)
sr.Close(); return content;
} public static string GetLocalFileName(string lastPath, string displayName, string[] typeNames)
{
OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog(); // ofd.InitialDirectory = lastPath;
ofd.RestoreDirectory = true; // "动画(.flc;.fli;.gif;.swf)|*.flc;*.fli;*.gif;*.swf|Animation(.flc,.fli)|*.flc;*.fli|Gif89a(.gif)|*.gif|SWF(*.swf)|*.swf|"
// displayName + "(*.epub|All files (*.*)|*.*";
string filter = displayName + "("; filter = typeNames.Aggregate(filter, (current, ext) => current + ("." + ext + ";")); filter += ")|"; for (int i = ; i < typeNames.Length; i++)
{
filter += "*." + typeNames[i];
if (i < typeNames.Length - )
filter += ";";
} // filter += "|全部文件 (*.*)|*.*";
ofd.Filter = filter; return ofd.ShowDialog() != System.Windows.Forms.DialogResult.OK ? string.Empty : ofd.FileName;
} /// <summary>
/// 获取差异的文件列表
/// </summary>
/// <param name="srcDir"></param>
/// <param name="destDir"></param>
/// <returns></returns>
public static List<string> GetNotSameFiles(string srcDir, string destDir)
{
var oldData = new List<string>();
var newData = new List<string>();
new DirectoryInfo(srcDir).GetFiles().ToList().ForEach((f) =>
{
newData.Add(f.Name);
}); new DirectoryInfo(destDir).GetFiles().ToList().ForEach((f) =>
{
oldData.Add(f.Name);
}); //求交集
var dupComparer = new InlineComparer<string>((i1, i2) => i1.Equals(i2), i => i.GetHashCode());
var _IntersectData = oldData.Intersect(newData, dupComparer); if (_IntersectData == null || _IntersectData.Count() == )
return null; // 处理交集文件里可能有差异的内容。
var _files = new List<string>(); // 通过md5先过滤一部分数据 然后找到有差异的文件列表
_IntersectData.ToList().ForEach((s) =>
{
var o = Path.Combine(destDir, s);
var n = Path.Combine(srcDir, s); var omd5 = Md5FileHelper.MD5File(o);
var nmd5 = Md5FileHelper.MD5File(n); if (!omd5.Equals(nmd5))
{
_files.Add(s);
}
}); return _files;
} /// <summary>
/// 获取root文件夹下所有的文件,包含子文件夹中的文件
/// </summary>
/// <param name="root">文件夹路径</param>
/// <param name="extension">文件扩展名,默认为所有文件</param>
/// <returns>root文件夹下所有的文件的列表</returns>
public static List<string> GetAllFileList(string root, string extension = "")
{
if (Directory.Exists(root))
{
var dirList = GetAllSubDirs(root, SearchOption.AllDirectories).ToList();
dirList.Add(root); var list = new List<string>(); foreach (var dir in dirList)
{
DirectoryInfo dirInfo = new DirectoryInfo(dir);
dirInfo.GetFiles().ToList().ForEach(f =>
{
if (!string.IsNullOrWhiteSpace(extension))
{
if (f.Extension == (extension.Contains(".") ? extension : "." + extension))
{
list.Add(f.FullName);
}
}
else
{
list.Add(f.FullName);
}
});
} return list;
}
else
{
return null;
}
} public class InlineComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, T, bool> getEquals;
private readonly Func<T, int> getHashCode; public InlineComparer(Func<T, T, bool> equals, Func<T, int> hashCode)
{
this.getEquals = equals;
this.getHashCode = hashCode;
} public bool Equals(T x, T y)
{
return this.getEquals(x, y);
} public int GetHashCode(T obj)
{
return this.getHashCode(obj);
}
}
}
}
---------------------
作者:代码养家
来源:CSDN
原文:https://blog.csdn.net/wangzl1163/article/details/79306885
版权声明:本文为博主原创文章,转载请附上博文链接!

FileHelper的更多相关文章

  1. 【无私分享:ASP.NET CORE 项目实战(第七章)】文件操作 FileHelper

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在程序设计中,我们很多情况下,会用到对文件的操作,在 上一个系列 中,我们有很多文件基本操作的示例,在Core中有一些改变,主 ...

  2. C# 最全的文件工具类FileHelper

    using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Lin ...

  3. [No0000DC]C# FileHelper 本地文件、文件夹操作类封装FileHelper

    using System; using System.Diagnostics; using System.IO; using System.Text; using Shared; namespace ...

  4. C#-FileHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

  6. sqlyog导出json数据格式支持mysql数据转存mongodb

    <!-------------知识的力量是无限的(当然肯定还有更简单的方法)-----------!> 当我考虑将省市区三级联动数据从mysql转入mongodb时遇到了网上无直接插入mo ...

  7. 【无私分享:ASP.NET CORE 项目实战】目录索引

    简介 首先,我们的  [无私分享:从入门到精通ASP.NET MVC]   系列已经接近尾声,希望大家在这个过程中学到了一些思路和方法,而不仅仅是源码. 因为是第一次写博客,我感觉还是比较混乱的,其中 ...

  8. shell 带签名请求,yii 处理带签名的请求

    处理请求 class TestController extends Controller { public function init() { if(!YII_ENV_DEV){ throw new ...

  9. Thread.Sleep引发ThreadAbortException异常

    短信平台记录日志模块,是通过异步方式来记录的,即日志工具类里初始化一个Queue对象,公共的写日志方法的处理逻辑是把日志消息放到Queue里.构造器里设定一个死循环,不停的读队,然后把日志消息持久化到 ...

随机推荐

  1. [CSS] Re-order the appearance of grid items using the order property

    As with flex items, we can set an order value on grid items. Let’s see how this affects the DOM and ...

  2. [Ramda] Get Deeply Nested Properties Safely with Ramda's path and pathOr Functions

    In this lesson we'll see how Ramda's path and pathOr functions can be used to safely access a deeply ...

  3. Python爬虫项目整理

    WechatSogou [1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典. DouBanSpider [2]- ...

  4. [ES2016] Check if an array contains an item using Array.prototype.includes

    We often want to check if an array includes a specific item. It's been common to do this with the Ar ...

  5. 学习鸟哥的Linux私房菜笔记(14)——硬件配置与管理

    一.设备文件 Linux沿袭了Unix的风格,将所有设备看成一个文件 设备文件分为两种: 块设备文件(b):比如硬盘.光驱 字符设备文件(c):比如串口.键盘 设备文件一般存放在/dev目录下 二.常 ...

  6. 巧用redis位图存储亿级数据与访问 - 简书

    原文:巧用redis位图存储亿级数据与访问 - 简书 业务背景 现有一个业务需求,需要从一批很大的用户活跃数据(2亿+)中判断用户是否是活跃用户.由于此数据是基于用户的各种行为日志清洗才能得到,数据部 ...

  7. httpclient htmlunit下载单个文件

    httpclient public class Download { public static void main(String[] args) throws ClientProtocolExcep ...

  8. cordova/phoneGap 开发调试工具

    原文地址 一.前言 Ripple Emulate:使用Google模拟器,可以帮到大部分的调试,除了需要调用手机设备方面的功能除外.GapDebug:真机安装apk,电脑端和真机端同步调试,适用的项目 ...

  9. Linq知识小总结

    一.投影操作符 Select Select操作符对单个序列或集合中的值进行投影. 返回 IEnumerable<类名> //查询语法 var query = from e in db.Em ...

  10. Visual Studio for Mac第四预

    微软发布Visual Studio for Mac第四预览版 去年 11 月,微软发布了 Visual Studio for Mac 的首个预览版本,并且承诺后续数月会带来更多功能.而今天,随着 Vi ...