using SpaceEngineersBlueprintEditor.SpaceEngineersCore; using System.Diagnostics; using System.Drawing.Imaging; using System.Runtime.InteropServices; using VRage.FileSystem; namespace SpaceEngineersBlueprintEditor.Utilities.Helpers; /// /// 文件帮助类 /// public static class FileHelper { /// /// 获取文件夹大小 /// /// 文件夹信息 /// 文件夹大小 public static long GetDirectorySize(DirectoryInfo directoryInfo) { long size = 0; FileInfo[] files = directoryInfo.GetFiles(); foreach (FileInfo file in files) { size += file.Length; } DirectoryInfo[] directories = directoryInfo.GetDirectories(); foreach (DirectoryInfo directory in directories) { size += GetDirectorySize(directory); } return size; } /// /// 获取目标文件的复制名称 /// /// 目标文件原始名称 /// 当前递归层数 /// public static string GetCopyFileName(string originalName, int currentNum = 1) { var currentFileName = @$"{Path.GetDirectoryName(originalName)}\{Path.GetFileNameWithoutExtension(originalName)}_{currentNum}{Path.GetExtension(originalName)}"; if (File.Exists(currentFileName) || Directory.Exists(currentFileName)) return GetCopyFileName(originalName, ++currentNum); return currentFileName; } /// /// 获取目标文件夹的复制名称 /// /// 目标文件夹原始名称 /// 当前递归层数 /// public static string GetCopyDirectoryName(string originalName, int currentNum = 1) { var currentDirectoryName = @$"{Path.GetDirectoryName(originalName)}\{Path.GetFileName(originalName)}_{currentNum}"; if (File.Exists(currentDirectoryName) || Directory.Exists(currentDirectoryName)) return GetCopyDirectoryName(originalName, ++currentNum); return currentDirectoryName; } /// /// 复制整个文件及其子文件夹 /// /// 源文件夹 /// 目标文件夹 /// 覆盖 /// public static void CopyDirectory(string sourceDirectory, string targetDirectory, bool overwrite = false) { if (!Directory.Exists(sourceDirectory)) throw new DirectoryNotFoundException($"Can't find original directory: {sourceDirectory}"); if (!Directory.Exists(targetDirectory)) Directory.CreateDirectory(targetDirectory); foreach (string file in Directory.GetFiles(sourceDirectory)) { string targetFile = Path.Combine(targetDirectory, Path.GetFileName(file)); File.Copy(file, targetFile, overwrite); } foreach (string subDir in Directory.GetDirectories(sourceDirectory)) { string subDirectoryName = Path.GetFileName(subDir); string newTargetDirectory = Path.Combine(targetDirectory, subDirectoryName); CopyDirectory(subDir, newTargetDirectory, overwrite); } } /// /// 转为Bitmap /// /// DDS文件路径 /// 保存位置 public static void ToBitmap(string ddsFilePath, string savePath) { try { using var readStream = MyFileSystem.OpenRead(ddsFilePath); int width = -1; int height = -1; if (ImageConverter.TextureToRgbaBuffer(readStream, 0, ref width, ref height) is byte[] buffer) { var bitmap = new System.Drawing.Bitmap(width, height, PixelFormat.Format32bppArgb); var data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, bitmap.PixelFormat); Marshal.Copy(buffer, 0, data.Scan0, buffer.Length); bitmap.UnlockBits(data); bitmap.Save(savePath, ImageFormat.Png); } } catch (Exception ex) { Debug.WriteLine(ex.Message); } } /// /// 更改文件的拓展名 /// /// 文件路径 /// 目标扩展名 /// public static string ChangeExtension(string filePath, string extension) => @$"{Path.GetDirectoryName(filePath)}\{Path.GetFileNameWithoutExtension(filePath)}.{extension}"; /// /// 如果目标目录不存在则自动创建目录 /// /// 目标目录 /// 是否创建了新的目录 public static bool AutoCreateDirectory(string filePath) { if (Path.GetDirectoryName(filePath) is string directory && !Directory.Exists(directory)) { Directory.CreateDirectory(directory); return true; } return false; } }