using System.Collections; using System.IO; namespace Tede.Data.Tests.Utils { /// /// 封装操作文件夹代码的类 /// public static class DirectoryUtils { public static class AspnetClient { public const string DirectoryName = "aspnet_client"; } public static class WwwRoot { public const string DirectoryName = "wwwroot"; } public static class Site { public const string Include = "Include"; public const string Template = "Template"; public const string Content = "Content"; } public static class SiteServer { public const string DirectoryName = "SiteServer"; } public static class Home { public const string DirectoryName = "Home"; } public static class SiteFiles { public const string DirectoryName = "SiteFiles"; public const string BackupFiles = "BackupFiles"; public const string TemporaryFiles = "TemporaryFiles"; public const string SiteTemplates = "SiteTemplates"; public const string Plugins = "Plugins"; public const string Packages = "packages"; public const string Home = "Home"; public const string Administrators = "Administrators"; } public static class SiteTemplates { public const string DirectoryName = "SiteTemplates"; //文件夹 public const string SiteTemplateMetadata = "SiteTemplateMetadata"; //存储频道模板元数据的文件夹名称 public const string SiteContent = "SiteContent"; //频道内容导入导出临时文件夹名 public const string Table = "Table"; //辅助表导入导出临时文件夹名 public const string RelatedField = "RelatedField"; //关联字段导入导出临时文件夹名 //文件 public const string FileTemplate = "Template.xml"; //序列化模板的文件名 public const string FileMetadata = "Metadata.xml"; //频道模板元数据文件 public const string FileConfiguration = "Configuration.xml"; //站点配置 } public static char DirectorySeparatorChar = Path.DirectorySeparatorChar; public static void CreateDirectoryIfNotExists(string path) { var directoryPath = GetDirectoryPath(path); if (!IsDirectoryExists(directoryPath)) { try { Directory.CreateDirectory(directoryPath); } catch { //Scripting.FileSystemObject fso = new Scripting.FileSystemObjectClass(); //string[] directoryNames = directoryPath.Split('\\'); //string thePath = directoryNames[0]; //for (int i = 1; i < directoryNames.Length; i++) //{ // thePath = thePath + "\\" + directoryNames[i]; // if (StringUtils.Contains(thePath.ToLower(), ConfigUtils.Instance.PhysicalApplicationPath.ToLower()) && !IsDirectoryExists(thePath)) // { // fso.CreateFolder(thePath); // } //} } } } public static void Copy(string sourcePath, string targetPath) { Copy(sourcePath, targetPath, true); } public static void Copy(string sourcePath, string targetPath, bool isOverride) { if (!Directory.Exists(sourcePath)) return; CreateDirectoryIfNotExists(targetPath); var directoryInfo = new DirectoryInfo(sourcePath); foreach (var fileSystemInfo in directoryInfo.GetFileSystemInfos()) { var destPath = Path.Combine(targetPath, fileSystemInfo.Name); if (fileSystemInfo is FileInfo) { FileUtils.CopyFile(fileSystemInfo.FullName, destPath, isOverride); } else if (fileSystemInfo is DirectoryInfo) { Copy(fileSystemInfo.FullName, destPath, isOverride); } } } /// /// 验证此字符串是否合作作为文件夹名称 /// public static bool IsDirectoryNameCompliant(string directoryName) { if (string.IsNullOrEmpty(directoryName)) return false; return -1 == directoryName.IndexOfAny(PathUtils.InvalidPathChars); } /// /// 获取文件的文件夹路径,如果path为文件夹,返回自身。 /// /// 文件路径 /// public static string GetDirectoryPath(string path) { var ext = Path.GetExtension(path); var directoryPath = !string.IsNullOrEmpty(ext) ? Path.GetDirectoryName(path) : path; return directoryPath; } public static string GetParentPath(string path, int upLevel = 1) { if (upLevel < 1) return path; for (var i = 0; i < upLevel; i++) { path = Directory.GetParent(path).FullName; } return path; } public static bool IsDirectoryExists(string directoryPath) { return Directory.Exists(directoryPath); } public static bool IsInDirectory(string parentDirectoryPath, string path) { if (string.IsNullOrEmpty(parentDirectoryPath) || string.IsNullOrEmpty(path)) return false; parentDirectoryPath = parentDirectoryPath.Trim().TrimEnd(Path.DirectorySeparatorChar).ToLower(); path = path.Trim().TrimEnd(Path.DirectorySeparatorChar).ToLower(); return parentDirectoryPath == path || path.StartsWith(parentDirectoryPath); } public static void MoveDirectory(string srcDirectoryPath, string destDirectoryPath, bool isOverride) { //如果提供的路径中不存在末尾分隔符,则添加末尾分隔符。 if (!srcDirectoryPath.EndsWith(Path.DirectorySeparatorChar.ToString())) { srcDirectoryPath += Path.DirectorySeparatorChar; } if (!destDirectoryPath.EndsWith(Path.DirectorySeparatorChar.ToString())) { destDirectoryPath += Path.DirectorySeparatorChar; } //如果目标目录不存在,则予以创建。 CreateDirectoryIfNotExists(destDirectoryPath); //从当前父目录中获取目录列表。 foreach (var srcDir in Directory.GetDirectories(srcDirectoryPath)) { var directoryName = PathUtils.GetDirectoryName(srcDir, false); var destDir = destDirectoryPath + directoryName; //如果该目录不存在,则创建该目录。 CreateDirectoryIfNotExists(destDir); //由于我们处于递归模式下,因此还要复制子目录 MoveDirectory(srcDir, destDir, isOverride); } //从当前父目录中获取文件。 foreach (var srcFile in Directory.GetFiles(srcDirectoryPath)) { var srcFileInfo = new FileInfo(srcFile); var destFileInfo = new FileInfo(srcFile.Replace(srcDirectoryPath, destDirectoryPath)); //如果文件不存在,则进行复制。 var isExists = destFileInfo.Exists; if (isOverride) { if (isExists) { FileUtils.DeleteFileIfExists(destFileInfo.FullName); } FileUtils.CopyFile(srcFileInfo.FullName, destFileInfo.FullName); } else if (!isExists) { FileUtils.CopyFile(srcFileInfo.FullName, destFileInfo.FullName); } } } public static string[] GetDirectoryNames(string directoryPath) { var directorys = Directory.GetDirectories(directoryPath); var retval = new string[directorys.Length]; var i = 0; foreach (var directory in directorys) { var directoryInfo = new DirectoryInfo(directory); retval[i++] = directoryInfo.Name; } return retval; } public static ArrayList GetLowerDirectoryNames(string directoryPath) { var arraylist = new ArrayList(); var directorys = Directory.GetDirectories(directoryPath); foreach (var directory in directorys) { var directoryInfo = new DirectoryInfo(directory); arraylist.Add(directoryInfo.Name.ToLower()); } return arraylist; } public static string[] GetFileNames(string directoryPath) { var filePaths = Directory.GetFiles(directoryPath); var retval = new string[filePaths.Length]; var i = 0; foreach (var filePath in filePaths) { var fileInfo = new FileInfo(filePath); retval[i++] = fileInfo.Name; } return retval; } /// /// 删除文件夹 /// /// 文件夹路径 /// 删除过程中是否出错 public static bool DeleteDirectoryIfExists(string directoryPath) { var retval = true; try { if (IsDirectoryExists(directoryPath)) { Directory.Delete(directoryPath, true); } } catch { retval = false; } return retval; } public static void DeleteFilesSync(string rootDirectoryPath, string syncDirectoryPath) { if (IsDirectoryExists(syncDirectoryPath)) { var directoryInfo = new DirectoryInfo(syncDirectoryPath); foreach (var fileSystemInfo in directoryInfo.GetFileSystemInfos()) { var fileSystemPath = PathUtils.Combine(rootDirectoryPath, fileSystemInfo.Name); if (fileSystemInfo is FileInfo) { try { FileUtils.DeleteFileIfExists(fileSystemPath); } catch { // ignored } } else if (fileSystemInfo is DirectoryInfo) { DeleteFilesSync(fileSystemPath, fileSystemInfo.FullName); DeleteEmptyDirectory(fileSystemPath); } } } } public static void DeleteEmptyDirectory(string directoryPath) { var directoryInfo = new DirectoryInfo(directoryPath); if (directoryInfo.Exists) { if (directoryInfo.GetFileSystemInfos().Length == 0) { try { DeleteDirectoryIfExists(directoryPath); } catch { // ignored } } } } public static void CreateUrlRedirectDirectory(string sourceUrlRedirectFilePath, string directoryPath) { CreateDirectoryIfNotExists(directoryPath); var filePath = PathUtils.Combine(directoryPath, "default.aspx"); if (!FileUtils.IsFileExists(filePath)) { FileUtils.CopyFile(sourceUrlRedirectFilePath, filePath); } } public static string[] GetDirectoryPaths(string directoryPath) { CreateDirectoryIfNotExists(directoryPath); return Directory.GetDirectories(directoryPath); } public static string[] GetDirectoryPaths(string directoryPath, string searchPattern) { CreateDirectoryIfNotExists(directoryPath); return Directory.GetDirectories(directoryPath, searchPattern); } public static string[] GetFilePaths(string directoryPath) { return Directory.GetFiles(directoryPath); } public static long GetDirectorySize(string directoryPath) { long size = 0; var filePaths = GetFilePaths(directoryPath); //通过GetFiles方法,获取目录中所有文件的大小 foreach (var filePath in filePaths) { var info = new FileInfo(filePath); size += info.Length; } var directoryPaths = GetDirectoryPaths(directoryPath); //获取目录下所有文件夹大小,并存到一个新的对象数组中 foreach (var path in directoryPaths) { size += GetDirectorySize(path); } return size; } } }