Entwickler-Ecke

Sonstiges (Delphi) - Delphi Löscht einfach Dateien


Xearox - Mi 17.03.10 16:00
Titel: Delphi Löscht einfach Dateien
Also, folgendes Problem:

Ich habe einem Freund, für sein Programm, einen Updater via FTP geschrieben.
Er hat dies in sein Programm integriert, nun war das Problem, das beim Start des Programms, Delphi hängen geblieben ist,
wieso auch immer, bei mir lief der Updater einwandfrei.

So, nun ist das so, das nachdem er Delphi geschlossen hatte(Delphi ist komplett abgeschissen), das all seine Sourcen, die er verwendet hat, gelöscht wurden.

Es handelt sich um Delphi 7 PE

Ich habe den Updater in D2010 geschrieben.



Kann hier wer helfen?


jaenicke - Mi 17.03.10 16:58

Delphi selbst löscht da sicher nichts das hat er dann schon selbst gemacht. Entweder durch ein Programm von ihm ganz manuell oder er hat einen Virus (bei D7 gibts mittlerweile einige die aber auf gut eingerichteten PCs kaum etwas machen konnten).


Jakob_Ullmann - Mi 17.03.10 19:24

Vielleicht waren die Dateien einfach nicht geschlossen und Windows hat sie beim Festplattencheck gelöscht?


Xearox - Mi 17.03.10 20:58

nichts der gleichen

er hat das Programm gestartet, programm ist hängen gebliebn, also D7 komplett.
Er hat es per TaskManager geschlossen

Alle Sorcen waren daraufhin weg


Jakob_Ullmann - Mi 17.03.10 21:01

Dann würde ich auch eher user profile iconjaenickes These unterstützen. Oder aber die Dateien sind "noch da" und existieren nur nicht mehr in der Tabelle.


Delete - Mi 17.03.10 22:33

Wie soll ein abgestürztes Programm Dateien löschen können?


Xearox - Mi 17.03.10 22:34

weiß ich nicht, er sagte mir, nach dem er mein code implementiert hat, ist delphi hängen geblieben, und danach wären die sourcen weg gewesen


Xentar - Mi 17.03.10 23:22

Ist jetzt ein wenig die Frage, wie der Updater arbeitet..
Werden hier irdenwelche Dateien gelöscht, oder "nur" überschrieben? Kann man die Dateien auswählen, oder wie läuft das? Solche Sachen..

Ansonsten kann ich das auch nicht ganz glauben, dass durch ein abgestürztes Delphi alle Dateien weg sein sollen.
Vielleicht mal chkdsk drüber laufen lassen?


Xearox - Do 18.03.10 01:04

also, sagen wir mal so, der updater ist nicht gerade, was man nem Profi, der richtig Programmieren kann, erwarten kann...
Ich lediglich jemand, der Delphi gerade erst lernt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
unit update;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdExplicitTLSClientServerBase, IdFTP, StdCtrls;

type
  TMainForm = class(TForm)
    IdFTP1: TIdFTP;
    procedure Updater;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  MainForm: TMainForm;

implementation



{$R *.dfm}



procedure TForm2.Updater;
begin
  showMessage('Bitte Einen Moment, Update wird jeden moment gestartet, bitte OK drücken, Programm wird automatisch geschlossen');
  IdFTP1.Username := ('') ; //den username für den server
  IdFTP1.Password := (''); //das Passwort für den Server
  IdFTP1.Host := ('') ; //die IP deines FTP Server eintragen
  IdFTP1.Connect;
  IdFTP1.ChangeDir('');
  try
    IdFTP1.Get(' ', (ExtractFilePath(ParamStr(0)) + ' '), true); //den namen deines programms eintragen
  except
    showMessage('Update Fehlgeschlagen');
  end;
  showMessage('Update Erfolgreich');
  IdFTP1.Quit;
  close;
  winexec(ExtractFilePath(ParamStr(0)) +'.\Project1.exe', SW_SHOWNORMAL); //hier ebenfalls den namen eintragen

end;



end.



Das war der Grund code.
Er hat beim Update Button nun eingefügt:


Delphi-Quelltext
1:
2:
3:
begin
  form1.close;
  Updater;



bedeutet, damit die Project1.exe überschrieben werden kann, muss diese exe erstmal geschlossen werden, also Form1.close
und dann wird die Projekt1.exe überschrieben, und dann neu geöffnet.

