using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace Whir.Software.Framework
{
/// <summary>
/// 文件輔助類
/// </summary>
public class FileHelper
{
/// <summary>
/// 編碼方式
/// </summary>
private static readonly Encoding Encoding = Encoding.UTF8;
/// <summary>
/// 遞歸取得文件夾下文件
/// </summary>
/// <param name="dir"></param>
/// <param name="list"></param>
public static void GetFiles(string dir, List<string> list)
{
GetFiles(dir, list, new List<string>());
}
/// <summary>
/// 遞歸取得文件夾下文件
/// </summary>
/// <param name="dir"></param>
/// <param name="list"></param>
/// <param name="fileExtsions"></param>
public static void GetFiles(string dir, List<string> list, List<string> fileExtsions)
{
//添加文件
string[] files = Directory.GetFiles(dir);
if (fileExtsions.Count > 0)
{
foreach (string file in files)
{
string extension = Path.GetExtension(file);
if (extension != null && fileExtsions.Contains(extension))
{
list.Add(file);
}
}
}
else
{
list.AddRange(files);
}
//如果是目錄,則遞歸
DirectoryInfo[] directories = new DirectoryInfo(dir).GetDirectories();
foreach (DirectoryInfo item in directories)
{
GetFiles(item.FullName, list, fileExtsions);
}
}
/// <summary>
/// 寫入文件
/// </summary>
/// <param name="filePath">文件名</param>
/// <param name="content">文件內容</param>
public static void WriteFile(string filePath, string content)
{
try
{
var fs = new FileStream(filePath, FileMode.Create);
Encoding encode = Encoding;
//獲得字節數組
byte[] data = encode.GetBytes(content);
//開始寫入
fs.Write(data, 0, data.Length);
//清空緩沖區、關閉流
fs.Flush();
fs.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
/// <summary>
/// 讀取文件
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string ReadFile(string filePath)
{
return ReadFile(filePath, Encoding);
}
/// <summary>
/// 讀取文件
/// </summary>
/// <param name="filePath"></param>
/// <param name="encoding"></param>
/// <returns></returns>
public static string ReadFile(string filePath, Encoding encoding)
{
using (var sr = new StreamReader(filePath, encoding))
{
return sr.ReadToEnd();
}
}
/// <summary>
/// 讀取文件
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static List<string> ReadFileLines(string filePath)
{
var str = new List<string>();
using (var sr = new StreamReader(filePath, Encoding))
{
String input;
while ((input = sr.ReadLine()) != null)
{
str.Add(input);
}
}
return str;
}
/// <summary>
/// 復制文件夾(及文件夾下所有子文件夾和文件)
/// </summary>
/// <param name="sourcePath">待復制的文件夾路徑</param>
/// <param name="destinationPath">目標路徑</param>
public static void CopyDirectory(String sourcePath, String destinationPath)
{
var info = new DirectoryInfo(sourcePath);
Directory.CreateDirectory(destinationPath);
foreach (FileSystemInfo fsi in info.GetFileSystemInfos())
{
String destName = Path.Combine(destinationPath, fsi.Name);
if (fsi is FileInfo) //如果是文件,復制文件
File.Copy(fsi.FullName, destName);
else //如果是文件夾,新建文件夾,遞歸
{
Directory.CreateDirectory(destName);
CopyDirectory(fsi.FullName, destName);
}
}
}
/// <summary>
/// 刪除文件夾(及文件夾下所有子文件夾和文件)
/// </summary>
/// <param name="directoryPath"></param>
public static void DeleteFolder(string directoryPath)
{
foreach (string d in Directory.GetFileSystemEntries(directoryPath))
{
if (File.Exists(d))
{
var fi = new FileInfo(d);
if (fi.Attributes.ToString().IndexOf("ReadOnly", StringComparison.Ordinal) != -1)
fi.Attributes = FileAttributes.Normal;
File.Delete(d); //刪除文件
}
else
DeleteFolder(d); //刪除文件夾
}
Directory.Delete(directoryPath); //刪除空文件夾
}
/// <summary>
/// 清空文件夾(及文件夾下所有子文件夾和文件)
/// </summary>
/// <param name="directoryPath"></param>
public static void ClearFolder(string directoryPath)
{
foreach (string d in Directory.GetFileSystemEntries(directoryPath))
{
if (File.Exists(d))
{
var fi = new FileInfo(d);
if (fi.Attributes.ToString().IndexOf("ReadOnly", StringComparison.Ordinal) != -1)
fi.Attributes = FileAttributes.Normal;
File.Delete(d); //刪除文件
}
else
DeleteFolder(d); //刪除文件夾
}
}
/// <summary>
/// 取得文件大小,按適當單位轉換
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
public static string GetFileSize(string filepath)
{
string result = "0KB";
if (File.Exists(filepath))
{
var size = new FileInfo(filepath).Length;
int filelength = size.ToString().Length;
if (filelength < 4)
result = size + "byte";
else if (filelength < 7)
result = Math.Round(Convert.ToDouble(size / 1024d), 2) + "KB";
else if (filelength < 10)
result = Math.Round(Convert.ToDouble(size / 1024d / 1024), 2) + "MB";
else if (filelength < 13)
result = Math.Round(Convert.ToDouble(size / 1024d / 1024 / 1024), 2) + "GB";
else
result = Math.Round(Convert.ToDouble(size / 1024d / 1024 / 1024 / 1024), 2) + "TB";
return result;
}
return result;
}
}
}