Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CopyFile gibt Datei nicht frei? (https://www.delphipraxis.net/82225-copyfile-gibt-datei-nicht-frei.html)

DGL-luke 8. Dez 2006 21:32


CopyFile gibt Datei nicht frei?
 
:shock:

Ich fordere über das Windows-Message-System von meiner Serverapplikation eine Datei an. Die Serverapplikation fertigt eine Kopie dieser Datei mit CopyFile an und schickt mir den Pfad dieser Datei wiederum übers Messaging-System. Ich öffne diese Datei per TStringlist.LoadFromFile - und was müssen meine brechenden Augen sehen?
Zitat:

Erste Gelegenheit für Exception bei $7C81EB33. Exception-Klasse EFOpenError mit Meldung 'Datei D:\Eigene Dateien von Superuser\tut_nichts_zur_sache\published\log0.log. txt kann nicht geöffnet werden. Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird'. Prozess Core.exe (1676)
Sollte die Datei nicht wieder frei sein, wenn CopyFile zurückkehrt? Was man hier sieht, spricht fürs gegenteil:

Delphi-Quellcode:
 
//generate filenames
      old := BaseDir + IncludeTrailingPathDelimiter(LOGDIR) + Logs[LogIdent];
      new := BaseDir + IncludeTrailingPathDelimiter(PUBDIR) + Logs[LogIdent];

      //make public file
      CopyFile(PChar(old),PChar(new),false); //CopyFile wird ausgeführt

      //fill formal data
      LI.YourHandle   := AppHandle;
      LI.LogIdentifier := LogIdent;

      //write formal data
      MS := TMemoryStream.Create;
      try
        MS.Write(LI,SizeOf(LI));
        MS.Write(new[1], length(new));

        //fill copydatastruct
        CpDt.dwData := Integer(ltReadAnswer);
        CpDt.cbData := MS.Size;
        CpDt.lpData := MS.Memory;

        TLogMessageThread.Create(WHandle,AppHandle,CpDt,ThreadLog); //Nachricht wird vershickt
      finally
        MS.Free;
      end;
Falls es nicht mein Fehler ist, und ich den übersehe: Womit ersetze ich CopyFile, um es auf jeden Fall "blocking" zu haben?

Christian Seehase 8. Dez 2006 21:47

Re: CopyFile gibt Datei nicht frei?
 
Moin Lukas,

hast Du es schon einmal mit SHFileOperation versucht?

DGL-luke 8. Dez 2006 21:52

Re: CopyFile gibt Datei nicht frei?
 
ich werd mir das ansehen.

EDIT: Scheint mir aber auch arg asynchron zu sein...

EDIT: ok... :gruebel:

Delphi-Quellcode:
 
      //generate filenames
      old := BaseDir + IncludeTrailingPathDelimiter(LOGDIR) + Logs[LogIdent];
      new := BaseDir + IncludeTrailingPathDelimiter(PUBDIR) + Logs[LogIdent];

      MS := TMemoryStream.Create;
      try
        MS.LoadFromFile(old);
        MS.SaveToFile(new);
      finally
        MS.Free;
      end;

      //fill formal data
      LI.YourHandle   := AppHandle;
      LI.LogIdentifier := LogIdent;

      //write formal data
      MS := TMemoryStream.Create;
      try
        MS.Write(LI,SizeOf(LI));
        MS.Write(new[1], length(new));

        //fill copydatastruct
        CpDt.dwData := Integer(ltReadAnswer);
        CpDt.cbData := MS.Size;
        CpDt.lpData := MS.Memory;

        TLogMessageThread.Create(WHandle,AppHandle,CpDt,ThreadLog);
      finally
        MS.Free;
      end;
Ich dachte mir, mach ichs halt klassisch, nimmst einen Memorystream... aber bei dem ist es genau das selbe Symptom... wie geht denn das? Ich fasse die "public"-Datei nirgends sonst an...

DGL-luke 9. Dez 2006 12:43

Re: CopyFile gibt Datei nicht frei?
 
Ich bin offenbar einfach zu schnell... Habe mal ein "Sleep(20)" vors Laden geschoben, damit funktionierts in den meisten Fällen.

DGL-luke 10. Dez 2006 17:44

Re: CopyFile gibt Datei nicht frei?
 
Sodele. So funktionierts immer:

Delphi-Quellcode:
attmpts := 0;
  for i := 1 to 10 do
  begin
  FHandle := CreateFile(@LogName[1],GENERIC_READ,FILE_SHARE_READ,nil,
                                OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

  if FHandle <> INVALID_HANDLE_VALUE then
  begin
    attmpts := i;
    Break
  end
  else
    Sleep(50);
  end;
Dieses Filehandle kann man dann z.B. einem Filestream übergeben (TFileStream.Create(FHandle);).

Bernhard Geyer 10. Dez 2006 20:44

Re: CopyFile gibt Datei nicht frei?
 
Läuft ein Virenscanner mit? Der braucht u.U. auch ein paar ms.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.

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