Einzelnen Beitrag anzeigen

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