Kasowanie pliku nie działa pod XP ?

Odpowiedz Nowy wątek
2008-05-26 20:02

Rejestracja: 13 lat temu

Ostatnio: 11 lat temu

0

Witam. Tworzę program, który można aktualizować przez internet. Problem w tym, że stary plik pod Vistą daje się skasować bez problemu, a pod XP już nie.

Po ściągnięciu pliku AE2.new dałem coś takiego:

If Application.MessageBox('Zakończono pobieranie!'+#13#10+
'Po kliknięciu "OK" program się wyłączy i zaktualizuje.','Koniec',MB_OK+MB_ICONInformation)=IDOK then
Begin
  Application.Terminate;
  ShellExecute(handle, 'open', 'update.exe', nil, nil, sw_normal);
End;

Następnie uruchamia się program update.exe, który wykonuje coś takiego:

procedure TForm1.FormActivate(Sender: TObject);
begin
StatusBar1.Panels[0].Text:='Czekaj...';
Application.ProcessMessages;
if not FileExists(ExtractFilePath(Application.ExeName)+'AE2.new') then
Begin
  Application.ProcessMessages;
  StatusBar1.Panels[0].Text:='Plik AE2.new NIE ISTNIEJE! Aktualizacja nie możliwa.';
  Application.ProcessMessages;
  Sleep(2000);
  Application.Terminate;
End;
if FileExists(ExtractFilePath(Application.ExeName)+'AE2.new') then
Begin
 StatusBar1.Panels[0].Text:='Trwa aktualizacja...';
 Application.ProcessMessages;
 DeleteFile('AE2.exe');
 Sleep(2000);
 MoveFile('AE2.new','AE2.exe');
 Application.ProcessMessages;
 StatusBar1.Panels[0].Text:='Zakończono pomyślnie!';
 DeleteFile('AE2.new');
 Sleep(1000);
 Application.Terminate;
 ShellExecute(handle, 'open', PChar(ExtractFilePath(Application.ExeName)+'AE2.exe'), nil, nil, sw_normal);
End;
end;

Pod XP plik AE2.exe nie kasuje się i nie aktualizuje, jednak AE2.new zostaje już skasowany.

Dlaczego pod Vistą to działa, a pod XP nie? Czy jest na to jakaś rada?

Zauważyłem jeszcze, że pod XP gdy uruchomię program update.exe własnoręcznie to wszystko jest OK.

Pozdrawiam.

Pozostało 580 znaków

2008-05-26 20:34

Rejestracja: 12 lat temu

Ostatnio: 10 lat temu

0

Application.Terminate a POTEM ShellExecute? To raczej nie ma prawa się udać... Spróbuj zamienić kolejność tych poleceń.

Pozostało 580 znaków

2008-05-26 20:56

Rejestracja: 13 lat temu

Ostatnio: 11 lat temu

0
manfredek napisał(a)

Application.Terminate a POTEM ShellExecute? To raczej nie ma prawa się udać... Spróbuj zamienić kolejność tych poleceń.

Nieststy nic to nie dało. Pod Vistą działa, a pod XP nie...

Pozostało 580 znaków

ŁF
2008-05-26 21:04
ŁF
Moderator

Rejestracja: 17 lat temu

Ostatnio: 18 godzin temu

0

bo update uruchamia się szybciej, niż ae kończy swoje działanie, a nie możesz usunąć pliku powiązanego z uruchomionym procesem. zrób pętlę, w której sprawdzasz, czy pierwszy proces się już zakończył.
poza tym nie powinieneś usuwać plików przed zakończeniem całego procesu - zmień nazwę ae2.exe na ae2.old czy coś innego, i dopiero po tym, jak uda się przeprowadzić aktualizacje do końca usuń zbędne pliki.
po co te dwa ostatnie sleepy? w ogóle po co tu jakiekolwiek sleepy? pokaż messageboksa zamiast mrugać jakimś napisem na statusbarze, i tak go nikt nie zauważy. tym bardziej, że i tak się nie pokazuje, bo brakuje ci processmessages pomiędzy przypisaniem tekstu a sleepem.
po co drugi if? jeśli not fileexists(), to logiczne, że plik istnieje, więc wystarczy zwykłe else.
no i ten przedwczesny terminate...


Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0