using System;
using System.Text;
using System.IO;
namespace DotNet.Utilities
{
/// <summary>
/// 檔案操作夾
/// </summary>
public static class DirFile
{
#region 檢測指定目錄是否存在
/// <summary>
/// 檢測指定目錄是否存在
/// </summary>
/// <param name="directoryPath">目錄的絕對路徑</param>
/// <returns></returns>
public static bool IsExistDirectory(string directoryPath)
{
return Directory.Exists(directoryPath);
}
#endregion
#region 檢測指定檔案是否存在,如果存在傳回true
/// 檢測指定檔案是否存在,如果存在則傳回true。
/// <param name="filePath">檔案的絕對路徑</param>
public static bool IsExistFile(string filePath)
return File.Exists(filePath);
#region 擷取指定目錄中的檔案清單
/// 擷取指定目錄中所有檔案清單
/// <param name="directoryPath">指定目錄的絕對路徑</param>
public static string[] GetFileNames(string directoryPath)
//如果目錄不存在,則抛出異常
if (!IsExistDirectory(directoryPath))
{
throw new FileNotFoundException();
}
//擷取檔案清單
return Directory.GetFiles(directoryPath);
#region 擷取指定目錄中所有子目錄清單,若要搜尋嵌套的子目錄清單,請使用重載方法.
/// 擷取指定目錄中所有子目錄清單,若要搜尋嵌套的子目錄清單,請使用重載方法.
public static string[] GetDirectories(string directoryPath)
try
return Directory.GetDirectories(directoryPath);
catch (IOException ex)
throw ex;
#region 擷取指定目錄及子目錄中所有檔案清單
/// 擷取指定目錄及子目錄中所有檔案清單
/// <param name="directoryPath">指定目錄的絕對路徑</param>
/// <param name="searchPattern">模式字元串,"*"代表0或N個字元,"?"代表1個字元。
/// 範例:"Log*.xml"表示搜尋所有以Log開頭的Xml檔案。</param>
/// <param name="isSearchChild">是否搜尋子目錄</param>
public static string[] GetFileNames(string directoryPath, string searchPattern, bool isSearchChild)
if (isSearchChild)
{
return Directory.GetFiles(directoryPath, searchPattern, SearchOption.AllDirectories);
}
else
return Directory.GetFiles(directoryPath, searchPattern, SearchOption.TopDirectoryOnly);
#region 檢測指定目錄是否為空
/// 檢測指定目錄是否為空
public static bool IsEmptyDirectory(string directoryPath)
//判斷是否存在檔案
string[] fileNames = GetFileNames(directoryPath);
if (fileNames.Length > 0)
return false;
//判斷是否存在檔案夾
string[] directoryNames = GetDirectories(directoryPath);
if (directoryNames.Length > 0)
return true;
catch
//這裡記錄日志
//LogHelper.WriteTraceLog(TraceLogLevel.Error, ex.Message);
#region 檢測指定目錄中是否存在指定的檔案
/// 檢測指定目錄中是否存在指定的檔案,若要搜尋子目錄請使用重載方法.
/// 範例:"Log*.xml"表示搜尋所有以Log開頭的Xml檔案。</param>
public static bool Contains(string directoryPath, string searchPattern)
//擷取指定的檔案清單
string[] fileNames = GetFileNames(directoryPath, searchPattern, false);
//判斷指定檔案是否存在
if (fileNames.Length == 0)
return true;
catch (Exception ex)
throw new Exception(ex.Message);
/// 檢測指定目錄中是否存在指定的檔案
public static bool Contains(string directoryPath, string searchPattern, bool isSearchChild)
string[] fileNames = GetFileNames(directoryPath, searchPattern, true);
#region 建立目錄
/// 建立目錄
/// <param name="dir">要建立的目錄路徑包括目錄名</param>
public static void CreateDir(string dir)
if (dir.Length == 0) return;
if (!Directory.Exists(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\" + dir))
Directory.CreateDirectory(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\" + dir);
#region 删除目錄
/// 删除目錄
/// <param name="dir">要删除的目錄路徑和名稱</param>
public static void DeleteDir(string dir)
if (Directory.Exists(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\" + dir))
Directory.Delete(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\" + dir);
#region 删除檔案
/// 删除檔案
/// <param name="file">要删除的檔案路徑和名稱</param>
public static void DeleteFile(string file)
if (File.Exists(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + file))
File.Delete(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + file);
#region 建立檔案
/// 建立檔案
/// <param name="dir">帶字尾的檔案名</param>
/// <param name="pagestr">檔案内容</param>
public static void CreateFile(string dir, string pagestr)
dir = dir.Replace("/", "\\");
if (dir.IndexOf("\\") > -1)
CreateDir(dir.Substring(0, dir.LastIndexOf("\\")));
System.IO.StreamWriter sw = new System.IO.StreamWriter(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\" + dir, false, System.Text.Encoding.GetEncoding("GB2312"));
sw.Write(pagestr);
sw.Close();
#region 移動檔案(剪貼--粘貼)
/// 移動檔案(剪貼--粘貼)
/// <param name="dir1">要移動的檔案的路徑及全名(包括字尾)</param>
/// <param name="dir2">檔案移動到新的位置,并指定新的檔案名</param>
public static void MoveFile(string dir1, string dir2)
dir1 = dir1.Replace("/", "\\");
dir2 = dir2.Replace("/", "\\");
if (File.Exists(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\" + dir1))
File.Move(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\" + dir1, System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\" + dir2);
#region 複制檔案
/// 複制檔案
/// <param name="dir1">要複制的檔案的路徑已經全名(包括字尾)</param>
/// <param name="dir2">目标位置,并指定新的檔案名</param>
public static void CopyFile(string dir1, string dir2)
File.Copy(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\" + dir1, System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "\\" + dir2, true);
#region 根據時間得到目錄名 / 格式:yyyyMMdd 或者 HHmmssff
/// 根據時間得到目錄名yyyyMMdd
public static string GetDateDir()
return DateTime.Now.ToString("yyyyMMdd");
/// 根據時間得到檔案名HHmmssff
public static string GetDateFile()
return DateTime.Now.ToString("HHmmssff");
#region 複制檔案夾
/// 複制檔案夾(遞歸)
/// <param name="varFromDirectory">源檔案夾路徑</param>
/// <param name="varToDirectory">目标檔案夾路徑</param>
public static void CopyFolder(string varFromDirectory, string varToDirectory)
Directory.CreateDirectory(varToDirectory);
if (!Directory.Exists(varFromDirectory)) return;
string[] directories = Directory.GetDirectories(varFromDirectory);
if (directories.Length > 0)
foreach (string d in directories)
CopyFolder(d, varToDirectory + d.Substring(d.LastIndexOf("\\")));
string[] files = Directory.GetFiles(varFromDirectory);
if (files.Length > 0)
foreach (string s in files)
File.Copy(s, varToDirectory + s.Substring(s.LastIndexOf("\\")), true);
#region 檢查檔案,如果檔案不存在則建立
/// 檢查檔案,如果檔案不存在則建立
/// <param name="FilePath">路徑,包括檔案名</param>
public static void ExistsFile(string FilePath)
//if(!File.Exists(FilePath))
//File.Create(FilePath);
//以上寫法會報錯,詳細解釋請看下文.........
if (!File.Exists(FilePath))
FileStream fs = File.Create(FilePath);
fs.Close();
#region 删除指定檔案夾對應其他檔案夾裡的檔案
/// 删除指定檔案夾對應其他檔案夾裡的檔案
/// <param name="varFromDirectory">指定檔案夾路徑</param>
/// <param name="varToDirectory">對應其他檔案夾路徑</param>
public static void DeleteFolderFiles(string varFromDirectory, string varToDirectory)
DeleteFolderFiles(d, varToDirectory + d.Substring(d.LastIndexOf("\\")));
File.Delete(varToDirectory + s.Substring(s.LastIndexOf("\\")));
#region 從檔案的絕對路徑中擷取檔案名( 包含擴充名 )
/// 從檔案的絕對路徑中擷取檔案名( 包含擴充名 )
public static string GetFileName(string filePath)
//擷取檔案的名稱
FileInfo fi = new FileInfo(filePath);
return fi.Name;
/// 複制檔案參考方法,頁面中引用
/// <param name="cDir">新路徑</param>
/// <param name="TempId">模闆引擎替換編号</param>
public static void CopyFiles(string cDir, string TempId)
//{
// string TempStr = string.Empty;
// StreamWriter sw;
// {
// TempStr = TempStr.Replace("{$ChannelId$}", TempId);
// sw.Write(TempStr);
// sw.Close();
// }
//}
#region 建立一個目錄
/// 建立一個目錄
public static void CreateDirectory(string directoryPath)
//如果目錄不存在則建立該目錄
Directory.CreateDirectory(directoryPath);
#region 建立一個檔案
/// 建立一個檔案。
/// <param name="filePath">檔案的絕對路徑</param>
public static void CreateFile(string filePath)
//如果檔案不存在則建立該檔案
if (!IsExistFile(filePath))
//建立一個FileInfo對象
FileInfo file = new FileInfo(filePath);
//建立檔案
FileStream fs = file.Create();
//關閉檔案流
fs.Close();
/// 建立一個檔案,并将位元組流寫入檔案。
/// <param name="buffer">二進制流資料</param>
public static void CreateFile(string filePath, byte[] buffer)
//寫入二進制流
fs.Write(buffer, 0, buffer.Length);
#region 擷取文本檔案的行數
/// 擷取文本檔案的行數
public static int GetLineCount(string filePath)
//将文本檔案的各行讀到一個字元串數組中
string[] rows = File.ReadAllLines(filePath);
//傳回行數
return rows.Length;
#region 擷取一個檔案的長度
/// 擷取一個檔案的長度,機關為Byte
public static int GetFileSize(string filePath)
//建立一個檔案對象
//擷取檔案的大小
return (int)fi.Length;
#region 擷取指定目錄中的子目錄清單
/// 擷取指定目錄及子目錄中所有子目錄清單
public static string[] GetDirectories(string directoryPath, string searchPattern, bool isSearchChild)
return Directory.GetDirectories(directoryPath, searchPattern, SearchOption.AllDirectories);
return Directory.GetDirectories(directoryPath, searchPattern, SearchOption.TopDirectoryOnly);
#region 向文本檔案寫入内容
/// 向文本檔案中寫入内容
/// <param name="text">寫入的内容</param>
/// <param name="encoding">編碼</param>
public static void WriteText(string filePath, string text, Encoding encoding)
//向檔案寫入内容
File.WriteAllText(filePath, text, encoding);
#region 向文本檔案的尾部追加内容
/// 向文本檔案的尾部追加内容
/// <param name="content">寫入的内容</param>
public static void AppendText(string filePath, string content)
File.AppendAllText(filePath, content);
#region 将現有檔案的内容複制到新檔案中
/// 将源檔案的内容複制到目标檔案中
/// <param name="sourceFilePath">源檔案的絕對路徑</param>
/// <param name="destFilePath">目标檔案的絕對路徑</param>
public static void Copy(string sourceFilePath, string destFilePath)
File.Copy(sourceFilePath, destFilePath, true);
#region 将檔案移動到指定目錄
/// 将檔案移動到指定目錄
/// <param name="sourceFilePath">需要移動的源檔案的絕對路徑</param>
/// <param name="descDirectoryPath">移動到的目錄的絕對路徑</param>
public static void Move(string sourceFilePath, string descDirectoryPath)
//擷取源檔案的名稱
string sourceFileName = GetFileName(sourceFilePath);
if (IsExistDirectory(descDirectoryPath))
//如果目标中存在同名檔案,則删除
if (IsExistFile(descDirectoryPath + "\\" + sourceFileName))
DeleteFile(descDirectoryPath + "\\" + sourceFileName);
//将檔案移動到指定目錄
File.Move(sourceFilePath, descDirectoryPath + "\\" + sourceFileName);
#region 從檔案的絕對路徑中擷取檔案名( 不包含擴充名 )
/// 從檔案的絕對路徑中擷取檔案名( 不包含擴充名 )
public static string GetFileNameNoExtension(string filePath)
return fi.Name.Split('.')[0];
#region 從檔案的絕對路徑中擷取擴充名
/// 從檔案的絕對路徑中擷取擴充名
public static string GetExtension(string filePath)
return fi.Extension;
#region 清空指定目錄
/// 清空指定目錄下所有檔案及子目錄,但該目錄依然儲存.
public static void ClearDirectory(string directoryPath)
if (IsExistDirectory(directoryPath))
//删除目錄中所有的檔案
for (int i = 0; i < fileNames.Length; i++)
DeleteFile(fileNames[i]);
//删除目錄中所有的子目錄
for (int i = 0; i < directoryNames.Length; i++)
DeleteDirectory(directoryNames[i]);
#region 清空檔案内容
/// 清空檔案内容
public static void ClearFile(string filePath)
//删除檔案
File.Delete(filePath);
//重新建立該檔案
CreateFile(filePath);
#region 删除指定目錄
/// 删除指定目錄及其所有子目錄
public static void DeleteDirectory(string directoryPath)
Directory.Delete(directoryPath, true);
}
}