删除文件、打开文件、创建文件、移动文件、复制文件以及删除、打开、创建、移动、复制文件夹等等操作集成在这个FileHelper中。
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);
}
}
///
/// 删除目录下的所有文件(只删除文件)
///
///
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);
}
}
///
/// 移动整个文件夹
///
///
///
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") != -1)
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 GetAllPureSubDirs(string root)
{
List list = new List();
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 0;
}
///
/// Files the content.
///
/// Name of the file.
///
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, 0, (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 = 0; i < typeNames.Length; i++)
{
filter += "*." + typeNames[i];
if (i < typeNames.Length - 1)
filter += ";";
}
// filter += "|全部文件 (*.*)|*.*";
ofd.Filter = filter;
return ofd.ShowDialog() != System.Windows.Forms.DialogResult.OK ? string.Empty : ofd.FileName;
}
///
/// 获取差异的文件列表
///
///
///
///
public static List GetNotSameFiles(string srcDir, string destDir)
{
var oldData = new List();
var newData = new List();
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((i1, i2) => i1.Equals(i2), i => i.GetHashCode());
var _IntersectData = oldData.Intersect(newData, dupComparer);
if (_IntersectData == null || _IntersectData.Count() == 0)
return null;
// 处理交集文件里可能有差异的内容。
var _files = new List();
// 通过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;
}
///
/// 获取root文件夹下所有的文件,包含子文件夹中的文件
///
/// 文件夹路径
/// 文件扩展名,默认为所有文件
/// root文件夹下所有的文件的列表
public static List GetAllFileList(string root, string extension = "")
{
if (Directory.Exists(root))
{
var dirList = GetAllSubDirs(root, SearchOption.AllDirectories).ToList();
dirList.Add(root);
var list = new List();
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 : IEqualityComparer
{
private readonly Func getEquals;
private readonly Func getHashCode;
public InlineComparer(Func equals, Func 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);
}
}
}
}