Enhanced IO issue handling when generating output
This commit is contained in:
parent
53f98d4e3c
commit
a19ad7dcdb
@ -8,17 +8,27 @@ public class DotnetBigFile : IGenerator
|
|||||||
private static readonly List<string> CULTURE_CODES = new();
|
private static readonly List<string> CULTURE_CODES = new();
|
||||||
private static int DEFAULT_CULTURE_INDEX = -1;
|
private static int DEFAULT_CULTURE_INDEX = -1;
|
||||||
|
|
||||||
public async Task GenerateAsync()
|
public async Task<ProcessorResult<long>> GenerateAsync()
|
||||||
{
|
{
|
||||||
const string filename = "I18N.cs";
|
const string filename = "I18N.cs";
|
||||||
|
|
||||||
var destPath = await AppSettings.GetGeneratorDotnetDestinationPath();
|
var destPath = await AppSettings.GetGeneratorDotnetDestinationPath();
|
||||||
destPath = Environment.ExpandEnvironmentVariables(destPath);
|
destPath = Environment.ExpandEnvironmentVariables(destPath);
|
||||||
|
long destBytesWritten = 0;
|
||||||
|
|
||||||
var pathFinal = Path.Join(destPath, filename);
|
var pathFinal = Path.Join(destPath, filename);
|
||||||
var pathTemp = Path.Join(destPath, filename + ".gen");
|
var pathTemp = Path.Join(destPath, filename + ".gen");
|
||||||
|
var issueFinal = string.Empty;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
if(File.Exists(pathTemp))
|
if(File.Exists(pathTemp))
|
||||||
File.Delete(pathTemp);
|
File.Delete(pathTemp);
|
||||||
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
return new ProcessorResult<long>(0, false, $"Cannot delete the temporary file: '{e.Message}'. Hint: Is the ransomware protection enabled in your Windows system? If so, please make sure that the I18N Commander has write permission.");
|
||||||
|
}
|
||||||
|
|
||||||
CULTURE_CODES.Clear();
|
CULTURE_CODES.Clear();
|
||||||
var cultures = await AppSettings.GetCultureInfos();
|
var cultures = await AppSettings.GetCultureInfos();
|
||||||
@ -49,17 +59,41 @@ public class DotnetBigFile : IGenerator
|
|||||||
await this.TransformSection(writer, indention, section);
|
await this.TransformSection(writer, indention, section);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
// Happens, e.g. when the ransomware protection on Windows is active and
|
||||||
|
// the I18N commander is not on the exclusion list.
|
||||||
|
return new ProcessorResult<long>(0, false, $"Cannot write the generator's result file: '{e.Message}'. Hint: Is the ransomware protection enabled in your Windows system? If so, please make sure that the I18N Commander has write permission.");
|
||||||
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
if(new FileInfo(pathTemp).Length > 0)
|
if (File.Exists(pathTemp))
|
||||||
|
{
|
||||||
|
destBytesWritten = new FileInfo(pathTemp).Length;
|
||||||
|
if (destBytesWritten > 0)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
if (File.Exists(pathFinal))
|
if (File.Exists(pathFinal))
|
||||||
File.Delete(pathFinal);
|
File.Delete(pathFinal);
|
||||||
|
|
||||||
File.Move(pathTemp, pathFinal);
|
File.Move(pathTemp, pathFinal);
|
||||||
}
|
}
|
||||||
|
catch (IOException e)
|
||||||
|
{
|
||||||
|
// Happens when the file is still in use by the compiler, the IDE, etc.
|
||||||
|
// Depends on the timing, this happens sometimes. We ignore it, though.
|
||||||
|
issueFinal = e.Message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(string.IsNullOrWhiteSpace(issueFinal))
|
||||||
|
return new ProcessorResult<long>(destBytesWritten, true, string.Empty);
|
||||||
|
else
|
||||||
|
return new ProcessorResult<long>(0, false, $"Cannot move the generator's result file to the destination: '{issueFinal}'. Hint: Is the ransomware protection enabled in your Windows system? If so, please make sure that the I18N Commander has write permission.");
|
||||||
|
}
|
||||||
|
|
||||||
private string AddIndention(int indention) => new string(' ', indention * 3);
|
private string AddIndention(int indention) => new string(' ', indention * 3);
|
||||||
|
|
||||||
|
@ -12,15 +12,30 @@ public static class Generator
|
|||||||
_ => VOID_GENERATOR,
|
_ => VOID_GENERATOR,
|
||||||
};
|
};
|
||||||
|
|
||||||
public static async Task TriggerAllAsync()
|
public static async Task<ProcessorResult<long>> TriggerAllAsync()
|
||||||
{
|
{
|
||||||
var dotnetEnabled = await AppSettings.GetGeneratorDotnetEnabled();
|
var dotnetEnabled = await AppSettings.GetGeneratorDotnetEnabled();
|
||||||
var godotEnabled = await AppSettings.GetGeneratorGodotEnabled();
|
var godotEnabled = await AppSettings.GetGeneratorGodotEnabled();
|
||||||
|
long bytesWritten = 0;
|
||||||
|
|
||||||
if (dotnetEnabled)
|
if (dotnetEnabled)
|
||||||
await Generator.Get(Type.DOTNET).GenerateAsync();
|
{
|
||||||
|
var result = await Generator.Get(Type.DOTNET).GenerateAsync();
|
||||||
|
if(!result.Successful)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
bytesWritten += result.Result;
|
||||||
|
}
|
||||||
|
|
||||||
if(godotEnabled)
|
if(godotEnabled)
|
||||||
await Generator.Get(Type.GODOT).GenerateAsync();
|
{
|
||||||
|
var result = await Generator.Get(Type.GODOT).GenerateAsync();
|
||||||
|
if(!result.Successful)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
bytesWritten += result.Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ProcessorResult<long>(bytesWritten);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
public interface IGenerator
|
public interface IGenerator
|
||||||
{
|
{
|
||||||
public Task GenerateAsync();
|
public Task<ProcessorResult<long>> GenerateAsync();
|
||||||
}
|
}
|
@ -331,7 +331,9 @@ public partial class SectionTree : UserControl
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.buttonGenerate.Enabled = false;
|
this.buttonGenerate.Enabled = false;
|
||||||
await Generator.TriggerAllAsync();
|
var result = await Generator.TriggerAllAsync();
|
||||||
|
result.ProcessError();
|
||||||
|
|
||||||
this.buttonGenerate.Enabled = true;
|
this.buttonGenerate.Enabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -6,7 +6,8 @@ public static class ExtensionsError
|
|||||||
{
|
{
|
||||||
public static void ProcessError<TResult>(this ProcessorResult<TResult> result)
|
public static void ProcessError<TResult>(this ProcessorResult<TResult> result)
|
||||||
{
|
{
|
||||||
if (result.Successful) return;
|
if (result.Successful)
|
||||||
|
return;
|
||||||
|
|
||||||
MessageBox.Show(result.ErrorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
MessageBox.Show(result.ErrorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user