{"record":{"id":"e0a012145c49af09","repo":"JosefNemec/Playnite","slug":"theme-directory-outdir-already-exists","errorCode":null,"errorMessage":"Theme directory \"{outDir}\" already exists.","messagePattern":"Theme directory \"(.+?)\" already exists\\.","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"source/Tools/Playnite.Toolbox/Themes.cs","lineNumber":464,"sourceCode":"            {\r\n                foreach (var fontFile in Directory.GetFiles(modeFontDir))\r\n                {\r\n                    var targetPath = Path.Combine(outDir, \"Fonts\", Path.GetFileName(fontFile));\r\n                    FileSystem.CopyFile(fontFile, targetPath);\r\n                }\r\n            }\r\n\r\n            return defaultThemeXamlFiles;\r\n        }\r\n\r\n        public static string GenerateNewTheme(ApplicationMode mode, string themeName)\r\n        {\r\n            var themeDirName = Common.Paths.GetSafePathName(themeName).Replace(\" \", string.Empty);\r\n            var defaultThemeDir = Path.Combine(Paths.GetThemesPath(mode), \"Default\");\r\n            var outDir = Path.Combine(PlaynitePaths.ThemesProgramPath, mode.GetDescription(), themeDirName);\r\n            if (Directory.Exists(outDir))\r\n            {\r\n                throw new Exception($\"Theme directory \\\"{outDir}\\\" already exists.\");\r\n            }\r\n\r\n            FileSystem.CreateDirectory(outDir);\r\n            var defaultThemeXamlFiles = GenerateCommonThemeFiles(mode, outDir);\r\n            CopyThemeDirectory(defaultThemeDir, outDir, defaultThemeXamlFiles.Select(a => Path.Combine(defaultThemeDir, a)).ToList());\r\n\r\n            var themeDesc = new ThemeManifest()\r\n            {\r\n                Id = themeName + \"_\" + Guid.NewGuid().ToString(),\r\n                Author = \"Your Name Here\",\r\n                Name = themeName,\r\n                Version = \"1.0\",\r\n                Mode = mode,\r\n                ThemeApiVersion = ThemeManager.GetApiVersion(mode).ToString()\r\n            };\r\n\r\n            File.WriteAllText(Path.Combine(outDir, PlaynitePaths.ThemeManifestFileName), Serialization.ToYaml(themeDesc));\r\n            Explorer.NavigateToFileSystemEntry(Path.Combine(outDir, PlaynitePaths.ThemeSlnFileName));\r","sourceCodeStart":446,"sourceCodeEnd":482,"githubUrl":"https://github.com/JosefNemec/Playnite/blob/5911f4e964e628aa7a69c2030ab35101afa63067/source/Tools/Playnite.Toolbox/Themes.cs#L446-L482","documentation":"Thrown by Themes.GenerateNewTheme when the computed output directory already exists. outDir = ThemesProgramPath/<mode>/<safeThemeName>; Toolbox refuses to overwrite an existing theme folder to avoid clobbering prior work. The check is `Directory.Exists(outDir)` before any file is written.","triggerScenarios":"Running `Toolbox new DesktopTheme MyTheme` (or FullscreenTheme) when a folder of the same safe name already exists under the program themes path for that mode.","commonSituations":"Re-running `new` after a partial/aborted generation; choosing a theme name that collides with the Default or a previously created theme; spaces/uppercase normalized away by GetSafePathName causing an unexpected collision.","solutions":["Pick a different theme name that does not collide with an existing folder.","Delete or rename the existing outDir before regenerating.","Check Directory.Exists for the computed path first; note GetSafePathName strips spaces, so the on-disk name may differ from your input.","Back up the existing theme folder, remove it, then re-run `new`."],"exampleFix":"// before\n//   Toolbox new DesktopTheme My Theme   # 'MyTheme' folder exists\n\n// after\n//   either: rename the existing Themes/.../MyTheme folder\n//   or:     Toolbox new DesktopTheme MyThemeV2","handlingStrategy":"validation","validationCode":"if (Directory.Exists(outDir))\n    throw new InvalidOperationException($\"Theme directory already exists: {outDir}\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Compute the safe theme name first (GetSafePathName strips spaces) and check Directory.Exists before `new`.","Reuse a unique name or remove/rename the existing folder before regenerating.","Avoid re-running `new` against an aborted/partial generation without cleaning the output."],"tags":["themes","toolbox","scaffold","filesystem","precondition"],"backgroundTag":null,"analyzedSha":"5911f4e964e628aa7a69c2030ab35101afa63067","analyzedAt":"2026-08-13T17:38:25.713Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}