Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Sa 12.06.10 13:51 
Ich habe ein seltsames Problem:
Ich erstelle eine Datei im temp Ordner, bau die dort aus einer existierenden neu auf und verschiebe sie dann an den ursprünglichen Ort.
So weit alles klar.
Dafür gibt es 2 Varianten:
1) Datei umkopieren, dann QuellDatei löschen -->Langsam
ausblenden Delphi-Quelltext
1:
2:
    Result:=CopyFile(PChar(tmpDir+fdestName),PChar(fSrcName),false);
    Windows.DeleteFile(PChar(tmpDir+fdestName));

2) ZielDatei löschen, Quelldatei "umbennen" -->Schneller
ausblenden Delphi-Quelltext
1:
2:
    if(FileExists(fsrcName)) then Windows.DeleteFile(PChar(fsrcName));
    Result:=RenameFile(PChar(tmpDir+fdestName),PChar(fSrcName));


Beide Varianten funktionieren mit dem gewünschtem Effekt
Nur habe ich bei der 2. Variante das Problem, dass sich die Anwendung danach vollständig aufhängt.
Ich habe alles rausgenommen, dass danach noch auf die Datei zugreifen könnte o.ä. wenn ich den Code 2) durch 1) ersetze kommt es auch nicht zu dem Fehler.

Woran liegt das?
System: Win7 Pro 64Bit; D2009
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Sa 12.06.10 15:10 
Hi, Ich vermute mal was :gruebel:
Im ersten Fall überschreibst Du die Original Datei und löscht die "Temp" Datei.
Im zweiten löscht Du die Original Datei und änderst den Namen der "Temp" Datei.
Bist Du sicher das Du ohne Prüfung die "Temp" und Original Datei nicht weiter verwendest?
Denn die "Temp" Datei existiert ja danach nicht mehr und die Original Datei (evtl im anderm Verzeichnis) auch nicht mehr!
Wie gesagt vermutung!

Was evtl die Zeiteinsparung betrifft hätte ich meine Zweifel.
Beispiel: Orignaldatei in C:\meinedatei\ , "Temp" Datei in C:\Temp\ . Irgendwann musst Du die Datei ja auch wieder in C:\meinedatei\ kopieren.

Gruss Alf

P.S. kompliziert das richtig zu Formulieren!

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 12.06.10 15:36 
Sofern es keine Konsolenapplikation ist, probier's mal mit EurekaLog: blog.eurekalog.com/h...g-applications-hang/
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Sa 12.06.10 15:57 
Hey,

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Was evtl die Zeiteinsparung betrifft hätte ich meine Zweifel.
Beispiel: Orignaldatei in C:\meinedatei\ , "Temp" Datei in C:\Temp\ . Irgendwann musst Du die Datei ja auch wieder in C:\meinedatei\ kopieren.
Wenn sich die Datein auf dem selben Datenträger befinden reicht das umbennen, also wenn ich "C:\Test\was_weiß_ich.txt" in "C:\neu.txt" umbennen, dann wird nix kopiert, sondern nur der Pfad geändert, physisch bleibt die Datei da wo sie ist. Erst wenn man beim umbennenen einen anderen Datenträger als bei der Quelldatei angibt, wird kopiert oder eher gesagt ausgeschnitten...

@Flamefire: Du kannst dir ja mal einene Haltepunkt vor uns nach dem kopieren/umbennen setzten und dann mir Unlocker gucken, welche Programme die Datei zuz Zeit benutzen, vlt findest du damit den Fehler.

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Sa 12.06.10 16:37 
Hi user profile iconBergmann89. Ich bin davon ausgegangen das er den Namen seiner "Temp" Datei im Tempordner ändert, nicht in seinem original Verzeichnis. War vielleicht blöde von mir Formuliert :oops:
Ansonsten hast Du natürlich recht :wink:

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 12.06.10 17:59 
Wo ist "danach"? Auf irgend einer Codezeile muss er sich ja aufhängen.

Nebenbei: Mit MoveFileEx+MOVEFILE_REPLACE_EXISTING kannst du das, was du willst, in einem Schritt bewältigen (Achtung bei Verwendung auf Netzwerk Shares).
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Sa 12.06.10 18:19 
Das danach ist unbekannt, jede Funktion von mir bis zum Onclick (inkl) wird verlassen
GUI hängt sich auf.
Kopiert ist aber alles
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 12.06.10 18:29 
EurekaLog (Advanced Options/Anti Freeze Options) oder MadExcept (Basic Settings/Runtime Checks/Check for Frozen Main Thread) wird dir die Frage beantworten
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Sa 12.06.10 19:40 
Habs gefunden:
Hatte davor ein ShellListview (modifiziert für zusätzliche Skins offen)
Und warum auch immer scheint die o.g. Variante damit ein Deadlock zu produzieren. Irgendwo wird bei RootChanged ein TThread.WaitFor aufgerufen, dass auf MultipleObjects wartet. Aber das kommt nie an.
Habs jetzt mit den Standart Delphi ShellListview gemacht. Da ein paar Bugs gefixt und läuft forums.embarcadero.c...d.jspa?threadID=9627

Blockierte Threads wurden nicht angezeigt. Vermutlich weil der ein Timeout von 1s hatte, und dann nochmal wait aufruft, so dass es schon fast busy waiting wird.