Ich habe an einem Programm zur Archivierung alter Kundendaten für das Unternehmen gearbeitet, für das ich arbeite. Das Programm kopiert die Daten vom Arbeitsserver auf den lokalen Rechner, erstellt eine .zip-Datei mit allen Daten und kopiert sie dann auf den Archivserver.
Danach löscht es die Originaldateien und die lokalen Kopien. Hin und wieder kommt es zu Fehlern, weil das Programm die lokalen Kopien nicht von meinem Computer löschen kann. Es gibt nicht bei jedem Ordner, den es zippt, einen Fehler. Es tritt ein Fehler auf, wenn ich 300 Dateien gezippt habe, oder nach 5. Es gibt eine der 3 folgenden Fehlermeldungen aus: "Das Verzeichnis ist nicht leer", "Die Datei wird von einem anderen Prozess verwendet" oder "Der Zugriff auf die Datei wird verweigert". Ich habe versucht, die Dateiattribute auf normal einzustellen, eine erzwungene Garbage Collection zu verwenden und den Winzip-Prozess manuell zu beenden.
Ich verstehe wirklich nicht, warum das nur manchmal der Fall ist. Ich bin der Administrator auf meinem Computer, und er sollte in der Lage sein, die Dateien zu löschen. Ich habe mir gedacht, dass es von etwas anderem verwendet werden muss, aber auf meinem Rechner sollte es außer dem Programm in Visual Studio von nichts anderem verwendet werden. Ich danke Ihnen.
Nachfolgend finden Sie die Bereinigungsmethode, bei der die Dateien nicht gelöscht werden, und die Methode, bei der die Dateien gezippt werden.
[MethodImplAttribute(MethodImplOptions.NoInlining)]
static void CleanUp(SqlConnection Connection, string jNumber, DirectoryInfo dir, bool error, string prefix)
{
if (!error | (!error & emptyFolder))
{
try
{
SqlCommand updateJob = new SqlCommand(string.Format("update job set archived = 1 where job = {0}", jNumber), sdiConnection);
updateJob.ExecuteNonQuery();
}
catch
{
WriteToLog("SQL Error: " + jNumber, "There was an error changing the archive bit to 1 after the job has been archived");
}
try
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
catch
{
WriteToLog("Error cleaning up after processing job", "There was an error garbage collecting.");
}
try
{
//path of the temporary folder created by the program
string tempDir = Path.Combine(Path.Combine(System.Environment.CurrentDirectory, "Temp"), jNumber);
//path of the destination folder
string destDir = Path.Combine(dir.ToString(), jNumber);
//SetFileAttributes(tempDir);
try
{
File.Delete(tempDir + ".zip");
}
catch (System.IO.IOException)
{
File.Delete(tempDir + ".zip");
}
try
{
Directory.Delete(destDir, true);
}
catch (System.IO.IOException)
{
Directory.Delete(destDir, true);
}
try
{
Directory.Delete(tempDir, true);
}
catch (System.IO.IOException)
{
Directory.Delete(tempDir, true);
}
}
catch
{
WriteToLog("File Error: " + jNumber, "There was an error removing files and/or folders after the job has been archived. Please check the source server and destination server to make sure everything copied correctly. The archive bit for this job was set.");
Directory.Delete(Path.Combine(System.Environment.CurrentDirectory, "Temp"), true);
Directory.CreateDirectory(Path.Combine(System.Environment.CurrentDirectory, "Temp"));
}
}
static bool ZipJobFolder(string jNumber, string jPath)
{
try
{
string CommandStr = @"L:\ZipFiles\winzip32.exe";
string parameters = "-min -a -r \"" + jNumber + "\" \"" + jPath + "\"";
ProcessStartInfo starter = new ProcessStartInfo(CommandStr, parameters);
starter.CreateNoWindow = true;
starter.RedirectStandardOutput = false;
starter.UseShellExecute = false;
Process process = new Process();
process.StartInfo = starter;
Console.WriteLine("Creating .zip file");
process.Start();
process.WaitForExit();
Process[] processes;
string procName = "winzip32.exe";
processes = Process.GetProcessesByName(procName);
foreach (Process proc in processes)
{
Console.WriteLine("Closing WinZip Process...");
proc.Kill();
}
}
catch
{
WriteToLog(jNumber, "There was error zipping the files of this job");
return false;
}
return true;
}