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. 每天一个JavaScript实例-处理textarea中的字符成每一行

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  2. jquery file upload示例

    原文链接:http://blog.csdn.net/qq_37936542/article/details/79258158 jquery file upload是一款实用的上传文件插件,项目中刚好用 ...

  3. C#趣味程序---个位数为6,且能被3整出的五位数

    using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int ...

  4. Linux网络编程——原始套接字编程

    原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据.区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有 ...

  5. php超实用正则表达式有哪些

    php超实用正则表达式有哪些 一.总结 一句话总结: 二.php几个超实用正则表达式 对于开发人员来说,正则表达式是一个非常有用的功能,它提供了 查找,匹配,替换 句子,单词,或者其他格式的字符串.这 ...

  6. hdu 4059 The Boss on Mars

    The Boss on Mars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. 使用SecureCRT连接AWS的EC2

    如果使用CentOS等linux系统,直接使用ssh命令即可访问AWS上的Linux-EC2实例. $ ssh -i XXX.pem ec2-user@{IP/hostname} 在Windows系统 ...

  8. iOS 第三方库(1)

    MKNETWORK 被广泛使用的第三方网络访问开源库.用于提供更加友好的网络访问接口.相信很多搞iOS开发的朋友都用过它 RegexKit RegexKit是一个正则表达式工具类.提供强大的正则表达式 ...

  9. 【b301】神经网络

    神经网络(NOIP2003第1题) Time Limit: 1 second Memory Limit: 50 MB [问题背景] 人工神经网络(Artificial Neural Network)是 ...

  10. springMvc中restful风格的api路径中把小数点当参数,SpringMvc中url有小数点

    在springMvc web项目中restful风格的api路径中有小数点会被过滤后台拿不到最后一个小数点的问题, 有两种解决方案: 1:在api路径中加入:.+ @RequestMapping(&q ...