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
Antwort Antwort
hildis

Registriert seit: 20. Feb 2004
9 Beiträge
 
Delphi 7 Professional
 
#1

Betriebssystemkommandos - Dateien kopieren

  Alt 21. Jun 2004, 14:44
Hallo,

hab folgende Frage:
Wie kann ich einfache Betriebssystemkommandos unter Delphi programmieren?
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
  Mit Zitat antworten Zitat
21. Jun 2004, 14:46
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

Registriert seit: 12. Dez 2003
Ort: Erfurt
345 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Betriebssystemkommandos - Dateien kopieren

  Alt 21. Jun 2004, 15:20
Mach' 'ne Konsolenanwendung. Das müsste gehen.

Ratte
Schiffsratte der U.S.S. Delphipraxis, Laderaum 4538
BUSH:= TTerminator.create;
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Betriebssystemkommandos - Dateien kopieren

  Alt 21. Jun 2004, 16:53
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
  Mit Zitat antworten Zitat
hildis

Registriert seit: 20. Feb 2004
9 Beiträge
 
Delphi 7 Professional
 
#5

Re: Betriebssystemkommandos - Dateien kopieren

  Alt 22. Jun 2004, 09:11
Hallo Muetze1,

hab ich mir das zu einfach vorgestellt?

Hast du ein Beispiel mit Code zu FileCopy()?
Wie funktioniert das mit FileStreams?

Grup hildis
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Betriebssystemkommandos - Dateien kopieren

  Alt 22. Jun 2004, 09:37
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)

ShellExecandWait('CMD', '/c Net Start "' + NameEinesServices + '"','',SW_HIDE);
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
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
hildis

Registriert seit: 20. Feb 2004
9 Beiträge
 
Delphi 7 Professional
 
#8

Re: Betriebssystemkommandos - Dateien kopieren

  Alt 24. Jun 2004, 08:00
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
  Mit Zitat antworten Zitat
Benutzerbild von Steve
Steve

Registriert seit: 2. Mär 2004
Ort: Würzburg
730 Beiträge
 
Delphi 2006 Personal
 
#9

Re: Betriebssystemkommandos - Dateien kopieren

  Alt 24. Jun 2004, 08:11
Hier im Forum suchenDoFileWork oder DoFileWorkDoFileWork
CopyFile is nur für exakt eine Datei, mit obiger Fkt. (von sakura glaub ich) gehn auch mehrere Datien, Verzeichnisse und Wildcards

Gruß
Stephan
Stephan B.
Wer andern eine Grube gräbt ist Bauarbeiter!
Wer im Glashaus sitzt, sollte sich lieber im Dunkeln ausziehen!
Außerdem dieser Satz kein Verb...
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Betriebssystemkommandos - Dateien kopieren

  Alt 24. Jun 2004, 09:25
Moin!

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

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
  Mit Zitat antworten Zitat
Antwort Antwort


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