AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Schreibgeschützte Dateien kopieren?

Ein Thema von romber · begonnen am 3. Sep 2006 · letzter Beitrag vom 3. Sep 2006
Antwort Antwort
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.163 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Schreibgeschützte Dateien kopieren?

  Alt 3. Sep 2006, 10:44
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!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Schreibgeschützte Dateien kopieren?

  Alt 3. Sep 2006, 11:01
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Schreibgeschützte Dateien kopieren?

  Alt 3. Sep 2006, 11:01
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...
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#4

Re: Schreibgeschützte Dateien kopieren?

  Alt 3. Sep 2006, 11:10
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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.262 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Schreibgeschützte Dateien kopieren?

  Alt 3. Sep 2006, 12:29
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#6

Re: Schreibgeschützte Dateien kopieren?

  Alt 3. Sep 2006, 13:27
moin moin,

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.


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;
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.262 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Schreibgeschützte Dateien kopieren?

  Alt 3. Sep 2006, 13:40
Moin bigg,

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...
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf