diff --git a/ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs b/ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs index 26016a2b4..a09c41e23 100644 --- a/ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs +++ b/ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs @@ -103,6 +103,22 @@ namespace ICSharpCode.ILSpy return name; } + static string GetFileName(string path, bool isFile, SharpTreeNode containingNode, PackageEntry entry) + { + string fileName; + if (isFile) + { + fileName = path; + } + else + { + string relativePackagePath = WholeProjectDecompiler.SanitizeFileName(Path.Combine(GetPackageFolderPath(containingNode), entry.Name)); + fileName = Path.Combine(path, relativePackagePath); + } + + return fileName; + } + internal static void Save(DockWorkspace dockWorkspace, IEnumerable nodes, string path, bool isFile) { dockWorkspace.RunWithCancellation(ct => Task.Factory.StartNew(() => { @@ -112,12 +128,12 @@ namespace ICSharpCode.ILSpy { if (node is AssemblyTreeNode { PackageEntry: { } assembly }) { - string fileName = isFile ? path : Path.Combine(path, GetPackageFolderPath(node.Parent), assembly.Name); + string fileName = GetFileName(path, isFile, node.Parent, assembly); SaveEntry(output, assembly, fileName); } else if (node is ResourceTreeNode { Resource: PackageEntry { } resource }) { - string fileName = isFile ? path : Path.Combine(path, GetPackageFolderPath(node.Parent), resource.Name); + string fileName = GetFileName(path, isFile, node.Parent, resource); SaveEntry(output, resource, fileName); } else if (node is PackageFolderTreeNode) @@ -127,17 +143,17 @@ namespace ICSharpCode.ILSpy { if (item is AssemblyTreeNode { PackageEntry: { } asm }) { - string fileName = Path.Combine(path, GetPackageFolderPath(item.Parent), asm.Name); + string fileName = GetFileName(path, isFile, item.Parent, asm); SaveEntry(output, asm, fileName); } else if (item is ResourceTreeNode { Resource: PackageEntry { } entry }) { - string fileName = Path.Combine(path, GetPackageFolderPath(item.Parent), entry.Name); + string fileName = GetFileName(path, isFile, item.Parent, entry); SaveEntry(output, entry, fileName); } else if (item is PackageFolderTreeNode) { - Directory.CreateDirectory(Path.Combine(path, GetPackageFolderPath(item))); + Directory.CreateDirectory(Path.Combine(path, WholeProjectDecompiler.SanitizeFileName(GetPackageFolderPath(item)))); } } } @@ -154,7 +170,6 @@ namespace ICSharpCode.ILSpy static void SaveEntry(ITextOutput output, PackageEntry entry, string targetFileName) { output.Write(entry.Name + ": "); - targetFileName = WholeProjectDecompiler.SanitizeFileName(targetFileName); using Stream stream = entry.TryOpenStream(); if (stream == null) {