Close file handles after validation and lazily open them as chunks are downloaded

pull/243/head
Ryan Kistner 4 years ago
parent 16b2f52b6f
commit bb778e3883

@ -1034,7 +1034,6 @@ namespace DepotDownloader
File.Delete(fileStagingPath); File.Delete(fileStagingPath);
} }
FileStream fs = null;
List<ProtoManifest.ChunkData> neededChunks; List<ProtoManifest.ChunkData> neededChunks;
var fi = new FileInfo(fileFinalPath); var fi = new FileInfo(fileFinalPath);
var fileDidExist = fi.Exists; var fileDidExist = fi.Exists;
@ -1043,7 +1042,7 @@ namespace DepotDownloader
Console.WriteLine("Pre-allocating {0}", fileFinalPath); Console.WriteLine("Pre-allocating {0}", fileFinalPath);
// create new file. need all chunks // create new file. need all chunks
fs = File.Create(fileFinalPath); using var fs = File.Create(fileFinalPath);
try try
{ {
fs.SetLength((long)file.TotalSize); fs.SetLength((long)file.TotalSize);
@ -1117,7 +1116,7 @@ namespace DepotDownloader
using (var fsOld = File.Open(fileStagingPath, FileMode.Open)) using (var fsOld = File.Open(fileStagingPath, FileMode.Open))
{ {
fs = File.Open(fileFinalPath, FileMode.Create); using var fs = File.Open(fileFinalPath, FileMode.Create);
try try
{ {
fs.SetLength((long)file.TotalSize); fs.SetLength((long)file.TotalSize);
@ -1147,7 +1146,7 @@ namespace DepotDownloader
{ {
// No old manifest or file not in old manifest. We must validate. // No old manifest or file not in old manifest. We must validate.
fs = File.Open(fileFinalPath, FileMode.Open); using var fs = File.Open(fileFinalPath, FileMode.Open);
if ((ulong)fi.Length != file.TotalSize) if ((ulong)fi.Length != file.TotalSize)
{ {
try try
@ -1172,8 +1171,6 @@ namespace DepotDownloader
Console.WriteLine("{0,6:#00.00}% {1}", (depotDownloadCounter.SizeDownloaded / (float)depotDownloadCounter.CompleteDownloadSize) * 100.0f, fileFinalPath); Console.WriteLine("{0,6:#00.00}% {1}", (depotDownloadCounter.SizeDownloaded / (float)depotDownloadCounter.CompleteDownloadSize) * 100.0f, fileFinalPath);
} }
if (fs != null)
fs.Dispose();
return; return;
} }
@ -1196,7 +1193,7 @@ namespace DepotDownloader
var fileStreamData = new FileStreamData var fileStreamData = new FileStreamData
{ {
fileStream = fs, fileStream = null,
fileLock = new SemaphoreSlim(1), fileLock = new SemaphoreSlim(1),
chunksToDownload = neededChunks.Count chunksToDownload = neededChunks.Count
}; };
@ -1290,6 +1287,12 @@ namespace DepotDownloader
{ {
await fileStreamData.fileLock.WaitAsync().ConfigureAwait(false); await fileStreamData.fileLock.WaitAsync().ConfigureAwait(false);
if (fileStreamData.fileStream == null)
{
var fileFinalPath = Path.Combine(depot.installDir, file.FileName);
fileStreamData.fileStream = File.Open(fileFinalPath, FileMode.Open);
}
fileStreamData.fileStream.Seek((long)chunkData.ChunkInfo.Offset, SeekOrigin.Begin); fileStreamData.fileStream.Seek((long)chunkData.ChunkInfo.Offset, SeekOrigin.Begin);
await fileStreamData.fileStream.WriteAsync(chunkData.Data, 0, chunkData.Data.Length); await fileStreamData.fileStream.WriteAsync(chunkData.Data, 0, chunkData.Data.Length);
} }
@ -1301,7 +1304,7 @@ namespace DepotDownloader
var remainingChunks = Interlocked.Decrement(ref fileStreamData.chunksToDownload); var remainingChunks = Interlocked.Decrement(ref fileStreamData.chunksToDownload);
if (remainingChunks == 0) if (remainingChunks == 0)
{ {
fileStreamData.fileStream.Dispose(); fileStreamData.fileStream?.Dispose();
fileStreamData.fileLock.Dispose(); fileStreamData.fileLock.Dispose();
} }

Loading…
Cancel
Save