using System; 
using System.IO; 
using System.Xml; 
  
namespace Test 
{ 
    /// <summary> 
    /// FileDirectoryUtility 類(lèi),方法不包含異常處理 
    /// </summary> 
    public class FileDirectoryUtility 
    { 
        /// <summary> 
        /// 路徑分割符 
        /// </summary> 
        private const string PATH_SPLIT_CHAR = "\\"; 
  
        /// <summary> 
        /// 構(gòu)造函數(shù) 
        /// </summary> 
        private FileDirectoryUtility() 
        { 
        } 
  
        /// <summary> 
        /// 復(fù)制指定目錄的所有文件,不包含子目錄及子目錄中的文件 
        /// </summary> 
        /// <param name="sourceDir">原始目錄</param> 
        /// <param name="targetDir">目標(biāo)目錄</param> 
        /// <param name="overWrite">如果為true,表示覆蓋同名文件,否則不覆蓋</param> 
        public static void CopyFiles(string sourceDir, string targetDir, bool overWrite) 
        { 
            CopyFiles(sourceDir, targetDir, overWrite, false); 
        } 
  
        /// <summary> 
        /// 復(fù)制指定目錄的所有文件 
        /// </summary> 
        /// <param name="sourceDir">原始目錄</param> 
        /// <param name="targetDir">目標(biāo)目錄</param> 
        /// <param name="overWrite">如果為true,覆蓋同名文件,否則不覆蓋</param> 
        /// <param name="copySubDir">如果為true,包含目錄,否則不包含</param> 
        public static void CopyFiles(string sourceDir, string targetDir, bool overWrite, bool copySubDir) 
        { 
            
            foreach (string sourceFileName in Directory.GetFiles(sourceDir)) 
            { 
                string targetFileName = Path.Combine(targetDir, sourceFileName.Substring(sourceFileName.LastIndexOf(PATH_SPLIT_CHAR) + 1)); 
  
                if (File.Exists(targetFileName)) 
                { 
                    if (overWrite == true) 
                    { 
                        File.SetAttributes(targetFileName, FileAttributes.Normal); 
                        File.Copy(sourceFileName, targetFileName, overWrite); 
                    } 
                } 
                else
                { 
                    File.Copy(sourceFileName, targetFileName, overWrite); 
                } 
            } 
            
            if (copySubDir) 
            { 
                foreach (string sourceSubDir in Directory.GetDirectories(sourceDir)) 
                { 
                    string targetSubDir = Path.Combine(targetDir, sourceSubDir.Substring(sourceSubDir.LastIndexOf(PATH_SPLIT_CHAR) + 1)); 
                    if (!Directory.Exists(targetSubDir)) 
                        Directory.CreateDirectory(targetSubDir); 
                    CopyFiles(sourceSubDir, targetSubDir, overWrite, true); 
                } 
            } 
        } 
  
        /// <summary> 
        /// 剪切指定目錄的所有文件,不包含子目錄 
        /// </summary> 
        /// <param name="sourceDir">原始目錄</param> 
        /// <param name="targetDir">目標(biāo)目錄</param> 
        /// <param name="overWrite">如果為true,覆蓋同名文件,否則不覆蓋</param> 
        public static void MoveFiles(string sourceDir, string targetDir, bool overWrite) 
        { 
            MoveFiles(sourceDir, targetDir, overWrite, false); 
        } 
  
        /// <summary> 
        /// 剪切指定目錄的所有文件 
        /// </summary> 
        /// <param name="sourceDir">原始目錄</param> 
        /// <param name="targetDir">目標(biāo)目錄</param> 
        /// <param name="overWrite">如果為true,覆蓋同名文件,否則不覆蓋</param> 
        /// <param name="moveSubDir">如果為true,包含目錄,否則不包含</param> 
        public static void MoveFiles(string sourceDir, string targetDir, bool overWrite, bool moveSubDir) 
        { 
            
            foreach (string sourceFileName in Directory.GetFiles(sourceDir)) 
            { 
                string targetFileName = Path.Combine(targetDir, sourceFileName.Substring(sourceFileName.LastIndexOf(PATH_SPLIT_CHAR) + 1)); 
                if (File.Exists(targetFileName)) 
                { 
                    if (overWrite == true) 
                    { 
                        File.SetAttributes(targetFileName, FileAttributes.Normal); 
                        File.Delete(targetFileName); 
                        File.Move(sourceFileName, targetFileName); 
                    } 
                } 
                else
                { 
                    File.Move(sourceFileName, targetFileName); 
                } 
            } 
            if (moveSubDir) 
            { 
                foreach (string sourceSubDir in Directory.GetDirectories(sourceDir)) 
                { 
                    string targetSubDir = Path.Combine(targetDir, sourceSubDir.Substring(sourceSubDir.LastIndexOf(PATH_SPLIT_CHAR) + 1)); 
                    if (!Directory.Exists(targetSubDir)) 
                        Directory.CreateDirectory(targetSubDir); 
                    MoveFiles(sourceSubDir, targetSubDir, overWrite, true); 
                    Directory.Delete(sourceSubDir); 
                } 
            } 
        } 
  
