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
|
||||
_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);
|
||||
if (read != 1)
|
||||
{
|
||||
|
||||
@@ -174,8 +174,8 @@ namespace SabreTools.Helper
|
||||
try
|
||||
{
|
||||
// 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 (br.ReadUInt32() != Constants.CentralDirectoryHeaderSignature)
|
||||
{
|
||||
@@ -209,7 +209,7 @@ namespace SabreTools.Helper
|
||||
// Even more reading available information, skipping the unnecessary
|
||||
br.ReadUInt16(); // Disk number start
|
||||
_internalFileAttributes = (InternalFileAttributes)br.ReadUInt16();
|
||||
_externalFileAttributes = br.ReadUInt16();
|
||||
_externalFileAttributes = br.ReadUInt32();
|
||||
_relativeOffset = br.ReadUInt32();
|
||||
byte[] fileNameBytes = br.ReadBytes(fileNameLength);
|
||||
_fileName = ((_generalPurposeBitFlag & GeneralPurposeBitFlag.LanguageEncodingFlag) == 0
|
||||
@@ -280,7 +280,6 @@ namespace SabreTools.Helper
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return ZipReturn.ZipCentralDirError;
|
||||
|
||||
@@ -117,6 +117,7 @@ namespace SabreTools.Helper
|
||||
// Set internal variables
|
||||
Stream readStream = null;
|
||||
Stream writeStream = null;
|
||||
ZipFile oldZipFile = new ZipFile();
|
||||
ZipFile zipFile = new ZipFile();
|
||||
ZipReturn zipReturn = ZipReturn.ZipGood;
|
||||
|
||||
@@ -135,27 +136,35 @@ namespace SabreTools.Helper
|
||||
// Open or create the archive
|
||||
if (!File.Exists(archiveFileName))
|
||||
{
|
||||
zipReturn = zipFile.Create(archiveFileName);
|
||||
zipReturn = zipFile.Create(archiveFileName + ".new");
|
||||
}
|
||||
else
|
||||
{
|
||||
zipReturn = zipFile.Open(archiveFileName, new FileInfo(archiveFileName).LastWriteTime.Ticks, false);
|
||||
zipFile.ZipOpen = ZipOpenType.OpenWrite;
|
||||
}
|
||||
// Open the old archive for reading
|
||||
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();
|
||||
return success;
|
||||
// Instantiate the streams
|
||||
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);
|
||||
if (zipReturn != ZipReturn.ZipGood)
|
||||
{
|
||||
zipFile.Dispose();
|
||||
return success;
|
||||
}
|
||||
|
||||
// Copy the input stream to the output
|
||||
byte[] buffer = new byte[8 * 1024];
|
||||
@@ -186,8 +195,16 @@ namespace SabreTools.Helper
|
||||
finally
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user