Hallo zusammen,
leider habe ich nichts passendes zu meinem Problem gefunden. Mein Problem ist, das mein Kopiervorgang sehr sehr langsam ist und ich mich jetzt frage, ob sich das den nicht beschleunigen lässt.
In meinem Test habe ich 12 GB von einer externen HDD (USB 2.0) auf ein lokales Verzeichnis kopiert. Das ganze hat ca. 12 h gedauert. Wenn ich die selben Daten über Windows kopiert habe, hat das ganze nur ca. 3 h gedauert. Mir ist durch aus bewusst, dass Windows mit C geschrieben ist (glaube ich) und C# um einiges langsamer ist. Aber gibt es nicht irgend einen Trick um das Kopieren in C# zu beschleuigen. Ich denke so in die Richtung, dass man mehrere Kopiervorgänge startet (dürfen sich natürlich nicht beeinträchtigen) oder ist das absoluter Blödsinn.
Hier mal der Weg wie ich das mache. Zuerst ermittel ich den Ziel- & Quellpfad. Anschließend rufe ich die Funktion CopyImages (selbst geschrieben) auf. Ich kopiere die Daten rekursiv. Verzeichnis für Verzeichnis, Datei für Datei. Dabei darf es nicht passieren, dass vorhanden Daten überschrieben werden. Nätürlich Loge ich alles mit und zeige es dem Benutzer in einem Windows Fenster, wo sich auch eine Processbar befindet, die nach jeder Kopie um eins erhöht wird.
Hier ist die Funktion:
Die Nachrichten für den Benutzer werden einer Resource Datei entnommen, weil mein Tool später in mehrere Sprachen übersetzt werden soll. Kommt bitte nicht auf die Idee zu sagen ich soll doch einfach, das manuell machen (also über Windows), dass geht nicht, weil der Kopiervorgang nur ein Teil eines großeren Firmenspezifischen Wiederherstellungstools ist und dies soll so weit wie möglich vollständig automatisiert werden.
Kann mir ein erfahrender Programmiere vielleicht helfen? Ich habe nämlich noch keinerlei Erfahrung mit performance gerechter Programmierung.
Vielen Dank
Isabelle
PS: Ich programmiere mit C# in .Net. Es handelt sich hier um eine Windowsanwendung
leider habe ich nichts passendes zu meinem Problem gefunden. Mein Problem ist, das mein Kopiervorgang sehr sehr langsam ist und ich mich jetzt frage, ob sich das den nicht beschleunigen lässt.
In meinem Test habe ich 12 GB von einer externen HDD (USB 2.0) auf ein lokales Verzeichnis kopiert. Das ganze hat ca. 12 h gedauert. Wenn ich die selben Daten über Windows kopiert habe, hat das ganze nur ca. 3 h gedauert. Mir ist durch aus bewusst, dass Windows mit C geschrieben ist (glaube ich) und C# um einiges langsamer ist. Aber gibt es nicht irgend einen Trick um das Kopieren in C# zu beschleuigen. Ich denke so in die Richtung, dass man mehrere Kopiervorgänge startet (dürfen sich natürlich nicht beeinträchtigen) oder ist das absoluter Blödsinn.
Hier mal der Weg wie ich das mache. Zuerst ermittel ich den Ziel- & Quellpfad. Anschließend rufe ich die Funktion CopyImages (selbst geschrieben) auf. Ich kopiere die Daten rekursiv. Verzeichnis für Verzeichnis, Datei für Datei. Dabei darf es nicht passieren, dass vorhanden Daten überschrieben werden. Nätürlich Loge ich alles mit und zeige es dem Benutzer in einem Windows Fenster, wo sich auch eine Processbar befindet, die nach jeder Kopie um eins erhöht wird.
Hier ist die Funktion:
Code:
/// <summary>
/// Kopiert ein Ordner.
/// </summary>
/// <param name="destinationPath">Zielverzeichnis</param>
/// <param name="sourcePath">Quellverzeichnis</param>
/// <param name="fRecursive"><c>true:</c>Wenn auch Unterverzeichnisse
/// mit kopiert werden soll</param>
private void CopyImages(string destinationPath, string sourcePath,
bool fRecursive)
{
//lokale Variablen
int i = 0;
int posSep = 0;
string sDir = null;
string[] aDirs = null;
string sFile = null;
string[] aFiles = null;
Application.DoEvents();
//Zeichen "\" hinzufügen, wenn nicht vorhanden ist
if (!sourcePath.EndsWith(System.IO.Path.DirectorySeparatorChar.
ToString()))
{
sourcePath += System.IO.Path.DirectorySeparatorChar;
}
if (!destinationPath.EndsWith(System.IO.Path.DirectorySeparatorChar.
ToString()))
{
destinationPath += System.IO.Path.DirectorySeparatorChar;
}
if (fRecursive)
{
//Alle Unterverzeichnis ermitteln
aDirs = System.IO.Directory.GetDirectories(sourcePath);
//Jeden Unterordner durchlaufen
for (i = 0; i <= aDirs.GetUpperBound(0); i++)
{
//ermittelt den letzen '\' im aktuellen Quellverzeichnis
posSep = aDirs[i].LastIndexOf(@"\");
//Name des Unterordners ermitteln
sDir = aDirs[i].Substring((posSep + 1), aDirs[i].Length -
(posSep + 1));
//Verzeichnis neu erstellen
System.IO.Directory.CreateDirectory(destinationPath + sDir);
//Methode erneut aufrufen, um weitere Unterverzeichnis des
//Unterverzeichnis zu kopieren
CopyImages((destinationPath + sDir), aDirs[i], fRecursive);
}
}
// Alle Dateien des aktuellen Verzeichnisses
aFiles = System.IO.Directory.GetFiles(sourcePath);
//Kopiert alle Dateien
for (i = 0; i <= aFiles.GetUpperBound(0); i++)
{
//ermittelt den letzen '\' im aktuellen Quellverzeichnis
posSep = aFiles[i].LastIndexOf(@"\");
//Dateinamen ermitteln
sFile = aFiles[i].Substring((posSep + 1), aFiles[i].Length -
(posSep + 1));
try
{
//Datei kopieren
System.IO.File.Copy(aFiles[i], destinationPath + sFile,
false);
this.txtLog.Text += Properties.Resources.dgCopyPic01 +
sFile + Environment.NewLine + Properties.Resources.
dgCopyPic02 + destinationPath + Environment.NewLine;
Logfile.WriteLogEntry(Properties.Resources.dgCopyPic01 +
sFile + Environment.NewLine + Properties.Resources.
dgCopyPic02 + destinationPath);
}
catch (Exception ex)
{
//Fehler beim Kopieren
//Log - Eintrag
Logfile.WriteLogEntry("=> " + ex.Message);
this.txtLog.Text += "=> "+ ex.Message + Environment.NewLine;
}
finally
{
//Fortschrittsleiste erhöhen
prbImprovment.PerformStep();
this.Refresh();
}
}
}
Die Nachrichten für den Benutzer werden einer Resource Datei entnommen, weil mein Tool später in mehrere Sprachen übersetzt werden soll. Kommt bitte nicht auf die Idee zu sagen ich soll doch einfach, das manuell machen (also über Windows), dass geht nicht, weil der Kopiervorgang nur ein Teil eines großeren Firmenspezifischen Wiederherstellungstools ist und dies soll so weit wie möglich vollständig automatisiert werden.
Kann mir ein erfahrender Programmiere vielleicht helfen? Ich habe nämlich noch keinerlei Erfahrung mit performance gerechter Programmierung.
Vielen Dank
Isabelle
PS: Ich programmiere mit C# in .Net. Es handelt sich hier um eine Windowsanwendung