Entwickler-Ecke

Sonstiges (Delphi) - xcopy im Delphi-Programm benutzen und mitschreiben


pwsolaris - Mi 13.07.11 13:18
Titel: xcopy im Delphi-Programm benutzen und mitschreiben
Hallo,

ich habe mal wieder eine eher einfache Frage.

Ich möchte ein BackUp Programm für mich privat schreiben, welches mit dem Befehl "xcopy" arbeitet.
Bisher habe ich das immer über eine BAT Datei gelöst.

In meinem Programm möchte ich nur das Quell- und Ziellaufwerk auswählen und dann mit einem Button alle Dateien der Quelle auf das Ziellaufwerk sichern.
Zudem möchte ich den Sicherungsprozess mitloggen.

Wenn ich xcopy über die Eingabeaufforderung starte, sehe ich ja auch immer welche Datei er momentan kopiert usw. Diese Ausgabe möchte ich in meinem Programm in einem Memo-Feld verwirklichen und zudem auch in einer Text-Datei speichern.

Wie ich den Befehl xcopy aufrufe ist mit bekannt. Mir geht es hier vielmehr um das Anzeigen des xcopy- Status.

Kann mir einer von euch sagen, wie ich die Ausgabe über meine Programmoberfläche am besten umsetzen kann?


bummi - Mi 13.07.11 14:03

Shellexecute und und Datei umleiten per >>
oder etwas in der Art: ConsoleThread ist im Anhang

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
implementation
uses ConsoleThread;


var
  cs:TConsoleThread;

Procedure TheCallBack(s:AnsiString);
var
  ansi:WideString;
begin
  Setlength(ansi,length(s));
  OemToChar (@s[1],@ansi[1]);
  ansi := StringReplace(StringReplace(ansi,#9689,#10,[rfReplaceAll]),#9834,#13,[rfReplaceAll]);
  Form1.Memo1.Text:=Form1.Memo1.Text+ansi;
  Form1.Memo1.Perform(EM_LineScroll, 0 , Form1.Memo1.Lines.Count-1);

end;

procedure TForm1.Button7Click(Sender: TObject);
begin
   cs := TConsoleThread.Create('cmd /C xcopy C:\temp\*.txt C:\temp\kill /Y'#13#10'','',TheCallBack);  // ACHTUNG CMD nur so
   cs.Resume;
end;


zuma - Mi 13.07.11 14:40

ganz simple variante


Delphi-Quelltext
1:
xcopy C:\temp\*.txt                    

erweitern zu

Delphi-Quelltext
1:
xcopy C:\temp\*.txt c:\Zielordner /y > DeinLogDateiName.txt                    

Dann im Prog einfach die Datei 'DeinLogDateiName.txt' in ein Memo einlesen


Martok - Mi 13.07.11 15:01

Noch simpler: suche mal nach TDosCommand.

EDIT: wobei ich grade sehe, TConsoleThread ist schon da. Das reicht dann ja ;)


Delete - Do 14.07.11 06:38

XCOPY ?
Das halte ich für keine gute Idee.
XCOPY ist uralt und hat nur eingeschränkte Möglichkeiten.

Guckst Du hier (Source+EXE):
http://delphi.about.com/library/weekly/aa033004a.htm


Martok - Do 14.07.11 09:42

Spricht doch nix dagegen, das zu nutzen wenn es alles kann was der OP will.

Gut, ich verwende in meiner Sync-Lösung auch Robocopy (mit Wrapper-Skripten), aber das halt weil ich /MIR gebraucht hab ;)


Delete - Do 14.07.11 10:07

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
XCOPY ist uralt und hat nur eingeschränkte Möglichkeiten.

Was hat das alter eines Programms mit seiner Funktionalität zu tun? Es wird noch immer von Microsoft zu seinen Betriebssystemen ausgeliefert. Warum soll man es also nicht nutzen? Und wenn es das tut, was verlangt wird, warum dann ein anderes nutzen? Oder würdest du mir auch empfehlen Photoshop für mehrere tausend Euro zu kaufen nur, um Bilder etwas nachzuschärfen und rote Augen zu korrigieren? :roll:

Aber was ganz anderes? Warum wird da jetzt ein Delphi Programm drumherum gebastelt? Wenn ich schon ein Delphi Programm dafür schreibe, dann kann ich doch auch gleich die passenden API Funktionen nutzen. Wenn ich doch nur wieder ein Konsolenprogramm aufrufe, kann ich doch auch bei dem Batchscript bleiben.


Nersgatt - Do 14.07.11 10:10

Ich finde, für ein Anfängerprojekt ist ein Wrapper für eine Konsolenanwendung durchaus ein schönes Projekt. Und wenn dann auch noch was einigermaßen nützliches rauskommt - um so besser.
Ich hab auch mal vor 15 Jahren damit angefangen, einen Wrapper für ein MP3-Konvertierungstool in VB zu programmieren. Also, why not?
Dass man es als etwas erfahrener Programmierer vielleicht anders machen würde steht auf einem anderen Blatt.