Ich habe gerade herausgefunden, dass es dieses Forum gibt und es ist genau das, was ich brauchte. Ich habe gerade diese Frage zu Stack Overflow gestellt und nachdem ich die Antworten gelesen hatte, kam ein Code (nicht der, den ich dort gepostet habe, sondern der, den ich hier poste).
Dies ist zunächst mein Code, der durcheinander gebracht wird:
string tempFile = Path.GetTempFileName();
using (Stream tempFileStream = File.Open(tempFile, FileMode.Truncate))
{
SafeXmlSerializer xmlFormatter = new SafeXmlSerializer(typeof(Project));
xmlFormatter.Serialize(tempFileStream, Project);
}
if (File.Exists(fileName)) File.Delete(fileName);
File.Move(tempFile, fileName);
if (File.Exists(tempFile)) File.Delete(tempFile);
Beim Speichern in einer vorhandenen Datei, die sich in meiner Dropbox befindet, wird manchmal die Originaldatei gelöscht und die temporäre Datei an den ursprünglichen Speicherort in verschoben File.Move(tempFile, fileName);
. Also hier ist mein neuer Code, den ich meiner Meinung nach niemals tun sollte, wenn das Betriebssystem nicht selbstbewusst und böse geworden ist, die ursprüngliche Datei löschen, ohne die neue zu speichern. Das Schlimmste, was passieren kann, ist, dass das Original umbenannt wird und so bleibt, und ich muss den Benutzer darüber informieren (siehe MessageBox
unten):
private string GetTempFileName(string dir)
{
string name = null;
int attempts = 0;
do
{
name = "temp_" + Player.Math.RandomDigits(10) + ".hsp";
attempts++;
if (attempts > 10) throw new Exception("Could not create temporary file.");
}
while (File.Exists(Path.Combine(dir, name)));
return name;
}
private void TryToDelete(string path)
{
try { File.Delete(path); }
catch { }
}
private void SaveProject(string fileName)
{
bool originalRenamed = false;
string tempNewFile = null;
string oldFileTempName = null;
Exception exception = null;
try
{
tempNewFile = GetTempFileName(Path.GetDirectoryName(fileName));
using (Stream tempNewFileStream = File.Open(tempNewFile, FileMode.CreateNew))
{
SafeXmlSerializer xmlFormatter = new SafeXmlSerializer(typeof(Project));
xmlFormatter.Serialize(tempNewFileStream, Project);
}
if (File.Exists(fileName))
{
oldFileTempName = GetTempFileName(Path.GetDirectoryName(fileName));
File.Move(fileName, oldFileTempName);
originalRenamed = true;
}
File.Move(tempNewFile, fileName);
originalRenamed = false;
CurrentProjectPath = fileName;
}
catch (Exception ex)
{
exception = ex;
}
finally
{
if (tempNewFile != null) TryToDelete(tempNewFile);
if (originalRenamed)
{
try
{
File.Move(oldFileTempName, fileName);
originalRenamed = false;
}
catch { }
}
if (exception != null) MessageBox.Show(exception.Message);
if (originalRenamed)
{
MessageBox.Show("'" + fileName + "'" +
" have been corrupted or deleted in this operation.\n" +
"A backup copy have been created at '" + oldFileTempName + "'");
}
else if (oldFileTempName != null) TryToDelete(oldFileTempName);
}
}
Player.Math.RandomDigits
ist nur eine Funktion, die eine Zeichenfolge mit zufälligen Ziffern zurückgibt. Denken Sie, dass mein Code sicher ist, wie ich denke, oder fehlt mir etwas? Es ist schwer für mich, jede mögliche Ausnahme zu testen.