Seite 1 von 1

Dateien kopieren

Verfasst: Mi, 09. Mai 2012 12:04
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 ??

Re: Dateien kopieren

Verfasst: Mi, 09. Mai 2012 12:36
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.

Re: Dateien kopieren

Verfasst: Mi, 09. Mai 2012 12:50
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.

Re: Dateien kopieren

Verfasst: Do, 10. Mai 2012 4:22
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

Re: Dateien kopieren

Verfasst: Do, 10. Mai 2012 10:02
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.)

Re: Dateien kopieren

Verfasst: Do, 10. Mai 2012 10:39
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

Re: Dateien kopieren

Verfasst: Do, 10. Mai 2012 11:13
von HJaschke
Das folgende (ungetestet) sollte funktionieren:

Code: Alles auswählen

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

Re: Dateien kopieren

Verfasst: Do, 10. Mai 2012 12:29
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

Re: Dateien kopieren

Verfasst: Do, 10. Mai 2012 13:37
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.)

Re: Dateien kopieren

Verfasst: Do, 10. Mai 2012 14:06
von Koverhage
Rolf,

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