- tweak: refactor funny
This commit is contained in:
61
Nebula.Shared/FileApis/ZipFileApi.cs
Normal file
61
Nebula.Shared/FileApis/ZipFileApi.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO.Compression;
|
||||
using System.Runtime.InteropServices;
|
||||
using Robust.LoaderApi;
|
||||
|
||||
namespace Nebula.Shared.FileApis;
|
||||
|
||||
public sealed class ZipFileApi : IFileApi
|
||||
{
|
||||
private readonly ZipArchive _archive;
|
||||
private readonly string? _prefix;
|
||||
|
||||
public ZipFileApi(ZipArchive archive, string? prefix)
|
||||
{
|
||||
_archive = archive;
|
||||
_prefix = prefix;
|
||||
}
|
||||
|
||||
public bool TryOpen(string path, [NotNullWhen(true)] out Stream? stream)
|
||||
{
|
||||
var entry = _archive.GetEntry(_prefix != null ? _prefix + path : path);
|
||||
if (entry == null)
|
||||
{
|
||||
stream = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
stream = new MemoryStream();
|
||||
lock (_archive)
|
||||
{
|
||||
using var zipStream = entry.Open();
|
||||
zipStream.CopyTo(stream);
|
||||
}
|
||||
|
||||
stream.Position = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
public IEnumerable<string> AllFiles
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_prefix != null)
|
||||
return _archive.Entries
|
||||
.Where(e => e.Name != "" && e.FullName.StartsWith(_prefix))
|
||||
.Select(e => e.FullName[_prefix.Length..]);
|
||||
return _archive.Entries
|
||||
.Where(e => e.Name != "")
|
||||
.Select(entry => entry.FullName);
|
||||
}
|
||||
}
|
||||
|
||||
public static ZipFileApi FromPath(string path)
|
||||
{
|
||||
var zipArchive = new ZipArchive(File.OpenRead(path), ZipArchiveMode.Read);
|
||||
|
||||
var prefix = "";
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) prefix = "Space Station 14.app/Contents/Resources/";
|
||||
return new ZipFileApi(zipArchive, prefix);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user