Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [gelöst] FileClose und CloseFile schliesst Datei nicht? (https://www.delphipraxis.net/50632-%5Bgeloest%5D-fileclose-und-closefile-schliesst-datei-nicht.html)

bigg 28. Jul 2005 17:29


[gelöst] FileClose und CloseFile schliesst Datei nicht?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zunächst einmal öffne ich eine Datei mit folgenden Rechten:
Delphi-Quellcode:
fmOpenRead or fmShareDenyNone
Nun springe ich Byte für Byte durch die Datei bis zum Ende, anschließend schliesse ich sie.
Wenn ich die Datei nun umbenennen möchte, bappt mir eine Message um die Ohren.

Wieso nur? :wall:

Luckie 28. Jul 2005 17:40

Re: FileClose und CloseFile schliesst Datei nicht?
 
Wie schließt du sie? Und bist du sicher, dass sie nicht naoch an anderer Stelle im Programm geöffnet wird?

bigg 28. Jul 2005 17:45

Re: FileClose und CloseFile schliesst Datei nicht?
 
Mit FileClose(Integer) oder CloseFile(File), beides funktioniert nicht,
erst nach dem Beenden meiner Anwendung ist die Datei wieder umbenennbar.

Luckie 28. Jul 2005 17:49

Re: FileClose und CloseFile schliesst Datei nicht?
 
Wie keins von beiden Funktioniert nicht? FileClose und CloseFile bedingen auch eine andere Art, wie du die datei öffnest. Ersteres erwartet ein Windows-Dateihandle zweiteres eine Pascal Dateivariable.

bigg 28. Jul 2005 17:56

Re: FileClose und CloseFile schliesst Datei nicht?
 
Ich habe mehrere Varianten ausprobiert:

TFileStream
FileOpen
AssignFile

Luckie 28. Jul 2005 17:59

Re: FileClose und CloseFile schliesst Datei nicht?
 
Poste mal die mit dem FileStream. Ohne Code bleibt das hier ein Rumgerate. :roll:

bigg 28. Jul 2005 18:07

Re: FileClose und CloseFile schliesst Datei nicht?
 
Zur Zeit kann ich dir nur mit Assignfile dienen, die anderen habe ich nicht gesichert.

Delphi-Quellcode:
function TMD5Form.FileScan(const FileName: String): String;
const MAX_Buffer = 2048;
var AFile: File;
var i, ActSize, FSize, BufferSize, Blocks, Last: Integer;
var Buffer: Array[1..MAX_Buffer] of Byte; // Datenpuffer
var Context: MD5Context;
var Dig: MD5Digest;
var f, c: Extended;
begin
c := 0;
ActSize := 0;

if FileExists(FileName) then
begin

AssignFile(AFile, FileName);
FileMode := fmOpenRead or fmShareDenyNone;

{$i-}
Reset(AFile, 1);
{$i+}

if IOResult = 0 then
begin // Datei konnte geöffnet werden
MD5Init(Context);

    try
      FSize := FileSize(AFile);       // Dateigröße in Byte

      if FSize <> 0 then
      begin
      Panel.Visible := True;
      OKBtn.Enabled := False;
      UserEdit.Enabled := False;

      Blocks := FSize div MAX_Buffer; // Anzahl max. Blöcke
      Last  := FSize mod MAX_Buffer; // Größe des Rest-Puffer

      if Last <> 0 then
      inc(Blocks); // sofern, unser Restpuffer ungleich 0 Byte groß ist, wird unsere Blockvariable um 1 erhöht

      f := 100 / Blocks;

      for i := 0 to Blocks -1 do // Blöcke einlesen
      begin

        if CancelProcess then
        Break;

        Seek(AFile, ActSize); // Start-Position in Byte (wird von Block zu Block angepasst)

        inc(ActSize, MAX_Buffer);
        if ActSize <= FSize then
        BufferSize := MAX_Buffer else
        BufferSize := Last;

        c := c + f;

        ProgressBar.Position := Round(c);
        Application.ProcessMessages;

        BlockRead(AFile, Buffer[1], BufferSize);
        MD5Update(Context, @Buffer, BufferSize);
      end;

      end;

    finally
      CloseFile(AFile);
      Panel.Visible := False;
      OKBtn.Enabled := True;
      UserEdit.Enabled := True;
    end;

if CancelProcess then
Result := '' else
begin
  MD5Final(Context, Dig);
  Result := MD5Print(Dig);
end;

end;
end;
end;

SirThornberry 28. Jul 2005 18:21

Re: FileClose und CloseFile schliesst Datei nicht?
 
wenn du mit TFileStream arbeitest wird die Datei erst wieder freigegeben wenn du den Stream freigibst.

bigg 28. Jul 2005 18:30

Re: FileClose und CloseFile schliesst Datei nicht?
 
In diesem Fall allerdings nicht: :wall:

Delphi-Quellcode:

////////////////////////////////////////////////////////////////////////////////
// MD5: Erstellt aus einer Datei eine Checksumme
////////////////////////////////////////////////////////////////////////////////

function TMD5Form.FileScan(const FileName: String): String;
const MAX_Buffer = 2048;
var AFile: TFileStream;
var i, ActSize, FSize, BufferSize, Blocks, Last: Integer;
var Buffer: Array[1..MAX_Buffer] of Byte; // Datenpuffer
var Context: MD5Context;
var Dig: MD5Digest;
var f, c: Extended;
begin
c := 0;
ActSize := 0;

if FileExists(FileName) then
begin


AFile := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
try


// Datei konnte geöffnet werden
MD5Init(Context);

      FSize := AFile.Size; // Dateigröße in Byte

      if FSize <> 0 then
      begin
      Panel.Visible := True;
      OKBtn.Enabled := False;
      UserEdit.Enabled := False;

      Blocks := FSize div MAX_Buffer; // Anzahl max. Blöcke
      Last  := FSize mod MAX_Buffer; // Größe des Rest-Puffer

      if Last <> 0 then
      inc(Blocks); // sofern, unser Restpuffer ungleich 0 Byte groß ist, wird unsere Blockvariable um 1 erhöht

      f := 100 / Blocks;

      for i := 0 to Blocks -1 do // Blöcke einlesen
      begin

        if CancelProcess then
        Break;

        AFile.Position := ActSize; // Start-Position in Byte (wird von Block zu Block angepasst)

        inc(ActSize, MAX_Buffer);
        if ActSize <= FSize then
        BufferSize := MAX_Buffer else
        BufferSize := Last;

        c := c + f;

        ProgressBar.Position := Round(c);
        Application.ProcessMessages;

        AFile.ReadBuffer(Buffer[1], BufferSize);
        MD5Update(Context, @Buffer, BufferSize);
      end;

      end;



if CancelProcess then
Result := '' else
begin
  MD5Final(Context, Dig);
  Result := MD5Print(Dig);
end;


finally
      AFile.Free;
      Panel.Visible := False;
      OKBtn.Enabled := True;
      UserEdit.Enabled := True;
    end;
end;
end;

Luckie 28. Jul 2005 18:33

Re: FileClose und CloseFile schliesst Datei nicht?
 
Das kann nicht sein. Entweder wird der Code nie aufgerufen oder in deinem MD5 Code wird die Datei noch mal geöffnet und nicht wieder geschlossen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 Uhr.
Seite 1 von 2  1 2      

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