Dateien kopieren

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Dateien kopieren

Beitrag von Rolf Ramacher »

Hallo

ich möchte ein komplettes Verzeichnis mit Unterverzeichnissen kopieren. für jedes soll in einem sep. Tag - er bringt mir den Fehler, daß er das Programm nicht finden kann. beim runshell

Code: Alles auswählen

Function Sichern(oAst,aDir,cQuellPfad,cZielPfad)
	Local nZaehler:=0, cAktVerz:="", cDatum:=dtos(date()), nPos1:=0, nPos2:=0, cVerz:=""
	
	cAktVerz:=CurDrive()+":\"+CurDir()
	CreateDir(cZielpfad+"\"+cDatum)

	runshell('/C START xcopy  (cQuellpfad)+"*.*" (cZielpfad)+"\"+cDatum+"\*.* /s" ',.t.)

cQuellPfad und cZielpfad stimmen - das Verzeichnis mit Datum wird angelegt. Habe ich noch etwas übersehen ??
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Dateien kopieren

Beitrag von Tom »

"XCOPY.EXE" (Empfehlung: ausschreiben) muss nicht unbedingt vorhanden sein (\windows\system32). Manche Adminstratoren löschen das oder klemmen es rechtemäßig ab, in einigen Windows-Versionen war es meiner Erinnerung nach überhaupt nicht enthalten.

Diese Vorgehensweise ist, hiervon abgesehen, nicht ganz ungefährlich. Du hast keine Kontrolle und prüfst auch nicht auf Erfolg.

Du kannst das mit Bordmitteln machen. Das Kommando "COPY FILE" nutzt eine Funktion "_CopyFile(<cSource>,<cTarget>), die Dateien kopiert (siehe "STD.CH"). Dann sind externe Programme oder asynchrone RunShell-Aufrufe, die eben fallweise unterbunden sein können, überflüssig.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Dateien kopieren

Beitrag von Tom »

Ach so. Die Syntax für Runshell ist falsch. Nach dem "START" folgt eigentlich der Titel der Anwendung. M.E. ist sowieso überflüssig, mit "START" zu arbeiten - XCOPY.EXE kannst Du direkt aufrufen.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Dateien kopieren

Beitrag von AUGE_OHR »

Rolf Ramacher hat geschrieben:ich möchte ein komplettes Verzeichnis mit Unterverzeichnissen kopieren. für jedes soll in einem sep. Tag - er bringt mir den Fehler, daß er das Programm nicht finden kann. beim runshell
sicherlich kann man das im CMD Fenster machen ...
eleganter wäre jedoch die Windows internen Funtionen zu benutzten ... mit Animation etc . ;)

ShFile ( Phil Ide) oder TShFileOperation ( ot4xt ) bieten doch eine Class dafür womit du einen "Ordner" ( = kpl. Verzeichniss )
kopieren/moven/löschen kannst ( ZIP und "brennen" müsste auch möglich sein ... )

hier mal ein Code Snip

Code: Alles auswählen

INLINE METHOD SHThread(cAktion,lConfirm)
LOCAL oOp   := TShFileOperation():New()  // need ot4xb
LOCAL cSourceDir := ::oLw1:cStartdir
LOCAL cTargetDir := ::oLw2:cEnddir
LOCAL aData := oObj:getdata()
LOCAL nLen  := LEN(aData)

   IF lConfirm
//    FOF_ALLOWUNDO + FOF_RENAMEONCOLLISION
      oOp:fAllowUndo         := .T.
      oOp:fRenameOnCollision := .T.
   ELSE
//    FOF_ALLOWUNDO + FOF_SILENT + FOF_NOCONFIRMATION + FOF_RENAMEONCOLLISION
      oOp:fAllowUndo         := .T.
      oOp:fSilent            := .T.
      oOp:fNoConfirmation    := .T.
      oOp:fRenameOnCollision := .T.
   ENDIF
   oOp:fWantMappingHandle := .T.

   oOp:cFrom := {}
   oOp:cTo   := {}
   //
   // können mehrere Ordner*** und/oder Datein sein
   // *** komplettes Verzeichniss
   FOR i = 1 TO nLen
      // Source
      AADD( oOp:cFrom , cSourceDir + oObj:getitem( aData[i] ))

      // Target
      IF cAktion = "DELETE"
         AADD( oOp:cTo   , "" + CHR(0) )
      ELSE
         AADD( oOp:cTo   , cTargetDir + oObj:getitem( aData[i] ) )
      ENDIF
   NEXT

   DO CASE
      CASE cAktion = "COPY"
         oOp:cTitle := "Copy Files"
         IF nLen > 1
            oOp:fMultiDestFiles    := .T.
         ENDIF
         oOp:Copy()

      CASE cAktion = "MOVE"
         oOp:cTitle := "Move Files"
         IF nLen > 1
            oOp:fMultiDestFiles    := .T.
         ENDIF
         oOp:Move()

      CASE cAktion = "DELETE"
         oOp:cTitle := "Delete Files"
         // to RecyleBin
         oOp:fAllowUndo := .T.
         oOp:Delete()

   ENDCASE
gruss by OHR
Jimmy
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Dateien kopieren

Beitrag von Rolf Ramacher »

ich habe es auch mal ohne /C START - versucht. - Meldung - Parameter hat falschen typ - irgendwo stimmt noch etwas nicht.

Code: Alles auswählen

	runshell('xcopy cQuellpfad+"*.*" cZielpfad+"\"+cDatum+"\*.* /s+" ',.t.)
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Dateien kopieren

Beitrag von Koverhage »

irgendwie alles durcheinander, zunächst solltest Du die " zählen, sollten immer gerade Zahlen ergeben.
Dann auch die unterschiedlichen Konstanten und Variablen prüfen
Meines Erachtens sollte es so sein
"xcopy "+cQuellpfad+"*.* -> usw.
Der Parameter /s+ ist mir unbekannt
Gruß
Klaus
HJaschke
Rookie
Rookie
Beiträge: 4
Registriert: Do, 17. Nov 2011 11:49

Re: Dateien kopieren

Beitrag von HJaschke »

Das folgende (ungetestet) sollte funktionieren:

Code: Alles auswählen

runshell('xcopy "' + cQuellpfad + '\*.*" "' + cZielpfad + '\' + cDatum + '\*.*" /s',.t.)
Gruss, Herbert
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Dateien kopieren

Beitrag von Rolf Ramacher »

Hallo Herbert

das funkt. leider auch nicht.

@Klaus - der xcopy- Befehlt ist eine kopierfunkt. von Windows bzw. DOS /S er nimmt die subdir mit
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
HJaschke
Rookie
Rookie
Beiträge: 4
Registriert: Do, 17. Nov 2011 11:49

Re: Dateien kopieren

Beitrag von HJaschke »

Hi Rolf,

ich hatte mir runshell nicht angeschaut. So läuft es jetzt bei mir:

Code: Alles auswählen

runshell('"' + cQuellpfad + '\*.*" "' + cZielpfad + '\' + cDatum + '\*.*" /s', "xcopy.exe", .t.)
Gruss, Herbert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Dateien kopieren

Beitrag von Koverhage »

Rolf,

das ist mir bekannt. Es ging um das + hinter dem S und die vielen ungeraden Anzahlen von ' und "!
Gruß
Klaus
Antworten