        /// <summary> 
        /// 刪除指定目錄的所有文件,不包含子目錄 
        /// </summary> 
        /// <param name="targetDir">操作目錄</param> 
        public static void DeleteFiles(string targetDir) 
        { 
            DeleteFiles(targetDir, false); 
        } 
  
        /// <summary> 
        /// 刪除指定目錄的所有文件和子目錄 
        /// </summary> 
        /// <param name="targetDir">操作目錄</param> 
        /// <param name="delSubDir">如果為true,包含對(duì)子目錄的操作</param> 
        public static void DeleteFiles(string targetDir, bool delSubDir) 
        { 
            foreach (string fileName in Directory.GetFiles(targetDir)) 
            { 
                File.SetAttributes(fileName, FileAttributes.Normal); 
                File.Delete(fileName); 
            } 
            if (delSubDir) 
            { 
                DirectoryInfo dir = new DirectoryInfo(targetDir); 
                foreach (DirectoryInfo subDi in dir.GetDirectories()) 
                { 
                    DeleteFiles(subDi.FullName, true); 
                    subDi.Delete(); 
                } 
            } 
        } 
  
        /// <summary> 
        /// 創(chuàng)建指定目錄 
        /// </summary> 
        /// <param name="targetDir"></param> 
        public static void CreateDirectory(string targetDir) 
        { 
            DirectoryInfo dir = new DirectoryInfo(targetDir); 
            if (!dir.Exists) 
                dir.Create(); 
        } 
  
        /// <summary> 
        /// 建立子目錄 
        /// </summary> 
        /// <param name="targetDir">目錄路徑</param> 
        /// <param name="subDirName">子目錄名稱</param> 
        public static void CreateDirectory(string parentDir, string subDirName) 
        { 
            CreateDirectory(parentDir + PATH_SPLIT_CHAR + subDirName); 
        } 
  
        /// <summary> 
        /// 刪除指定目錄 
        /// </summary> 
        /// <param name="targetDir">目錄路徑</param> 
        public static void DeleteDirectory(string targetDir) 
        { 
            DirectoryInfo dirInfo = new DirectoryInfo(targetDir); 
            if (dirInfo.Exists) 
            { 
                DeleteFiles(targetDir, true); 
                dirInfo.Delete(true); 
            } 
        } 
  
        /// <summary> 
        /// 刪除指定目錄的所有子目錄,不包括對(duì)當(dāng)前目錄文件的刪除 
        /// </summary> 
        /// <param name="targetDir">目錄路徑</param> 
        public static void DeleteSubDirectory(string targetDir) 
        { 
            foreach (string subDir in Directory.GetDirectories(targetDir)) 
            { 
                DeleteDirectory(subDir); 
            } 
        } 
  
        /// <summary> 
        /// 將指定目錄下的子目錄和文件生成xml文檔 
        /// </summary> 
        /// <param name="targetDir">根目錄</param> 
        /// <returns>返回XmlDocument對(duì)象</returns> 
        public static XmlDocument CreateXml(string targetDir) 
        { 
            XmlDocument myDocument = new XmlDocument(); 
            XmlDeclaration declaration = myDocument.CreateXmlDeclaration("1.0", "utf-8", null); 
            myDocument.AppendChild(declaration); 
            XmlElement rootElement = myDocument.CreateElement(targetDir.Substring(targetDir.LastIndexOf(PATH_SPLIT_CHAR) + 1)); 
            myDocument.AppendChild(rootElement); 
            foreach (string fileName in Directory.GetFiles(targetDir)) 
            { 
                XmlElement childElement = myDocument.CreateElement("File"); 
                childElement.InnerText = fileName.Substring(fileName.LastIndexOf(PATH_SPLIT_CHAR) + 1); 
                rootElement.AppendChild(childElement); 
            } 
            foreach (string directory in Directory.GetDirectories(targetDir)) 
            { 
                XmlElement childElement = myDocument.CreateElement("Directory"); 
                childElement.SetAttribute("Name", directory.Substring(directory.LastIndexOf(PATH_SPLIT_CHAR) + 1)); 
                rootElement.AppendChild(childElement); 
                CreateBranch(directory, childElement, myDocument); 
            } 
            return myDocument; 
        } 
  
        /// <summary> 
        /// 生成Xml分支 
        /// </summary> 
        /// <param name="targetDir">子目錄</param> 
        /// <param name="xmlNode">父目錄XmlDocument</param> 
        /// <param name="myDocument">XmlDocument對(duì)象</param> 
        private static void CreateBranch(string targetDir, XmlElement xmlNode, XmlDocument myDocument) 
        { 
            foreach (string fileName in Directory.GetFiles(targetDir)) 
            { 
                XmlElement childElement = myDocument.CreateElement("File"); 
                childElement.InnerText = fileName.Substring(fileName.LastIndexOf(PATH_SPLIT_CHAR) + 1); 
                xmlNode.AppendChild(childElement); 
            } 
            foreach (string directory in Directory.GetDirectories(targetDir)) 
            { 
                XmlElement childElement = myDocument.CreateElement("Directory"); 
                childElement.SetAttribute("Name", directory.Substring(directory.LastIndexOf(PATH_SPLIT_CHAR) + 1)); 
                xmlNode.AppendChild(childElement); 
                CreateBranch(directory, childElement, myDocument); 
            } 
        } 
    } 
}