using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Net; using System.Text; namespace TEAMModelOS.SDK.Helper.Common.FileHelper { public class FileHelper { #region 获取文件到集合中 /// /// 读取指定位置文件列表到集合中 /// /// 指定路径 /// public static DataTable GetFileTable(string path) { DataTable dt = new DataTable(); dt.Columns.Add("name", typeof(string)); dt.Columns.Add("ext", typeof(string)); dt.Columns.Add("size", typeof(long)); dt.Columns.Add("time", typeof(DateTime)); DirectoryInfo dirinfo = new DirectoryInfo(path); FileInfo fi; DirectoryInfo dir; string FileName, FileExt; long FileSize = 0; DateTime FileModify; try { foreach (FileSystemInfo fsi in dirinfo.GetFileSystemInfos()) { FileName = string.Empty; FileExt = string.Empty; if (fsi is FileInfo) { fi = (FileInfo)fsi; //获取文件名称 FileName = fi.Name; //获取文件扩展名 FileExt = fi.Extension; //获取文件大小 FileSize = fi.Length; //获取文件最后修改时间 FileModify = fi.LastWriteTime; } else { dir = (DirectoryInfo)fsi; //获取目录名 FileName = dir.Name; //获取目录最后修改时间 FileModify = dir.LastWriteTime; //设置目录文件为文件夹 FileExt = "文件夹"; } DataRow dr = dt.NewRow(); dr["name"] = FileName; dr["ext"] = FileExt; dr["size"] = FileSize; dr["time"] = FileModify; dt.Rows.Add(dr); } } catch { throw; } return dt; } #endregion #region 检测指定路径是否存在 /// /// 检测指定路径是否存在 /// /// 目录的绝对路径 public static bool IsExistDirectory(string path) { return Directory.Exists(path); } #endregion #region 检测指定文件是否存在,如果存在则返回true /// /// 检测指定文件是否存在,如果存在则返回true /// /// 文件的绝对路径 public static bool IsExistFile(string filePath) { return File.Exists(filePath); } #endregion #region 创建文件夹 /// /// 创建文件夹 /// /// 文件夹的绝对路径 public static void CreateFolder(string folderPath) { if (!IsExistDirectory(folderPath)) { Directory.CreateDirectory(folderPath); } } #endregion #region 判断上传文件后缀名 /// /// 判断上传文件后缀名 /// /// 后缀名 public static bool IsCanEdit(string strExtension) { strExtension = strExtension.ToLower(); if (strExtension.LastIndexOf(".", StringComparison.Ordinal) >= 0) { strExtension = strExtension.Substring(strExtension.LastIndexOf(".", StringComparison.Ordinal)); } else { strExtension = ".txt"; } string[] strArray = new string[] { ".htm", ".html", ".txt", ".js", ".css", ".xml", ".sitemap" }; for (int i = 0; i < strArray.Length; i++) { if (strExtension.Equals(strArray[i])) { return true; } } return false; } public static bool IsSafeName(string strExtension) { strExtension = strExtension.ToLower(); if (strExtension.LastIndexOf(".") >= 0) { strExtension = strExtension.Substring(strExtension.LastIndexOf(".")); } else { strExtension = ".txt"; } string[] strArray = new string[] { ".jpg", ".gif", ".png" }; for (int i = 0; i < strArray.Length; i++) { if (strExtension.Equals(strArray[i])) { return true; } } return false; } public static bool IsZipName(string strExtension) { strExtension = strExtension.ToLower(); if (strExtension.LastIndexOf(".") >= 0) { strExtension = strExtension.Substring(strExtension.LastIndexOf(".")); } else { strExtension = ".txt"; } string[] strArray = new string[] { ".zip", ".rar" }; for (int i = 0; i < strArray.Length; i++) { if (strExtension.Equals(strArray[i])) { return true; } } return false; } #endregion #region 创建文件夹 /// /// 创建文件夹 /// /// 文件的绝对路径 public static void CreateSuffic(string fileName) { try { if (!Directory.Exists(fileName)) { Directory.CreateDirectory(fileName); } } catch (Exception ex) { var s = ex.Message; throw; } } /// /// 创建文件夹 /// /// 文件的绝对路径 public static void CreateFiles(string fileName) { try { //判断文件是否存在,不存在创建该文件 if (!IsExistFile(fileName)) { FileInfo file = new FileInfo(fileName); FileStream fs = file.Create(); fs.Close(); } } catch (Exception ex) { throw ex; } } /// /// 创建一个文件,并将字节流写入文件。 /// /// 文件的绝对路径 /// 二进制流数据 public static void CreateFile(string filePath, byte[] buffer) { try { //判断文件是否存在,不存在创建该文件 if (!IsExistFile(filePath)) { FileInfo file = new FileInfo(filePath); FileStream fs = file.Create(); fs.Write(buffer, 0, buffer.Length); fs.Close(); } else { File.WriteAllBytes(filePath, buffer); } } catch (Exception ex) { throw ex; } } #endregion #region 将文件移动到指定目录 /// /// 将文件移动到指定目录 /// /// 需要移动的源文件的绝对路径 /// 移动到的目录的绝对路径 public static void Move(string sourceFilePath, string descDirectoryPath) { string sourceName = GetFileName(sourceFilePath); if (IsExistDirectory(descDirectoryPath)) { //如果目标中存在同名文件,则删除 if (IsExistFile(descDirectoryPath + "\\" + sourceFilePath)) { DeleteFile(descDirectoryPath + "\\" + sourceFilePath); } else { //将文件移动到指定目录 File.Move(sourceFilePath, descDirectoryPath + "\\" + sourceFilePath); } } } #endregion # region 将源文件的内容复制到目标文件中 /// /// 将源文件的内容复制到目标文件中 /// /// 源文件的绝对路径 /// 目标文件的绝对路径 public static void Copy(string sourceFilePath, string descDirectoryPath) { File.Copy(sourceFilePath, descDirectoryPath, true); } #endregion #region 从文件的绝对路径中获取文件名( 不包含扩展名 ) /// /// 从文件的绝对路径中获取文件名( 不包含扩展名 ) /// /// 文件的绝对路径 public static string GetFileName(string filePath) { FileInfo file = new FileInfo(filePath); return file.Name; } #endregion #region 获取文件的后缀名 /// /// 获取文件的后缀名 /// /// 文件的绝对路径 public static string GetExtension(string filePath) { FileInfo file = new FileInfo(filePath); return file.Extension; } /// /// 返回文件扩展名,不含“.” /// /// 文件全名称 /// string public static string GetFileExt(string filepath) { if (string.IsNullOrEmpty(filepath)) { return ""; } if (filepath.LastIndexOf(".", StringComparison.Ordinal) > 0) { return filepath.Substring(filepath.LastIndexOf(".", StringComparison.Ordinal) + 1); //文件扩展名,不含“.” } return ""; } #endregion #region 删除指定文件 /// /// 删除指定文件 /// /// 文件的绝对路径 public static void DeleteFile(string filePath) { if (IsExistFile(filePath)) { File.Delete(filePath); } } #endregion // ///直接删除指定目录下的所有文件及文件夹(保留目录) /// /// 文件夹路径 /// 执行结果 public static void DeleteDirAndFiles(string file) { try { //去除文件夹和子文件的只读属性 //去除文件夹的只读属性 System.IO.DirectoryInfo fileInfo = new DirectoryInfo(file); fileInfo.Attributes = FileAttributes.Normal & FileAttributes.Directory; //去除文件的只读属性 System.IO.File.SetAttributes(file, System.IO.FileAttributes.Normal); //判断文件夹是否还存在 if (Directory.Exists(file)) { foreach (string f in Directory.GetFileSystemEntries(file)) { if (File.Exists(f)) { //如果有子文件删除文件 File.Delete(f); Console.WriteLine(f); } else { //循环递归删除子文件夹 DeleteDirAndFiles(f); } } //删除空文件夹 Directory.Delete(file); } } catch (Exception ex) // 异常处理 { Console.WriteLine(ex.Message.ToString());// 异常信息 } } #region 删除指定目录及其所有子目录 /// /// 删除指定目录及其所有子目录 /// /// 文件的绝对路径 public static void DeleteDirectory(string directoryPath) { if (IsExistDirectory(directoryPath)) { Directory.Delete(directoryPath); } } #endregion #region 清空指定目录下所有文件及子目录,但该目录依然保存. /// /// 清空指定目录下所有文件及子目录,但该目录依然保存. /// /// 指定目录的绝对路径 public static void ClearDirectory(string directoryPath) { if (!IsExistDirectory(directoryPath)) return; //删除目录中所有的文件 string[] fileNames = GetFileNames(directoryPath); for (int i = 0; i < fileNames.Length; i++) { DeleteFile(fileNames[i]); } //删除目录中所有的子目录 string[] directoryNames = GetDirectories(directoryPath); for (int i = 0; i < directoryNames.Length; i++) { DeleteDirectory(directoryNames[i]); } } #endregion #region 剪切 粘贴 /// /// 剪切文件 /// /// 原路径 /// 新路径 public bool FileMove(string source, string destination) { bool ret = false; FileInfo file_s = new FileInfo(source); FileInfo file_d = new FileInfo(destination); if (file_s.Exists) { if (!file_d.Exists) { file_s.MoveTo(destination); ret = true; } } if (ret == true) { //Response.Write(""); } else { //Response.Write(""); } return ret; } #endregion #region 检测指定目录是否为空 /// /// 检测指定目录是否为空 /// /// 指定目录的绝对路径 public static bool IsEmptyDirectory(string directoryPath) { try { //判断文件是否存在 string[] fileNames = GetFileNames(directoryPath); if (fileNames.Length > 0) { return false; } //判断是否存在文件夹 string[] directoryNames = GetDirectories(directoryPath); if (directoryNames.Length > 0) { return false; } return true; } catch (Exception ex) { var s = ex.Message; return true; } } #endregion #region 获取指定目录中所有文件列表 /// /// 获取指定目录中所有文件列表 /// /// 指定目录的绝对路径 public static string[] GetFileNames(string directoryPath) { if (!IsExistDirectory(directoryPath)) { throw new FileNotFoundException(); } return Directory.GetFiles(directoryPath); } #endregion #region 获取指定目录中的子目录列表 /// /// 获取指定目录中所有子目录列表,若要搜索嵌套的子目录列表,请使用重载方法 /// /// 指定目录的绝对路径 public static string[] GetDirectories(string directoryPath) { try { return Directory.GetDirectories(directoryPath); } catch (Exception ex) { throw ex; } } /// /// 获取指定目录及子目录中所有子目录列表 /// /// 指定目录的绝对路径 /// 模式字符串,"*"代表0或N个字符,"?"代表1个字符。 /// 范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。 /// 是否搜索子目录 public static string[] GetDirectories(string directoryPath, string searchPattern, bool isSearchChild) { try { if (isSearchChild) { return Directory.GetDirectories(directoryPath, searchPattern, SearchOption.AllDirectories); } else { return Directory.GetDirectories(directoryPath, searchPattern, SearchOption.TopDirectoryOnly); } } catch (Exception ex) { throw ex; } } #endregion #region 获取一个文件的长度 /// /// 获取一个文件的长度,单位为Byte /// /// 文件的绝对路径 public static int GetFileSize(string filePath) { //创建一个文件对象 FileInfo fi = new FileInfo(filePath); //获取文件的大小 return (int)fi.Length; } /// /// 获取一个文件的长度,单位为KB /// /// 文件的路径 public static double GetFileSizeByKb(string filePath) { //创建一个文件对象 FileInfo fi = new FileInfo(filePath); //获取文件的大小 return Math.Round(Convert.ToDouble(filePath.Length) / 1024, 2);// ConvertHelper.ToDouble(ConvertHelper.ToDouble(fi.Length) / 1024, 1); } /// /// 获取一个文件的长度,单位为MB /// /// 文件的路径 public static double GetFileSizeByMb(string filePath) { //创建一个文件对象 FileInfo fi = new FileInfo(filePath); //获取文件的大小 return Math.Round(Convert.ToDouble(Convert.ToDouble(fi.Length) / 1024 / 1024), 2); } #endregion #region 获取所有文件夹及子文件夹 /// /// 获取所有文件夹及子文件夹 /// /// /// public static List GetDirs(string dirPath) { var list = new List(); return GetArrys(dirPath, 0, list); } private static int zdId = 0; private static List GetArrys(string dirPath, int pid, List list) { if (!Directory.Exists(dirPath)) return list; if (Directory.GetDirectories(dirPath).Length <= 0) return list; foreach (string path in Directory.GetDirectories(dirPath)) { zdId++; var model = new ArrayFiles() { Id = zdId, Name = path.Substring(path.LastIndexOf('\\') + 1, path.Length - (path.LastIndexOf('\\') + 1)), Pid = pid, Open = false, Target = "DeployBase", Url = "/FytAdmin/FileMiam/DocList?path=" + path }; list.Add(model); GetArrys(path, model.Id, list); } return list; } public class ArrayFiles { public int Id { get; set; } public int Pid { get; set; } public string Name { get; set; } public Boolean Open { get; set; } public string Target { get; set; } public string Url { get; set; } } #endregion #region 将文件读取到字符串中 /// /// 将文件读取到字符串中 /// /// 文件的绝对路径 public static string FileToString(string filePath) { return FileToString(filePath, Encoding.UTF8); } /// /// 将文件读取到字符串中 /// /// 文件的绝对路径 /// 字符编码 public static string FileToString(string filePath, Encoding encoding) { //创建流读取器 StreamReader reader = new StreamReader(filePath, encoding); try { //读取流 return reader.ReadToEnd(); } catch (Exception ex) { throw ex; } finally { //关闭流读取器 reader.Close(); } } #endregion } /// /// 远程文件下载 /// public class HttpDldFile { /// /// Http方式下载文件 /// /// http地址 /// 本地文件 /// public bool Download(string url, string localfile) { bool flag = false; long startPosition = 0; // 上次下载的文件起始位置 FileStream writeStream; // 写入本地文件流对象 long remoteFileLength = GetHttpLength(url);// 取得远程文件长度 //System.Console.WriteLine("remoteFileLength=" + remoteFileLength); if (remoteFileLength == 745) { System.Console.WriteLine("远程文件不存在."); return false; } // 判断要下载的文件夹是否存在 if (File.Exists(localfile)) { writeStream = File.OpenWrite(localfile); // 存在则打开要下载的文件 startPosition = writeStream.Length; // 获取已经下载的长度 if (startPosition >= remoteFileLength) { System.Console.WriteLine("本地文件长度" + startPosition + "已经大于等于远程文件长度" + remoteFileLength); writeStream.Close(); return false; } else { writeStream.Seek(startPosition, SeekOrigin.Current); // 本地文件写入位置定位 } } else { writeStream = new FileStream(localfile, FileMode.Create);// 文件不保存创建一个文件 startPosition = 0; } try { HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url);// 打开网络连接 if (startPosition > 0) { myRequest.AddRange((int)startPosition);// 设置Range值,与上面的writeStream.Seek用意相同,是为了定义远程文件读取位置 } Stream readStream = myRequest.GetResponse().GetResponseStream();// 向服务器请求,获得服务器的回应数据流 byte[] btArray = new byte[512];// 定义一个字节数据,用来向readStream读取内容和向writeStream写入内容 int contentSize = readStream.Read(btArray, 0, btArray.Length);// 向远程文件读第一次 long currPostion = startPosition; while (contentSize > 0)// 如果读取长度大于零则继续读 { currPostion += contentSize; int percent = (int)(currPostion * 100 / remoteFileLength); System.Console.WriteLine("percent=" + percent + "%"); writeStream.Write(btArray, 0, contentSize);// 写入本地文件 contentSize = readStream.Read(btArray, 0, btArray.Length);// 继续向远程文件读取 } //关闭流 writeStream.Close(); readStream.Close(); flag = true; //返回true下载成功 } catch (Exception) { writeStream.Close(); flag = false; //返回false下载失败 } return flag; } // 从文件头得到远程文件的长度 private static long GetHttpLength(string url) { long length = 0; try { HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);// 打开网络连接 HttpWebResponse rsp = (HttpWebResponse)req.GetResponse(); if (rsp.StatusCode == HttpStatusCode.OK) { length = rsp.ContentLength;// 从文件头得到远程文件的长度 } rsp.Close(); return length; } catch (Exception e) { var s = e.Message; return length; } } } }