using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using RainmeterStudio.Core.Model; namespace RainmeterStudio.Core.Utils { public static class DirectoryHelper { /// /// Gets a tree of the folder structure /// /// Folder /// A tree public static Reference GetFolderTree(string folder) { // Build tree object Reference refTree = new Reference(Path.GetFileName(folder), folder, ReferenceTargetKind.File); // Navigate folder structure if (Directory.Exists(folder)) { refTree.TargetKind = ReferenceTargetKind.Directory; foreach (var item in Directory.EnumerateDirectories(folder) .Concat(Directory.EnumerateFiles(folder))) { refTree.Add(GetFolderTree(item)); } } // Return tree return refTree; } /// /// Returns true if two paths are equal /// /// First path /// Second path /// True if the paths are equal public static bool PathsEqual(string path1, string path2) { path1 = System.IO.Path.GetFullPath(path1); path2 = System.IO.Path.GetFullPath(path2); return String.Equals(path1, path2, StringComparison.InvariantCultureIgnoreCase); } /// /// Copies a directory from source to destination /// /// Directory to copy /// Destination directory /// /// If destination exists, the contents of 'source' will be copied to destination. /// Else, destination will be created, and the contents of source will be copied to destination. public static void CopyDirectory(string source, string destination, bool merge = false) { if (source == destination) throw new IOException("You cannot copy a folder in the same folder."); if (Directory.Exists(destination) && !merge) throw new IOException("Destination folder already exists."); foreach (var file in Directory.EnumerateFiles(source, "*", SearchOption.AllDirectories)) { string newFile = file.StartsWith(source) ? Path.Combine(destination, file.Substring(source.Length).Trim('\\')) : file; string newDirectory = Path.GetDirectoryName(newFile); if (!String.IsNullOrEmpty(newDirectory) && !Directory.Exists(newDirectory)) Directory.CreateDirectory(newDirectory); File.Copy(file, newFile); } } } }