diff --git a/Interfaces/IFileManager.cs b/Interfaces/IFileManager.cs index 2bcd60a..7b98484 100644 --- a/Interfaces/IFileManager.cs +++ b/Interfaces/IFileManager.cs @@ -19,5 +19,6 @@ public interface IFileManager void SelectMusicForGames(IEnumerable games); string SelectStartSoundForGame(Game game); void DeleteMusicDirectories(IEnumerable games); + void CreateSymLinks(); } } diff --git a/Services/Files/FileManager.cs b/Services/Files/FileManager.cs index 3d59180..ba4ba50 100644 --- a/Services/Files/FileManager.cs +++ b/Services/Files/FileManager.cs @@ -237,6 +237,48 @@ public void OpenGameDirectories(IEnumerable games) #endregion + [DllImport("kernel32.dll")] + static extern bool CreateSymbolicLinkA(string lpSymlinkFileName, string lpTargetFileName, SymbolicLink dwFlags); + + enum SymbolicLink + { + File = 0, + Directory = 1, + UnPrivileged = 2 + } + + public void CreateSymLinks() + { + foreach (var gameDir in Directory.GetDirectories(_pathingService.GameMusicFilePath)) + { + CreateSymLink(gameDir); + } + } + + public void CreateSymLink(string dir) + { + var musicDir = Path.Combine(dir, SoundDirectory.Music); + if (Directory.Exists(musicDir)) + { + var targetFiles = Directory.GetFiles(musicDir); + if (targetFiles.Any()) + { + var targetFile = targetFiles.First(); + var destination = Path.Combine(dir, "Music.mp3"); + + if (Directory.GetFiles(dir).Contains("Music.mp3")) + /* Then */ + Logger.Info($"Symlink in directory '{dir}' already exists"); + else if (!CreateSymbolicLinkA(destination, targetFile, SymbolicLink.UnPrivileged)) + { + Logger.Warn($"Failed to create symbolic link from '{targetFile}' to '{destination}'"); + } + } + else /* Then */ Logger.Info($"Directory '{musicDir}' does not contain music files"); + } + else /* Then */ Logger.Info($"Directory '{musicDir}' does not exist"); + } + #region Helpers private static IEnumerable SelectMusicForDirectory(string directory, IEnumerable files) diff --git a/Services/UI/MainMenuFactory.cs b/Services/UI/MainMenuFactory.cs index 2084e9a..4995537 100644 --- a/Services/UI/MainMenuFactory.cs +++ b/Services/UI/MainMenuFactory.cs @@ -40,6 +40,7 @@ public class MainMenuFactory : BaseMenuFactory, IMainMenuFactory ConstructMainMenuItem(Resource.ActionsOpenMusicFolder, _soundManager.OpenMusicFolder), ConstructMainMenuItem(Resource.ActionsOpenSoundsFolder, _soundManager.OpenSoundsFolder), ConstructMainMenuItem(Resource.ActionsHelp, _soundManager.HelpMenu), + ConstructMainMenuItem("Create Symbolic Links", _fileManager.CreateSymLinks), new MainMenuItem { Description = "-", MenuSection = App.MainMenuName }, ConstructMainMenuItem(Resource.ActionsCopySelectMusicFile, _fileManager.SelectMusicForDefault, "|" + Resource.ActionsDefault), });