1
0
Fork 0
mirror of https://github.com/oMaN-Rod/nxDumpFuse.git synced 2024-11-22 18:26:40 +00:00

Catch fuse error if output file is already open by another process

This commit is contained in:
Omar 2021-11-02 14:00:12 -04:00
parent 21720adfae
commit e53e074ff6

View file

@ -122,48 +122,59 @@ namespace nxDumpFuse.Services
Log(FuseSimpleLogType.Information, $"Fusing {inputFiles.Count} parts to {_outputFilePath} ({totalFileLength.ToMb()}MB)"); Log(FuseSimpleLogType.Information, $"Fusing {inputFiles.Count} parts to {_outputFilePath} ({totalFileLength.ToMb()}MB)");
_sw.Start(); _sw.Start();
await using var outputStream = File.Create(_outputFilePath!); try
foreach (var inputFilePath in inputFiles)
{ {
if (_cts!.Token.IsCancellationRequested) return; await using var outputStream = File.Create(_outputFilePath!);
long currentBytes = 0; foreach (var inputFilePath in inputFiles)
int currentBlockSize;
long copySpeed = 0;
await using var inputStream = File.OpenRead(inputFilePath);
var fileLength = inputStream.Length;
Log(FuseSimpleLogType.Information, $"Fusing file part {++count}-> {inputFilePath} ({fileLength.ToMb()}MB)");
while ((currentBlockSize = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{ {
if (_cts.Token.IsCancellationRequested) return; if (_cts!.Token.IsCancellationRequested) return;
long currentBytes = 0;
int currentBlockSize;
long copySpeed = 0;
currentBytes += currentBlockSize; await using var inputStream = File.OpenRead(inputFilePath);
totalBytes += currentBlockSize; var fileLength = inputStream.Length;
try Log(FuseSimpleLogType.Information,
$"Fusing file part {++count}-> {inputFilePath} ({fileLength.ToMb()}MB)");
while ((currentBlockSize = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{ {
await outputStream.WriteAsync(buffer, 0, currentBlockSize, _cts.Token); if (_cts.Token.IsCancellationRequested) return;
}
catch (TaskCanceledException e)
{
Log(FuseSimpleLogType.Error, e.Message);
_sw.Stop();
Update(0,0,0,0,0,true);
return;
}
var progress = totalBytes * 100.0 / totalFileLength; currentBytes += currentBlockSize;
var progressPart = currentBytes * 100.0 / fileLength; totalBytes += currentBlockSize;
if(_sw.ElapsedMilliseconds >= 1000) copySpeed = totalBytes / _sw.ElapsedMilliseconds.ToSeconds();
Update(count, inputFiles.Count, progress, progressPart, copySpeed); try
{
await outputStream.WriteAsync(buffer, 0, currentBlockSize, _cts.Token);
}
catch (TaskCanceledException e)
{
Log(FuseSimpleLogType.Error, e.Message);
_sw.Stop();
Update(0, 0, 0, 0, 0, true);
return;
}
var progress = totalBytes * 100.0 / totalFileLength;
var progressPart = currentBytes * 100.0 / fileLength;
if (_sw.ElapsedMilliseconds >= 1000)
copySpeed = totalBytes / _sw.ElapsedMilliseconds.ToSeconds();
Update(count, inputFiles.Count, progress, progressPart, copySpeed);
}
} }
}
Log(FuseSimpleLogType.Information, $"Fuse Completed in {_sw.ElapsedMilliseconds.ToSeconds()}s"); Log(FuseSimpleLogType.Information, $"Fuse Completed in {_sw.ElapsedMilliseconds.ToSeconds()}s");
_sw.Stop(); _sw.Stop();
Update(0, 0, 0, 0, 0, true); Update(0, 0, 0, 0, 0, true);
}
catch (Exception e)
{
Log(FuseSimpleLogType.Error, e.Message);
_sw.Stop();
Update(0, 0, 0, 0, 0, true);
}
} }
} }
} }