AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Betriebssystemkommandos - Dateien kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

Betriebssystemkommandos - Dateien kopieren

Ein Thema von hildis · begonnen am 21. Jun 2004 · letzter Beitrag vom 24. Jun 2004
 
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Betriebssystemkommandos - Dateien kopieren

  Alt 22. Jun 2004, 09:42
Moin!

FileCopy() ist eine Funktion aus der WinAPI und kopiert eine Datei. Im Erfolgsfall wird True zurückgegeben, ansonsten False. Der Aufruf ist einfach nur wie folgt:

Delphi-Quellcode:
  Srcfile := 'c:\diese.txt';
  DestFile := 'd:\test\diese.txt';

  If FileCopy(PChar(SrcFile), PChar(DestFile), True) Then
    ShowMessage('erfolgreich kopiert!')
  Else
    ShowMessage('nicht erfolgreich - kopieren fehlgeschlagen');
Der dritte Parameter gibt an, wie sich die Funktion verhalten soll, wenn die Zieldatei schon existiert. Wenn du True angibst, dann bricht sie in dem Falle ab, bei False überschreibt sie die Zieldatei einfach.

Diese Funktion kann nur eine Datei kopieren. Dein Beispiel mit der Batchdatei beinhaltet aber eine WildCard damit du alle auf .txt endende Dateien kopierst. Dafür musst du dann noch etwas mehr machen und alle Dateien die auf diesen WildCard passen raussuchen und die dann einzelnd durch einen Aufruf von FileCopy() kopieren. Dazu kannst du mal in die Hilfe schauen zu FindFirst(), FindNext() und FindClose(). Hier im Forum gibt es dazu auch genug Beispiele.

Nun noch zu dem kopieren von Dateien über TFileStream:
Delphi-Quellcode:
Function CopyFileByStream(Const ASourceFile, ADestinationFile : String; Const AOverwriteDest : Boolean): Boolean;
Var
  SStrm,
  DStrm : TStream;
  lRead : Integer; // ab Delphi 6 sollte dies ein Int64 sein, aber durch die Buffergrösse könnte man es auch so lassen
  lBuff : Array[Word] of Byte;
Begin
  Result := False; // erstmal davon ausgehen das es nicht klappt

  // grundsätzliches: ich habe die Funktion direkt hier mal schnell hingetippt, es könnten also Fehler drinne sein

  If FileExists(ASourceFile) And ( ( FileExists(ADestinationFile) And ( AOverwrite ) ) Or ( Not FileExists(ADestinationFile) ) Then
  Begin
    SStrm := TFileStream.Create(ASourceFile, fmOpenRead Or fmShareDenyWrite);
    Try
      If ( FileExists(ADestinationFile) ) Then
        DStrm := TFileStream.Create(ADestinationFile, fmOpenWrite Or fmShareDenyRead)
      Else
        DStrm := TFileStream.Create(ADestinationFile, fmCreate);

      Try
        Repeat
          lRead := SStrm.Read(lBuff[0], High(lBuff));
          DStrm.Write(lBuff[0], lRead);
        Until ( lRead < High(lBuff) );

        Result := True;
      Finally
        DStrm.Free;
      End;
    Finally
      SStrm.Free;
    End;
  End;
End;
Die Funktion ist wie gesagt ebend hier hingeschrieben und nicht getestet.

@Tyrael Y.: Deine Methode funktioniert aber meines Wissens nicht für interne Shell Befehle wie MD oder Copy...

/EDIT: Doof wie ich nunmal bin, habe ich doch eine zu komplizierte Stream-Kopiermethode gepostet. Die obige war extra mit einem Buffer für ein Progressbar, daher hier nochmal die einfachere Variante:

Delphi-Quellcode:
Function CopyFileByStream(Const ASourceFile, ADestinationFile : String; Const AOverwriteDest : Boolean): Boolean;
Var
  SStrm,
  DStrm : TStream;
Begin
  Result := False; // erstmal davon ausgehen das es nicht klappt

  // grundsätzliches: ich habe die Funktion direkt hier mal schnell hingetippt, es könnten also Fehler drinne sein

  If FileExists(ASourceFile) And ( ( FileExists(ADestinationFile) And ( AOverwrite ) ) Or ( Not FileExists(ADestinationFile) ) Then
  Begin
    SStrm := TFileStream.Create(ASourceFile, fmOpenRead Or fmShareDenyWrite);
    Try
      If ( FileExists(ADestinationFile) ) Then
        DStrm := TFileStream.Create(ADestinationFile, fmOpenWrite Or fmShareDenyRead)
      Else
        DStrm := TFileStream.Create(ADestinationFile, fmCreate);

      Try
        DStrm.CopyFrom(SStrm, 0);
        Result := True;
      Finally
        DStrm.Free;
      End;
    Finally
      SStrm.Free;
    End;
  End;
End;
Sorry, mein Fehler...

MfG
Muetze1
  Mit Zitat antworten Zitat
 


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 04:31 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