mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
Use temp file during rebuilding sometimes
This commit is contained in:
@@ -410,7 +410,7 @@ namespace SabreTools.DatTools
|
|||||||
string crc = (datItem as Rom)!.GetStringFieldValue(Models.Metadata.Rom.CRCKey) ?? string.Empty;
|
string crc = (datItem as Rom)!.GetStringFieldValue(Models.Metadata.Rom.CRCKey) ?? string.Empty;
|
||||||
|
|
||||||
// Try to get the stream for the file
|
// Try to get the stream for the file
|
||||||
if (!GetFileStream(datItem, file, isZip, out Stream? fileStream))
|
if (!GetFileStream(datItem, file, isZip, out Stream? fileStream) || fileStream == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// If either we have duplicates or we're filtering
|
// If either we have duplicates or we're filtering
|
||||||
@@ -425,6 +425,25 @@ namespace SabreTools.DatTools
|
|||||||
if (RebuildTorrentXz(datFile, datItem, file, outDir, outputFormat, isZip))
|
if (RebuildTorrentXz(datFile, datItem, file, outDir, outputFormat, isZip))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// If there is more than one dupe, write to a temporary file and use that stream instead
|
||||||
|
string? tempFile = null;
|
||||||
|
if (dupes.Count > 1)
|
||||||
|
{
|
||||||
|
tempFile = Path.Combine(outDir, $"tmp{System.Guid.NewGuid()}");
|
||||||
|
Stream tempStream = System.IO.File.Open(tempFile, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
|
||||||
|
byte[] tempBuffer = new byte[4096 * 128];
|
||||||
|
int zlen;
|
||||||
|
while ((zlen = fileStream.Read(tempBuffer, 0, tempBuffer.Length)) > 0)
|
||||||
|
{
|
||||||
|
tempStream.Write(tempBuffer, 0, zlen);
|
||||||
|
tempStream.Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
fileStream.Dispose();
|
||||||
|
fileStream = tempStream;
|
||||||
|
fileStream.Seek(0, SeekOrigin.Begin);
|
||||||
|
}
|
||||||
|
|
||||||
logger.User($"{(inverse ? "No matches" : "Matches")} found for '{Path.GetFileName(datItem.GetName() ?? datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>().AsStringValue())}', rebuilding accordingly...");
|
logger.User($"{(inverse ? "No matches" : "Matches")} found for '{Path.GetFileName(datItem.GetName() ?? datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>().AsStringValue())}', rebuilding accordingly...");
|
||||||
rebuilt = true;
|
rebuilt = true;
|
||||||
|
|
||||||
@@ -459,7 +478,11 @@ namespace SabreTools.DatTools
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Close the input stream
|
// Close the input stream
|
||||||
fileStream?.Dispose();
|
fileStream.Dispose();
|
||||||
|
|
||||||
|
// Delete the file if a temp file was created
|
||||||
|
if (tempFile != null && System.IO.File.Exists(tempFile))
|
||||||
|
System.IO.File.Delete(tempFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now we want to take care of headers, if applicable
|
// Now we want to take care of headers, if applicable
|
||||||
@@ -748,8 +771,6 @@ namespace SabreTools.DatTools
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// TODO: Write entry to a temporary file to avoid over-large in-memory streams
|
|
||||||
// TODO: Only write to file if there are multiple dupes
|
|
||||||
ItemType itemType = datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>();
|
ItemType itemType = datItem.GetStringFieldValue(Models.Metadata.DatItem.TypeKey).AsEnumValue<ItemType>();
|
||||||
(stream, _) = archive.GetEntryStream(datItem.GetName() ?? itemType.AsStringValue() ?? string.Empty);
|
(stream, _) = archive.GetEntryStream(datItem.GetName() ?? itemType.AsStringValue() ?? string.Empty);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -368,7 +368,9 @@ namespace SabreTools.FileTypes
|
|||||||
if (outputStream != null)
|
if (outputStream != null)
|
||||||
{
|
{
|
||||||
// Copy the input stream to the output
|
// Copy the input stream to the output
|
||||||
|
if (inputStream.CanSeek)
|
||||||
inputStream.Seek(0, SeekOrigin.Begin);
|
inputStream.Seek(0, SeekOrigin.Begin);
|
||||||
|
|
||||||
int bufferSize = 4096 * 128;
|
int bufferSize = 4096 * 128;
|
||||||
byte[] ibuffer = new byte[bufferSize];
|
byte[] ibuffer = new byte[bufferSize];
|
||||||
int ilen;
|
int ilen;
|
||||||
|
|||||||
Reference in New Issue
Block a user