Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Betriebssystemkommandos - Dateien kopieren (https://www.delphipraxis.net/24463-betriebssystemkommandos-dateien-kopieren.html)

hildis 21. Jun 2004 14:44


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 21. Jun 2004 14:46

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.

Ratte 21. Jun 2004 15:20

Re: Betriebssystemkommandos - Dateien kopieren
 
Mach' 'ne Konsolenanwendung. Das müsste gehen.

Ratte

Muetze1 21. Jun 2004 16:53

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

hildis 22. Jun 2004 09:11

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

Tyrael Y. 22. Jun 2004 09:37

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);

Muetze1 22. Jun 2004 09:42

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

hildis 24. Jun 2004 08:00

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

Steve 24. Jun 2004 08:11

Re: Betriebssystemkommandos - Dateien kopieren
 
Hier im Forum suchenDoFileWork oder DoFileWorkDoFileWork :zwinker:
CopyFile is nur für exakt eine Datei, mit obiger Fkt. (von sakura glaub ich) gehn auch mehrere Datien, Verzeichnisse und Wildcards

Gruß
Stephan

Muetze1 24. Jun 2004 09:25

Re: Betriebssystemkommandos - Dateien kopieren
 
Moin!

Zitat:

Zitat von hildis
Tipp mit FileCopy war super. Funktioniert leider nur, wenn ich den exakten Dateinamen angebe.

Mach mir keinen Vorwurf, hatte ich drauf hingewiesen :roll:

Zitat:

Zitat von Muetze1
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.

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz