mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
[FileTools] More fiddling with Tzip
This commit is contained in:
@@ -397,7 +397,7 @@ namespace SabreTools.Helper
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Now try to open the file for reading
|
// Now try to open the file for reading
|
||||||
_zipstream = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite);
|
_zipstream = new FileStream(filename, FileMode.Open, FileAccess.Read);
|
||||||
int read = _zipstream.Read(new byte[1], 0, 1);
|
int read = _zipstream.Read(new byte[1], 0, 1);
|
||||||
if (read != 1)
|
if (read != 1)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -174,8 +174,8 @@ namespace SabreTools.Helper
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Open the stream for reading
|
// Open the stream for reading
|
||||||
using (BinaryReader br = new BinaryReader(_zipstream))
|
BinaryReader br = new BinaryReader(_zipstream);
|
||||||
{
|
|
||||||
// If the first bytes aren't a central directory header, log and return
|
// If the first bytes aren't a central directory header, log and return
|
||||||
if (br.ReadUInt32() != Constants.CentralDirectoryHeaderSignature)
|
if (br.ReadUInt32() != Constants.CentralDirectoryHeaderSignature)
|
||||||
{
|
{
|
||||||
@@ -209,7 +209,7 @@ namespace SabreTools.Helper
|
|||||||
// Even more reading available information, skipping the unnecessary
|
// Even more reading available information, skipping the unnecessary
|
||||||
br.ReadUInt16(); // Disk number start
|
br.ReadUInt16(); // Disk number start
|
||||||
_internalFileAttributes = (InternalFileAttributes)br.ReadUInt16();
|
_internalFileAttributes = (InternalFileAttributes)br.ReadUInt16();
|
||||||
_externalFileAttributes = br.ReadUInt16();
|
_externalFileAttributes = br.ReadUInt32();
|
||||||
_relativeOffset = br.ReadUInt32();
|
_relativeOffset = br.ReadUInt32();
|
||||||
byte[] fileNameBytes = br.ReadBytes(fileNameLength);
|
byte[] fileNameBytes = br.ReadBytes(fileNameLength);
|
||||||
_fileName = ((_generalPurposeBitFlag & GeneralPurposeBitFlag.LanguageEncodingFlag) == 0
|
_fileName = ((_generalPurposeBitFlag & GeneralPurposeBitFlag.LanguageEncodingFlag) == 0
|
||||||
@@ -280,7 +280,6 @@ namespace SabreTools.Helper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
return ZipReturn.ZipCentralDirError;
|
return ZipReturn.ZipCentralDirError;
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ namespace SabreTools.Helper
|
|||||||
// Set internal variables
|
// Set internal variables
|
||||||
Stream readStream = null;
|
Stream readStream = null;
|
||||||
Stream writeStream = null;
|
Stream writeStream = null;
|
||||||
|
ZipFile oldZipFile = new ZipFile();
|
||||||
ZipFile zipFile = new ZipFile();
|
ZipFile zipFile = new ZipFile();
|
||||||
ZipReturn zipReturn = ZipReturn.ZipGood;
|
ZipReturn zipReturn = ZipReturn.ZipGood;
|
||||||
|
|
||||||
@@ -135,27 +136,35 @@ namespace SabreTools.Helper
|
|||||||
// Open or create the archive
|
// Open or create the archive
|
||||||
if (!File.Exists(archiveFileName))
|
if (!File.Exists(archiveFileName))
|
||||||
{
|
{
|
||||||
zipReturn = zipFile.Create(archiveFileName);
|
zipReturn = zipFile.Create(archiveFileName + ".new");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
zipReturn = zipFile.Open(archiveFileName, new FileInfo(archiveFileName).LastWriteTime.Ticks, false);
|
// Open the old archive for reading
|
||||||
zipFile.ZipOpen = ZipOpenType.OpenWrite;
|
oldZipFile.Open(archiveFileName, new FileInfo(archiveFileName).LastWriteTime.Ticks, false);
|
||||||
}
|
zipFile.Create(archiveFileName + ".new");
|
||||||
|
|
||||||
if (zipReturn != ZipReturn.ZipGood)
|
// Copy over all files to the new archive
|
||||||
|
for (int i = 0; i < oldZipFile.EntriesCount; i++)
|
||||||
{
|
{
|
||||||
zipFile.Dispose();
|
// Instantiate the streams
|
||||||
return success;
|
CompressionMethod icompressionMethod = CompressionMethod.Stored;
|
||||||
|
ulong istreamSize = 0;
|
||||||
|
oldZipFile.OpenReadStream(i, true, out readStream, out istreamSize, out icompressionMethod);
|
||||||
|
zipFile.OpenWriteStream(true, true, oldZipFile.Filename(i), streamSize, CompressionMethod.Deflated, out writeStream);
|
||||||
|
|
||||||
|
// Copy the input stream to the output
|
||||||
|
byte[] ibuffer = new byte[8 * 1024];
|
||||||
|
int ilen;
|
||||||
|
while ((ilen = readStream.Read(ibuffer, 0, ibuffer.Length)) > 0)
|
||||||
|
{
|
||||||
|
writeStream.Write(ibuffer, 0, ilen);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open the stream for writing
|
// Now open the write stream for the new rom
|
||||||
zipReturn = zipFile.OpenWriteStream(false, true, rom.Name, streamSize, CompressionMethod.Deflated, out writeStream);
|
zipReturn = zipFile.OpenWriteStream(false, true, rom.Name, streamSize, CompressionMethod.Deflated, out writeStream);
|
||||||
if (zipReturn != ZipReturn.ZipGood)
|
|
||||||
{
|
|
||||||
zipFile.Dispose();
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy the input stream to the output
|
// Copy the input stream to the output
|
||||||
byte[] buffer = new byte[8 * 1024];
|
byte[] buffer = new byte[8 * 1024];
|
||||||
@@ -186,8 +195,16 @@ namespace SabreTools.Helper
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
zipFile.Dispose();
|
zipFile.Dispose();
|
||||||
|
oldZipFile.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the old file exists, delete it and replace
|
||||||
|
if (File.Exists(archiveFileName))
|
||||||
|
{
|
||||||
|
File.Delete(archiveFileName);
|
||||||
|
}
|
||||||
|
File.Move(archiveFileName + ".new", archiveFileName);
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user