Browse Source

#3498: WholeProjectDecompiler.SanitizeFileName needs to be applied before the a full path is constructed.

pull/3523/merge
Siegfried Pammer 5 months ago
parent
commit
fccd9e2b76
  1. 27
      ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs

27
ILSpy/Commands/ExtractPackageEntryContextMenuEntry.cs

@ -103,6 +103,22 @@ namespace ICSharpCode.ILSpy
return name; 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<SharpTreeNode> nodes, string path, bool isFile) internal static void Save(DockWorkspace dockWorkspace, IEnumerable<SharpTreeNode> nodes, string path, bool isFile)
{ {
dockWorkspace.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => { dockWorkspace.RunWithCancellation(ct => Task<AvalonEditTextOutput>.Factory.StartNew(() => {
@ -112,12 +128,12 @@ namespace ICSharpCode.ILSpy
{ {
if (node is AssemblyTreeNode { PackageEntry: { } assembly }) 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); SaveEntry(output, assembly, fileName);
} }
else if (node is ResourceTreeNode { Resource: PackageEntry { } resource }) 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); SaveEntry(output, resource, fileName);
} }
else if (node is PackageFolderTreeNode) else if (node is PackageFolderTreeNode)
@ -127,17 +143,17 @@ namespace ICSharpCode.ILSpy
{ {
if (item is AssemblyTreeNode { PackageEntry: { } asm }) 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); SaveEntry(output, asm, fileName);
} }
else if (item is ResourceTreeNode { Resource: PackageEntry { } entry }) 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); SaveEntry(output, entry, fileName);
} }
else if (item is PackageFolderTreeNode) 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) static void SaveEntry(ITextOutput output, PackageEntry entry, string targetFileName)
{ {
output.Write(entry.Name + ": "); output.Write(entry.Name + ": ");
targetFileName = WholeProjectDecompiler.SanitizeFileName(targetFileName);
using Stream stream = entry.TryOpenStream(); using Stream stream = entry.TryOpenStream();
if (stream == null) if (stream == null)
{ {

Loading…
Cancel
Save