diff --git a/src/LibraryManager.Build/Contracts/HostInteraction.cs b/src/LibraryManager.Build/Contracts/HostInteraction.cs index 48eec4a76..61b835bdc 100644 --- a/src/LibraryManager.Build/Contracts/HostInteraction.cs +++ b/src/LibraryManager.Build/Contracts/HostInteraction.cs @@ -83,7 +83,7 @@ public async Task CopyFileAsync(string sourcePath, string destinationPath, throw new UnauthorizedAccessException(); } - bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, cancellationToken); + bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, Logger, cancellationToken); if (result) { Logger.Log(string.Format(Resources.Text.FileWrittenToDisk, destinationPath.Replace('\\', '/')), LogLevel.Operation); diff --git a/src/LibraryManager.Contracts/FileHelpers.cs b/src/LibraryManager.Contracts/FileHelpers.cs index 3d58e5d86..818346fd6 100644 --- a/src/LibraryManager.Contracts/FileHelpers.cs +++ b/src/LibraryManager.Contracts/FileHelpers.cs @@ -136,23 +136,28 @@ public static Task ReadFileAsStreamAsync(string fileName, CancellationTo /// /// Full path to the source file /// Full path to the destination file + /// Pass logger to log errors. /// Cancellation token /// A boolean indicating whether the file was copied successfully - public static async Task CopyFileAsync(string sourceFile, string destinationFile, CancellationToken cancellationToken) + public static async Task CopyFileAsync(string sourceFile, string destinationFile, ILogger logger, CancellationToken cancellationToken) { - try + //Sometimes it flaky. Let's retry + for (int i=0; i<2;i++) { - using (FileStream sourceStream = File.Open(sourceFile, FileMode.Open, FileAccess.Read)) + try { + using FileStream sourceStream = File.Open(sourceFile, FileMode.Open, FileAccess.Read); + await WriteToFileAsync(destinationFile, sourceStream, cancellationToken); - } - return true; - } - catch (Exception) - { - return false; + return true; + } + catch (Exception exception) + { + logger.Log($"Error during copying file {exception}", LogLevel.Error); + } } + return false; } /// diff --git a/src/LibraryManager.Vsix/Contracts/HostInteraction.cs b/src/LibraryManager.Vsix/Contracts/HostInteraction.cs index 7f171c67e..9e6949ac4 100644 --- a/src/LibraryManager.Vsix/Contracts/HostInteraction.cs +++ b/src/LibraryManager.Vsix/Contracts/HostInteraction.cs @@ -121,7 +121,7 @@ public async Task CopyFileAsync(string sourcePath, string destinationPath, } await VsHelpers.CheckFileOutOfSourceControlAsync(absoluteDestinationPath); - bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, cancellationToken); + bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, Logger, cancellationToken); if (result) { diff --git a/src/libman/Contracts/HostInteraction.cs b/src/libman/Contracts/HostInteraction.cs index a56558625..cd2f82b49 100644 --- a/src/libman/Contracts/HostInteraction.cs +++ b/src/libman/Contracts/HostInteraction.cs @@ -108,7 +108,7 @@ public async Task CopyFileAsync(string sourcePath, string destinationPath, throw new UnauthorizedAccessException(); } - bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, cancellationToken); + bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, Logger, cancellationToken); if(result) { Logger.Log(string.Format(Resources.Text.FileWrittenToDisk, destinationPath.Replace('\\', '/')), LogLevel.Operation); diff --git a/test/LibraryManager.Mocks/HostInteraction.cs b/test/LibraryManager.Mocks/HostInteraction.cs index 1be9738c4..6e3d71c73 100644 --- a/test/LibraryManager.Mocks/HostInteraction.cs +++ b/test/LibraryManager.Mocks/HostInteraction.cs @@ -152,7 +152,7 @@ public async Task CopyFileAsync(string sourcePath, string destinationPath, throw new UnauthorizedAccessException(); } - bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, cancellationToken); + bool result = await FileHelpers.CopyFileAsync(sourcePath, absoluteDestinationPath, Logger, cancellationToken); return result; }