Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Noch ein zugriff auf Datei ? (https://www.delphipraxis.net/111352-noch-ein-zugriff-auf-datei.html)

EWeiss 2. Apr 2008 05:18


Noch ein zugriff auf Datei ?
 
Bin der Meinnug das alle Handles und threads der verwendeten Daten geschlossen sind
Trotzdem bekomme ich in "finalization" beim löschen einer Datei zugriff verweigert.

Wie kann ich vorher testen ob diese auch wirklich geschlossen ist damit
sie gelöscht werden kann?

Edit:

Prüfe mit einer Function hier aus dem Forum vorher ob es möglich ist die Datei zu löschen
es wird ein true zurückgegeben .. diese scheint nur zu prüfen ab ein generelles löschen möglich ist
aber nicht zum jetzigen zeitpunkt

Delphi-Quellcode:
    if CheckAccessToFile(FILE_DELETE, // check for generic write access
      thePath + '~tmp4358.dat')=true then;
    if DeleteFile(thePath + '~tmp4358.dat') = false then
         MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Confirm', MB_OK or MB_ICONINFORMATION);
gruss Emil

marabu 2. Apr 2008 06:14

Re: Noch ein zugriff auf Datei ?
 
Moin Emil,

in Delphi solltest du einen booleschen Ausdruck nicht redundant erweitern:

Delphi-Quellcode:
begin
  // ...
  if DeleteFile(thePath + '~tmp4358.dat') {= False} then
    MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Confirm', MB_OK or MB_ICONINFORMATION);
  // ...
end;
Boolsche Werte werden auf Integer-Werte abgebildet und umgekehrt. Für Delphi gibt es eine Abbildungsregel, API-Funktionen verwenden mitunter eine abweichende. Dies nur am Rande.

Zu deinem eigentlichen Problem: Wenn du eine Datei im Abschnitt finalization löschen willst, dann solltest du sie im Abschnitt initialization bereitgestellt haben. Arbeitest du dabei mit API-Funktionen wie CreateFile() oder mit Delphi Streams oder mit den alten Prozeduren AssignFile() etc.? Zu welchem Zeitpunkt besorgst du dir den Zugriff auf die temporäre Datei? Wann und wo schließt du sie?

Freundliche Grüße

DeddyH 2. Apr 2008 07:23

Re: Noch ein zugriff auf Datei ?
 
Mich irritiert außerdem das Semikolon hinter der 2. Codezeile.

EWeiss 2. Apr 2008 08:22

Re: Noch ein zugriff auf Datei ?
 
Zitat:

Zitat von marabu
Moin Emil,

in Delphi solltest du einen booleschen Ausdruck nicht redundant erweitern:

Delphi-Quellcode:
begin
  // ...
  if DeleteFile(thePath + '~tmp4358.dat') {= False} then
    MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Confirm', MB_OK or MB_ICONINFORMATION);
  // ...
end;
Boolsche Werte werden auf Integer-Werte abgebildet und umgekehrt. Für Delphi gibt es eine Abbildungsregel, API-Funktionen verwenden mitunter eine abweichende. Dies nur am Rande.

Zu deinem eigentlichen Problem: Wenn du eine Datei im Abschnitt finalization löschen willst, dann solltest du sie im Abschnitt initialization bereitgestellt haben. Arbeitest du dabei mit API-Funktionen wie CreateFile() oder mit Delphi Streams oder mit den alten Prozeduren AssignFile() etc.? Zu welchem Zeitpunkt besorgst du dir den Zugriff auf die temporäre Datei? Wann und wo schließt du sie?

Freundliche Grüße


ich initialisiere (loadlibrary) in meiner INIT Routine
könnte ich in die initializations routine verschieben wäre kein problem.
Mit Delphi Stream wird aus der resource eingeladen in dieser besagten INIT Routine

Angesprochen wird sie sobald ein zugriff auf ein plugin stattfindet
sie bleibt im speicher und wird nicht immer wieder gelöscht(freigegeben) denke ist nicht nötig da nur 4K groß
ich schließe sie in finilization bevor ich sie lösche... was nicht geht.

Uwe meint es hätte mit dem DllCache zu tun (Ich schätze mal, das das daran liegt, das DLL's gecached werden.)

Edit:
habs nochmal versucht!
So siehts aus .. gleiche problem mit dem löschen..
Delphi-Quellcode:
initialization
  begin
    getVisHeader := nil;

     //Wasabi initialisieren
     SetLength(thePath, MAX_PATH) ;
     lng := GetTempPath(MAX_PATH, PChar(thePath)) ;
     SetLength(thePath, lng) ;

     ResStream := TResourceStream.Create(HInstance, 'DLL', 'DATA');
     ResStream.SaveToFile(thePath + '~tmp4358.dat');
     SetFileAttributes(PChar(thePath + '~tmp4358.dat'), FILE_ATTRIBUTE_HIDDEN);

     ResStream.free;

     WAServiceHandle := Loadlibrary(PChar(thePath + '~tmp4358.dat'));
     if (WAServiceHandle = 0) then
       begin
       MessageBox(0, 'Error loading GetAPIService',
                              'initialization', MB_OK or MB_ICONERROR);
       halt;
     end;
  end


finalization
  begin

  CloseVisDLL;
 
  if (WAServiceHandle <> 0) then
  begin
    FreeLibrary(WAServiceHandle);
    WAServiceHandle := 0;
  end;

  if (DeleteFile(thePath + '~tmp4358.dat') = false) then
    MessageBox(0, PChar(SysErrorMessage(GetLastError)),
      'Confirm', MB_OK or MB_ICONINFORMATION);

  end
gruss Emil

EWeiss 2. Apr 2008 08:24

Re: Noch ein zugriff auf Datei ?
 
Zitat:

Zitat von DeddyH
Mich irritiert außerdem das Semikolon hinter der 2. Codezeile.

Ja kann man machen muss man aber nicht ..
Hat aber keinen einfluss auf meine frage das die Datei nicht gelöscht wird

gruss Emil

Luckie 2. Apr 2008 08:30

Re: Noch ein zugriff auf Datei ?
 
Zitat:

Zitat von EWeiss
Prüfe mit einer Function hier aus dem Forum vorher ob es möglich ist die Datei zu löschen
es wird ein true zurückgegeben .. diese scheint nur zu prüfen ab ein generelles löschen möglich ist
aber nicht zum jetzigen zeitpunkt

Doch. Es wird aber nur geprüft, ob du die nötigen Rechte hast sie zu löschen, was aber nicht bedeutet, dass du sie auch wirklich löschen kannst, weil eventuell noch ein anderer Prozess auf die Datei zugreift.

EWeiss 2. Apr 2008 08:34

Re: Noch ein zugriff auf Datei ?
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von EWeiss
Prüfe mit einer Function hier aus dem Forum vorher ob es möglich ist die Datei zu löschen
es wird ein true zurückgegeben .. diese scheint nur zu prüfen ab ein generelles löschen möglich ist
aber nicht zum jetzigen zeitpunkt

Doch. Es wird aber nur geprüft, ob du die nötigen Rechte hast sie zu löschen, was aber nicht bedeutet, dass du sie auch wirklich löschen kannst, weil eventuell noch ein anderer Prozess auf die Datei zugreift.

Dann steht die Frage im Raum ob es sinn macht die Funktion integriert zu lassen.
Denn im temp Order wird jeder zugriff auf die dateien zum löschen haben.

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz