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