![]() |
Betriebssystemkommandos - Dateien kopieren
Hallo,
hab folgende Frage: Wie kann ich einfache Betriebssystemkommandos unter Delphi programmieren? :gruebel: Hat jemand ein Beispiel oder einen Tipp wo ich das in der Delphi-Hilfe finden kann? z.Bsp: mit Dos-Batch (Ordner anlegen und alle txt-Dateien kopieren) md c:\test copy *.txt c:\test\*.* Gruß hildis |
DP-Maintenance
Dieses Thema wurde von "Sharky" von "Internet / IP / LAN" nach "Object-Pascal / Delphi-Language" verschoben.
Ist keine Frage zu TPC und Co. Darum mal verschoben. |
Re: Betriebssystemkommandos - Dateien kopieren
Mach' 'ne Konsolenanwendung. Das müsste gehen.
Ratte |
Re: Betriebssystemkommandos - Dateien kopieren
Moin!
mk = MkDir() - gibt es als Funktion - ansonsten CreateDirectory() aus der WinAPI copy = FileCopy() - gibt es als Funktion - oder die Shell Funktion dafür nehmen - oder selber schreiben mit den FileStreams (weil: Copy ist eine Funktion die die CMD.EXE auch nicht anders macht, dazu gibt es so keinen Windows Befehl, da man nur Dateien öffnet, aus der einen liest und in die andere schreibt bis alle Daten kopiert wurden, dann Dateien schliessen). Am besten mache es mit TFileStreams, wenn du es selber machst... MfG Muetze1 |
Re: Betriebssystemkommandos - Dateien kopieren
Hallo Muetze1,
hab ich mir das zu einfach vorgestellt? Hast du ein Beispiel mit Code zu FileCopy()? Wie funktioniert das mit FileStreams? Grup hildis |
Re: Betriebssystemkommandos - Dateien kopieren
Um irgendwelche DOS-Befehle auszuführen solltest du
dir mal ShellExecandWait und ShellExec angucken. Wenn du z.B. möchtest das ein DOS Befehl in die DOS-Konsole eingegeben und ausgeführt wird ohne das eine DOS-Box erscheint gehst du beispielsweise wie folgt vor Mit diesem Beispiel wird ein Service gestartet der Befehl wird aber in eine unsichtbare DOS-Konsole eingegeben (SW_HIDE)
Delphi-Quellcode:
ShellExecandWait('CMD', '/c Net Start "' + NameEinesServices + '"','',SW_HIDE);
|
Re: Betriebssystemkommandos - Dateien kopieren
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:
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.
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'); 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:
Die Funktion ist wie gesagt ebend hier hingeschrieben und nicht getestet.
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; @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:
Sorry, mein Fehler...
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; MfG Muetze1 |
Re: Betriebssystemkommandos - Dateien kopieren
Hallo Muetze1,
Tipp mit FileCopy war super. Funktioniert leider nur, wenn ich den exakten Dateinamen angebe. Gibt es auch die Möglichkeit mit Wildcards alle Dateien eines bestimmten Ordners zu kopieren (z. Bsp. copy *.*). FileStream sieht kompliziert aus. Muss ich erst verinnerlichen. mfg hildis |
Re: Betriebssystemkommandos - Dateien kopieren
![]() ![]() CopyFile is nur für exakt eine Datei, mit obiger Fkt. (von sakura glaub ich) gehn auch mehrere Datien, Verzeichnisse und Wildcards Gruß Stephan |
Re: Betriebssystemkommandos - Dateien kopieren
Moin!
Zitat:
Zitat:
Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 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