Synchrones Filecopy C# und .NET 1.1 SP1
#1
geschrieben 28. April 2006 - 09:09
ich möchte gerne eine Datei kopieren allerdings gibt es da ein Problem:
Wenn ich folgenden Code ausführe...
File.Copy(@"C:\TEST.exe",@"D:\TEST.exe");
MessageBox.Show("Fertig!","Hinweis");
... wird die Datei zwar kopiert, aber da sie etwas größer ist fällt sehr stark auf das der MessageBox-Befehl schon ausgeführt wird, wenn die Datei noch garnicht vollständig kopiert wurde !?
Im Netz bin ich darauf gestoßen das beide Prozesse (also Origramm und File.Copy sind Synchron zueinander laufen. Ich müsste sie irgendwie dazu bringen dies zu tun, aber die Quelltexte im Netz sind so unverständlich das ich nimmer weiter weiss.
Könnt ihr mir was hilfreiches Mitteilen?
MFG
Don
Anzeige
#2
geschrieben 28. April 2006 - 09:27
also, primitiv aber wirksam wäre
File.Copy(@"C:\TEST.exe",@"D:\TEST.exe");
FileStream fs = new FileStream("D:\TEST.exe", FileMode.Open);
while(!fs.CanWrite)
//tue gar nichts
fs.close();
MessageBox.Show("Fertig!","Hinweis");
Das solte deinen Haupt-Thread solange blockieren, bis die Zieldatei komplett geschrieben wurde.
Eleganter (aber aufwendiger) wäre es sicherlich, mit snchronisierten Threads zu arbeiten und die Zieldatei zu "locken".... das ergibt aber einen Haufen Zeilen an Mehr-Code.
#3
geschrieben 28. April 2006 - 09:50
#4
geschrieben 28. April 2006 - 10:17
FileStream fs = new FileStream("D:\TEST.exe", FileMode.Open);
while(!fs.CanWrite)
{
//tue gar nichts
}
fs.close();
Trotzdem ist es Murx, denn: Wer sagt, dass zu dem Zeitpunkt der FileCopy-Prozess schon begonnen hat (bei sehr schnellen Multi-CPU-Geräten kann das sein, dass das asynchron erst später gestartet wird. Ausserdem ist die CPU-Auslastung glaub ich auch nicht 0 bei der while-Schleife.
Was ich nicht verstehe: ich habe das gerade selbst probiert, und bei mir wartet File.Copy(). Das sollte es auch, weil sonst würde was in der Hilfe stehen. Bist du sicher, dass dein Explorer (oder was auch immer du für die ANzeige des Verzeichnisses zum Prüfen, obs fertig ist, verwendest) vielleicht nur noch nicht die Anzeige aktualisiert hat?
Ach ja: EIn WIndows-Dienst, der direkt über den Desktop mit dem Benutzer kommunizieren kann, ist ne riesen Sicherheitslücke, bist du sicher, dass du dem User über nen Dienst ne MessageBox zeigen willst?
#5
geschrieben 28. April 2006 - 10:23
Seltsam ist auch, dass alles richtig klappt wenn ich ein Windowsform mit Button nehme und dort den selben Code ausführe. Dann klappt alles so, wie es soll.
Ich blick da irgendwie nich durch...
#6
geschrieben 28. April 2006 - 10:44
#7
geschrieben 28. April 2006 - 10:47
#8
geschrieben 28. April 2006 - 11:07
Zitat
Mist, Klammern vergessen
Die CPU-Last in der Schleife wäre natürlich nicht null, ist halt busy waiting. Wenn File.copy() tatsächlich nicht blockiert, dann müsste man wohl tatsächlich mit synchronisierten Threads arbeiten. Oder du schreibst deine eigene copy()-Funktion, so in der Art
public void copyFile(String source, String target)
{
StreamReader sr = new StreamReader(File.Open(source, FileMode.Open));
StreamWriter srw = new StreamWriter(File.Open(target, FileMode.CreateNew));
srw.Write(sr.ReadToEnd());
}
Wenn die nicht blockt wird's seltsam....
#9
geschrieben 28. April 2006 - 11:37
#10
geschrieben 28. April 2006 - 12:36
#11
geschrieben 28. April 2006 - 12:58
Ich habe ein Programm und einen Dienst. Diese beiden Kommunizieren quasi über eine im FileSystem abgelegte xml-Datei.
Wenn der dienst durch das Programm gesartet wird kopiert er diverse Dateien. dabei schreibt er seinen Momentanen Status in die XML File. Quasi welche Datei er grade kpoert etc.
Sobald er fertig ist schreibt auch dies in die XML Datei.
Das Programm ließt die XML-Datei alle 100ms aus und gibt die Informationen auf dem Fenster aus. Sobald es mitbekommt das in der XMl-Datei die Information über den beendeten Vorgang vorliegt zeigt es eine entsprechende MessageBox an.
Soweit so gut, aber das Programm hat sofort die MessageBox angezeigt obwohl die Dateien noch nicht kopiert waren.
Was der Fehler war: Es wird zwar geschriben das das Backup fertig ist aber danach nicht das es noch NICHT fertig ist. Das bedeutet das er bei jedem neustart die Informationen vom vorherigen durchlauf einließt und entsprechend die MessageBox anzeigt.
Problemlösung: Vor dem Start des Dienstes durch das Programm die Einstellungen entsprechend anpassen...
#12
geschrieben 28. April 2006 - 13:06
Um das, was du willst, zu bewerkstelligen, musst du
1. den FileStream am Ende des Kopierens flush()en
2. die Datei für NON_CACHED_IO öffnen.
Das einfachste wäre jedoch, einfach die ganze Geschichte zu ignorieren.

Ja, mata ne!
(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
#13
geschrieben 28. April 2006 - 13:10
#14
geschrieben 28. April 2006 - 13:10
#15
geschrieben 28. April 2006 - 13:32

Hilfe
Neues Thema
Antworten
Nach oben

