use safe copy file on single file updating

This commit is contained in:
Pilzinsel64
2024-09-04 11:24:20 +02:00
parent 98d6d4d60a
commit 16a96329b5
2 changed files with 31 additions and 26 deletions

View File

@@ -190,7 +190,7 @@ public class UpdateClient(string updateUrl, AppVersion currentVersion, AppChanne
Utils.CopyFiles(dataPathDir, destDir); Utils.CopyFiles(dataPathDir, destDir);
} }
else if (package.UpdateType == UpdateType.File) else if (package.UpdateType == UpdateType.File)
File.Copy(dataPath, localInstallPath); Utils.CopyFile(new FileInfo(dataPath), new FileInfo(localInstallPath));
RaiseStatusChanged(UpdateStatus.Copying, UpdateStatusEvent.PostEvent); RaiseStatusChanged(UpdateStatus.Copying, UpdateStatusEvent.PostEvent);
// Delete Package // Delete Package

View File

@@ -10,6 +10,18 @@ public static class Utils
foreach (FileInfo sFile in sourceDir.EnumerateFiles("*", SearchOption.TopDirectoryOnly)) foreach (FileInfo sFile in sourceDir.EnumerateFiles("*", SearchOption.TopDirectoryOnly))
{ {
var dFile = new FileInfo(Path.Combine(destinationDir.FullName, sFile.Name)); var dFile = new FileInfo(Path.Combine(destinationDir.FullName, sFile.Name));
CopyFile(sFile, dFile);
}
foreach (DirectoryInfo sDir in sourceDir.EnumerateDirectories("*", SearchOption.TopDirectoryOnly))
{
var dDir = destinationDir.CreateSubdirectory(sDir.Name);
CopyFiles(sDir, dDir);
}
}
public static void CopyFile(FileInfo sourceFile, FileInfo destinationFile)
{
var triesLeft = 1; var triesLeft = 1;
while (triesLeft > 0) while (triesLeft > 0)
@@ -18,15 +30,15 @@ public static class Utils
try try
{ {
sFile.CopyTo(dFile.FullName, true); sourceFile.CopyTo(destinationFile.FullName, true);
} }
catch (IOException) catch (IOException)
{ {
if (triesLeft == 0 && File.Exists(dFile.FullName)) if (triesLeft == 0 && File.Exists(destinationFile.FullName))
{ {
var oldFile = dFile.FullName + ".old"; var oldFile = destinationFile.FullName + ".old";
File.Delete(oldFile); File.Delete(oldFile);
File.Move(dFile.FullName, oldFile, true); File.Move(destinationFile.FullName, oldFile, true);
File.Delete(oldFile); File.Delete(oldFile);
triesLeft++; triesLeft++;
} }
@@ -36,11 +48,4 @@ public static class Utils
} }
} }
} }
foreach (DirectoryInfo sDir in sourceDir.EnumerateDirectories("*", SearchOption.TopDirectoryOnly))
{
var dDir = destinationDir.CreateSubdirectory(sDir.Name);
CopyFiles(sDir, dDir);
}
}
} }