C#操作文件帮助类FileHelper

删除文件、打开文件、创建文件、移动文件、复制文件以及删除、打开、创建、移动、复制文件夹等等操作集成在这个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);
            }
        }
    }
}

你可能感兴趣的:(C#语言)