Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schreibgeschützte Dateien kopieren? (https://www.delphipraxis.net/76377-schreibgeschuetzte-dateien-kopieren.html)

romber 3. Sep 2006 10:44


Schreibgeschützte Dateien kopieren?
 
Hallo!

Ich habe einen Tipp bei "Swissdelphicenter" gefunden, wie mann eine Datei mit Fortschrittsanzeige kopiert.

Delphi-Quellcode:
procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string);
var
  FromF, ToF: file of byte;
  Buffer: array[0..4096] of char;
  NumRead: integer;
  FileLength: longint;
begin
  AssignFile(FromF, Source);
  reset(FromF);
  AssignFile(ToF, Destination);
  rewrite(ToF);
  FileLength := FileSize(FromF);
  with Progressbar1 do
  begin
    Min := 0;
    Max := FileLength;
    while FileLength > 0 do
    begin
      BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
      FileLength := FileLength - NumRead;
      BlockWrite(ToF, Buffer[0], NumRead);
      Position := Position + NumRead;
    end;
    CloseFile(FromF);
    CloseFile(ToF);
  end;
end;
Diese Code schlägt aber fehl, wenn die Quelldatei (z.B. auf einer CD) schreibgeschützt ist. Wie kann ich die Code so modernisieren, dass es auch für schreibgeschützte Dateien tauglich ist?

Danke!

SirThornberry 3. Sep 2006 11:01

Re: Schreibgeschützte Dateien kopieren?
 
Das ganze schlägt fehl wei du die Datei exclusiv öffnest. Zudem würde ich, wenn man Object-Pascal programmiert, die Verwendung der Klasse TFileStream empfehlen.

Muetze1 3. Sep 2006 11:01

Re: Schreibgeschützte Dateien kopieren?
 
Schau dir mal die Variable Delphi-Referenz durchsuchenFileMode an - aber vergess nicht, sie nach dem Öffnen zurück zu setzen.

Oder stell es auf TFileStream um, das wäre eh die bessere Alternative...

bigg 3. Sep 2006 11:10

Re: Schreibgeschützte Dateien kopieren?
 
moin,

ich persönlich kann nur immer wieder sagen benutzt die Funktionen: FileOpen(), FileRead(), FileSeek() und FileClose(). Diese Funktionen können auch Dateien verwalten, die größer als 4 Gb sind. Außerdem ist die Benutzung mit diesen Funktionen nicht ganz so umständlich, wie TFileStream oder BlockRead/Write/Seek etc.

Christian Seehase 3. Sep 2006 12:29

Re: Schreibgeschützte Dateien kopieren?
 
Moin bigg,

auch TFileStream kann, zumindest ab D7 (D6?), auch mit grossen Dateien umgehen.

Was das Handling angeht:
TFileStream kapselt die von Dir genannten Funktionen, die wiederum nur die zugrunde liegenden API-Funktionen kapseln.

Wenn ich jetzt, beispielsweise, die Dateigrösse benötige, finde ich es praktischer die Eigenschaft Size von TFileStream zu benutzen, als sie mir mit Hilfe einer weiteren Funktion auszulesen.

bigg 3. Sep 2006 13:27

Re: Schreibgeschützte Dateien kopieren?
 
moin moin, :)

Zitat:

Zitat von Christian Seehase
Was das Handling angeht:
TFileStream kapselt die von Dir genannten Funktionen, die wiederum nur die zugrunde liegenden API-Funktionen kapseln.

Wenn ich jetzt, beispielsweise, die Dateigrösse benötige, finde ich es praktischer die Eigenschaft Size von TFileStream zu benutzen, als sie mir mit Hilfe einer weiteren Funktion auszulesen.

Richtig, allerdings finde ich die Fehlerbehandlung in der Klasse ("TFileStream") nicht sehr gut gelöst. Wie fängt man beispielsweise einen Fehler beim Öffnen einer Datei ab, wenn sie sich nicht öffnen läßt?. Das pandant zu FileOpen() wäre bei der Klasse "TFileStream" die Methode Create() und genau hier könnte es knallen, wenn die Datei bereits geöffnet ist. Was macht man also: Man verschachtelt das ganze mit try..except und try..finally? Oder du zeigst mir, wie man es anders lösen könnte. :mrgreen:


PS: Hier noch eine Funktion die Hagen mal gepostet hatte, um Dateigrößen < 4 GB zu lesen:

Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
// Größe einer Datei ermitteln (auch Dateien über 4 GB)
////////////////////////////////////////////////////////////////////////////////

function GetFileSize(const FileName: String): Int64;
var FileHandle: Cardinal; var Data: WIN32_FIND_DATA;
begin
  Result := -1;
  FileHandle := FindFirstFile(PChar(FileName), Data);
  try
    if FileHandle > 0 then
    begin
      Int64Rec(Result).Hi := Data.nFileSizeHigh;
      Int64Rec(Result).Lo := Data.nFileSizeLow;
    end;
  finally Windows.FindClose(FileHandle);
  end;
end;

Christian Seehase 3. Sep 2006 13:40

Re: Schreibgeschützte Dateien kopieren?
 
Moin bigg,

Zitat:

Zitat von bigg
Man verschachtelt das ganze mit try..except und try..finally? Oder du zeigst mir, wie man es anders lösen könnte.

Nun ja, man könnte vor dem Create ein CreateFile mit den gleichen Zugriffen ausführen. Klappt das kann TFileStream.Create eigentlich auch nicht mehr fehlschlagen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 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