so und nun beim starten ist Delphi komplett abgeschissen


platzwart - Do 18.03.10 01:52

Mal ganz doof gefragt: Das Programm beendet sich selbst. Das beendete Programm, das nun nicht mehr läuft, ruft den Updater auf, der die nicht mehr laufende Exe ersetzt. Anschließend wird das Programm wieder gestartet. Kommt das nur mir komisch vor oder ist das wirklich unlogisch (falsch^^)?!?


chickenfigt1989 - Do 18.03.10 04:56

Es müsste doch erst den Update aufrufen und dann die Exe schließen oder?
Das ist so, wie mit dem Beispiel das hier mal gebracht wurde mit dem Motor.
Man schaltet auch nicht dem Motor aus und gibt dann Gas.
Gruß


jaenicke - Do 18.03.10 07:07

user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:
Das Programm beendet sich selbst. Das beendete Programm, das nun nicht mehr läuft, ruft den Updater auf, der die nicht mehr laufende Exe ersetzt. Anschließend wird das Programm wieder gestartet. Kommt das nur mir komisch vor oder ist das wirklich unlogisch (falsch^^)?!?
Es funktioniert auch schlicht nicht. Ich habe das zwar nicht noch extra ausprobiert, aber was passieren sollte ist, dass Indy einfach gar nix macht.
Denn durch das Close wird das Programm ja nicht direkt geschlossen, sondern erst sobald der aktuelle Code abgearbeitet ist. In diesem Fall der des "Updaters". Das heißt der "Updater" startet im Grunde nur die eigene Exe neu, mehr nicht. ;-)

Machen kann man das aber grundsätzlich schon so, wenn man die Exe vorher umbenennt und nach dem Neustart löscht. :idea:
So arbeitet auch mein Updater [http://www.delphi-forum.de/viewtopic.php?t=94339].

WinExec ist allerdings so ziemlich die schlechteste Idee, die man dafür haben kann... Der Befehl ist 20 Jahre alt und nur noch für Windows 3.1 Abwärtskompatibilität vorhanden. Dafür gibt es ShellExecute.


Xearox - So 21.03.10 06:23

Ich weiß ja nicht wie das bei euch ist, aber wenn ich close; mache und Winexec oder ShellExecute, wie auch immer, aufrufe, wird das programm dennoch gestartet.
Als ich mir Platzwart antwort hab ich auch gedacht, hmm, irgendwas stimmt ja da nicht, aber dennoch macht ers bei mir.

Obwohl dies auch für mich eher Unlogisch erscheint, das ein geschlossenes Programm ein anderes aufrufen kann.
Aber es ist so.

darauf hin wird die Datei per FTP vom server Downgeloadet, und die exe automatisch überschrieben, danach wird die exe erneut aufgerufen.
Aber was ich glaube ist, dass das Problem wohl eher daran liegt, das man aus Delphi heraus auf Projekt Starten geklickt hat, und darauf hin die eigenliche exe, also was man in Delphi Compiliert und gestartet hat, beendet wird, und eine andere exe aufgerufen wird.

Vermutlich hat sich deswegen Delphi aufgehangen, das er das nicht so gemocht hat.


jaenicke - So 21.03.10 10:39

user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:
Ich weiß ja nicht wie das bei euch ist, aber wenn ich close; mache und Winexec oder ShellExecute, wie auch immer, aufrufe, wird das programm dennoch gestartet.
Als ich mir Platzwart antwort hab ich auch gedacht, hmm, irgendwas stimmt ja da nicht, aber dennoch macht ers bei mir.
Ich habe es doch schon erklärt:
Close schließt nicht sofort, sondern erst, wenn dein Quelltext abgearbeitet ist, in dem dieser Befehl steht. Und wenn danach dein Updatercode kommt, dann wird auch dieser inkl. Start des Programms ausgeführt bevor das Programm geschlossen wird.


Xearox - So 21.03.10 13:02

naja, ist jetzt eh geklärt...ihm werd ich ganz sicher nicht mehr helfen.

Im Anhang befindet sich ein ganz toller Text, von maier1990 bzw. chickenfighter1989 usw.

Moderiert von user profile iconChristian S.: Screenshot von privatem Chat entfernt


chickenfigt1989 - So 21.03.10 13:26

Dan is es ja gut du kleena Freak :)
Von früh Morgens bis Spät Abends online :)
Wie wärs mal mit nen Reallife?