![]() |
[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:
Nun springe ich Byte für Byte durch die Datei bis zum Ende, anschließend schliesse ich sie.
fmOpenRead or fmShareDenyNone
Wenn ich die Datei nun umbenennen möchte, bappt mir eine Message um die Ohren. Wieso nur? :wall: |
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?
|
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. |
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.
|
Re: FileClose und CloseFile schliesst Datei nicht?
Ich habe mehrere Varianten ausprobiert:
TFileStream FileOpen AssignFile |
Re: FileClose und CloseFile schliesst Datei nicht?
Poste mal die mit dem FileStream. Ohne Code bleibt das hier ein Rumgerate. :roll:
|
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; |
Re: FileClose und CloseFile schliesst Datei nicht?
wenn du mit TFileStream arbeitest wird die Datei erst wieder freigegeben wenn du den Stream freigibst.
|
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; |
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 23:05 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