Ganzes Verzeichnis kopieren [ERLEDIGT]

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
wibo050447
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Di, 22. Jul 2008 18:27

Ganzes Verzeichnis kopieren [ERLEDIGT]

Beitrag von wibo050447 »

Hallo,

hat jemand eine Ahnung wie man ein ganzes Verzeichnis einschl. aller Dateien
und Unterverzeichnisse aus einer Anwendung kopiert.

Im voraus schon besten Dank
Wilfried
Zuletzt geändert von wibo050447 am Do, 19. Mai 2011 16:45, insgesamt 1-mal geändert.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Ganzes Verzeichnis kopieren

Beitrag von Tom »

Das geht am einfachsten, indem man eine Funktion schreibt, die mit dem zu sichernden Pfad und dem Zielpfad aufgerufen wird. Sie holt sich den Inhalt des Pfades mit

aInhalt := Directory(cPfad,'D')

in ein Array und arbeitet dieses ab. Wenn aInhalt[x,F_ATTR] 'D' ist (und nicht den Namen "." oder ".." hat), wurde ein Unterverzeichnis vorgefunden, in diesem Fall ruft sich die Funktion selbst mit dem Pfad zu diesem Unterverzeichnis auf (rekursive Sicherung). Ansonsten handelt es sich um Dateien, die einfach z.B. mit FileCopy() wegkopiert werden. Feddisch. Ist ein Zehnzeiler. Ach so: DIRECTRY.CH includieren (für die Spaltenbezeichnungen im Array)!
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Ganzes Verzeichnis kopieren

Beitrag von brandelh »

Hi,

ich habe sowas zum Löschen kompletter Pfade geschrieben (Wissensbasis), eventuell ist da auch was zum Kopieren.
Hat Jimmy nicht auch was mit Windowsanzeige veröffentlicht ?
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Ganzes Verzeichnis kopieren

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Hat Jimmy nicht auch was mit Windowsanzeige veröffentlicht ?
meinst du das kopieren mit der SHfile API ? damit kann man die Windows "Copy - Animation" bekommen.

ich müsste erst im Source nachsehen, aber ich "denke" das man da auch erst "recursive" alle Filenamen "einsammeln" muss um die dann zu übergeben.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Ganzes Verzeichnis kopieren

Beitrag von brandelh »

ansonsten, ein RUNSHELL() auf XCOPY hat auch was ;-)
Gruß
Hubert
wibo050447
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Di, 22. Jul 2008 18:27

Re: Ganzes Verzeichnis kopieren

Beitrag von wibo050447 »

Vielen Dank für die schnellen Antworten.

Ich habe diese Vorschläge schon alle in meine Anwendung implementiert, insbesondere das von Tom.
Hatte die Vorstellung das dies eventuell einfacher zu realisieren wäre.

Der Vorschlag, mit XCOPY aus einer Anwendung heraus scheitert bei mir, bei wegen Übergabe
des Ursprungs- und Zielverzeichnisses.

Muss dann wohl wie Toms Vorschlag weiterverfahren.

Nochmals vielen Dank an alle.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Ganzes Verzeichnis kopieren

Beitrag von brandelh »

wibo050447 hat geschrieben: Der Vorschlag, mit XCOPY aus einer Anwendung heraus scheitert bei mir, bei wegen Übergabe
des Ursprungs- und Zielverzeichnisses.
warum das, eventuell muss man beide nur in " einschließen, falls Blanks darin sind.

Code: Alles auswählen

xcopy "D:\Von dieser Quelle\*.*" "e:\Auf das Ziel" /S ...
Man kann auch eine CMD Datei erzeugen und diese Batchdatei aufrufen.

Allerdings ist die Integration in ein eigenes Programm schöner und man kann genauer z.B. den Verlauf anzeigen.
Gruß
Hubert
Benutzeravatar
Friedhelm
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 46
Registriert: Sa, 08. Apr 2006 17:20
Wohnort: Leverkusen
Kontaktdaten:

Re: Ganzes Verzeichnis kopieren

Beitrag von Friedhelm »

Versuchs doch mal mit dem Windows API Call MoveFile. Wenn das Quell- und Zielverzeichnis auf der gleichen physikalichen Datenträger sitzt geht dies viel schneller und einfacher:

Code: Alles auswählen

*-- FUNCTION -----------------------------------------------------------------
*         Name: MoveFile()            Docs: Friedhelm Goeder
*  Description: Moves a file, other as CopyFile this function is much faster
*       Author: Friedhelm Goeder
* Date created: 01.04.2010            Date updated: þ01.04.2010
* Time created: 13:56:03              Time updated: þ13:56:03
*    Copyright: TOBAX Software GmbH - Germany
*-----------------------------------------------------------------------------
*    Arguments: cFile
*             : cDestDir
* Return Value: nResult
*     See Also:
*-----------------------------------------------------------------------------
FUNCTION MoveFile(cFile, cDestDir)
LOCAL hDLL := DLLLoad("Kernel32.DLL")
LOCAL nResult := -1
   IF hDLL > 0
      nResult := DLLCall(hDll, DLL_STDCALL, "MoveFileA", @cFile, @cDestDir)
      IF nResult = 0
         nResult := DllCall(hDll,DLL_STDCALL, "GetLastError")
      ENDIF
      DLLUnload(hDll)
   ENDIF
RETURN nResult
Gruß Friedhelm
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Ganzes Verzeichnis kopieren

Beitrag von Tom »

@Friedhelm: MoveFile bewegt - wie der Name sagt - Dateien und Ordner. Die Quelle verschwindet, existiert also anschließend nicht mehr. Diese Funktion ist deshalb so schnell, weil nur die FAT geändert wird, Daten werden nicht wirklich umgeschaufelt. Kleiner Hinweis: Durch das Laden und Entladen von KERNEL32.DLL innerhalb der Funktion entstünde bei mehrfachen Aufrufen nacheinander eine künstliche Bremse. Es wäre also, wenn es schon um Speed geht, m.E. günstiger, diesen Prozess auszulagern.

XCOPY ist nicht ganz ungefährlich. Erstens gibt es keine vernünftige Rückmeldung, zweitens ist möglich, dass über die Rechtesteuerung solche Zugriffe überhaupt nicht möglich sind, und drittens kann auch sein, dass findige Administratoren die XCOPY.EXE gar gelöscht haben. Alles schon gesehen.

Wenn man eine Funktion wie oben skizziert einmal geschrieben hat, steht sie für alle Varianten zur Verfügung, kann um Fortschrittsanzeigen usw. ergänzt werden. Ich verstehe nicht ganz, warum das so unbefriedigend sein soll. Man hat die volle Kontrolle, und vergleichsweise schnell ist es auch.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Ganzes Verzeichnis kopieren

Beitrag von AUGE_OHR »

wibo050447 hat geschrieben:hat jemand eine Ahnung wie man ein ganzes Verzeichnis einschl. aller Dateien
und Unterverzeichnisse aus einer Anwendung kopiert.
hier mal die SH API von Pablo umgesetzt mit der Ot4xb.
SHFILEOPERATION.zip
(2.33 KiB) 249-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Ganzes Verzeichnis kopieren

Beitrag von AUGE_OHR »

hi,

ich habe gerade bemerkt das Pablo "nur" 80MB anlegt ... das ist zum "sehen" viel zu wenig bei einem modernen PC ...

man sollte es mal mit 800MB ausprobieren was paar Sekunden dauert ;)

was nun die Frage von Wilfried angeht : so wie es aussieht werden Sub-Directorys mit kopiert !


ich habe einen NC Clone mit 2x FBrowse (c:\ALASKA\XPPW32\Source\samples\basics\GuiBrow\FBROWSE.prg)
ich habe noch eine Array Colume wo ich die "Markierung" als "*" eintrage die ich per SH Copy/Move/Del API bearbeiten will.

Code: Alles auswählen

FUNCTION COPYFILES(oBrowse,oTarget,lConfirm) // SHFile Function
LOCAL RetVar   := .T.
LOCAL aSource   := {}
LOCAL oSHF     := SHFile():new(oBrowse):create()
LOCAL aArray   := oBrowse:cargo
LOCAL nSel     := aArray[ ARR_SORT, aArray[ ARR_NO ] ]
LOCAL aFile    := aArray[ ARR_SRC , nSel ]
LOCAL cPath    := aArray[ ARR_PATH ]
LOCAL aTarget  := {}
LOCAL cTarget  := oTarget:cargo[ ARR_PATH ]
LOCAL i,iMax

DEFAULT lConfirm TO .T.

   IF PCount() < 2
// falsche Anzahl Parameter
      RETURN .F.
   ENDIF

   IF aFile[1] = ".."
// das ist kein Verzeichniss ( sondern heist zurück zur höheren Verzeichniss )
      RETURN .F.
   ENDIF
//
// man sollte prüfen ob das "Ziel" erreichbar ist ...
//
   IF IsOkDir(cTarget)
   ELSE
      RETURN .F.
   ENDIF

   iMax := LEN(aArray[ ARR_SRC ] )
   FOR i := 1 TO iMax
// 
// markierte Elemente aufnehmen
// "full" Path notwendig !!!
//       
      IF "*" $ aArray[ ARR_SRC, i ] [ 11 ]
         AADD(aSource, cPath+aArray[ ARR_SRC, i ] [ F_NAME ] )
      ENDIF
   NEXT

   iMax  := LEN(aSource)
//
// nichts markiert, also nimmt das Element wo der Cursor steht
//
   IF iMax = 0
      AADD(aSource, cPath+aFile[ F_NAME ] )
      iMax  := 1
   ENDIF
   i     := 1
//
// alles was im "aSource" Array steht muss bei Copy/Move
// auch in "aTarget" erscheinen
//
   FOR i := 1 TO iMax
       AADD(aTarget,STRTRAN(aSource[i],cPath,cTarget))
   NEXT
//
// und das ist der API Aufruft
// "lConfirm" ist für die Abfrage(n) gedacht ( Create/Delete Yes/No )
//
   oSHF:Copy( aSource, aTarget, lConfirm )
//
// alles wieder "aufräumen"
//
   iMax := LEN(aArray[ ARR_SRC ] )
   i     := 1
   FOR i := 1 TO iMax
      IF "*" $ aArray[ ARR_SRC, i ] [ 11 ]
         aArray[ ARR_SRC, i ] [ 11 ] := " "
      ENDIF
   NEXT

   SetAppFocus(oTarget)
//
// Ziel Verzeichniss "refresh" Anzeige
//
   ChangeDirectory( oTarget , cTarget )
   oTarget:refreshAll()

   SetAppFocus(oBrowse)
   oBrowse:refreshAll()
//
// SH Object "zerstören"
//
   oSHF:destroy()

RETURN RetVar
p.s. ich benutzte die SH Class von Phil mit BAP siehe http://www.xbaseforum.de/viewtopic.php? ... lit=shfile

... und dann gibt es noch die "Tip" von Hubert http://www.xbaseforum.de/viewtopic.php? ... lit=shfile
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Ganzes Verzeichnis kopieren

Beitrag von brandelh »

Hi,

ich hatte meine Kopierfunktion noch nicht in der Wissensbasis, nur das Löschen ... das habe ich geändert ;-)

:arrow: http://www.xbaseforum.de/viewtopic.php?f=16&t=5235
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Ganzes Verzeichnis kopieren

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben:ich hatte meine Kopierfunktion noch nicht in der Wissensbasis, nur das Löschen ... das habe ich geändert ;-)
das meinte ich eigendlich nicht sondern den Thread "Windows Kontextmenü neu: Kopieren und Verschieben nach ..."

... was mich aber zu der Frage bringt warum du dir die Mühe mit dem neuen Thread machst
http://www.xbaseforum.de/viewtopic.php?f=16&t=5235

die SH API, entweder mit BAP oder Ot4xb, macht solche Sachen doch ganz einfach mit ein paar Zeilen.

Code: Alles auswählen

PROCEDURE MAIN
LOCAL aSource := {"C:\ALASKA"}
LOCAL aTarget := {"D:\ALASKA"}
   
   CopyAlaska( aSource, aTarget, .T.)

RETURN

PROCEDURE CopyAlaska(aSource, aTarget, lConfirm)
LOCAL oSHF     := SHFile():new(oBrowse):create()
   oSHF:Copy( aSource, aTarget, lConfirm )
   oSHF:destroy()
RETURN
und man bekommt auch noch die entsprechende (OS abhängig) "Copy" Animation ;)
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Ganzes Verzeichnis kopieren

Beitrag von brandelh »

Hallo Jimmy,

viel Mühe war es ja nicht und es soll Situationen geben, bei denen man keine Animationen brauchen kann (z.B. CGI Web-Anwendungen) ;-)
Gruß
Hubert
wibo050447
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 26
Registriert: Di, 22. Jul 2008 18:27

Re: Ganzes Verzeichnis kopieren

Beitrag von wibo050447 »

Hallo Auge_Ohr,

das ist es was ich gesucht hatte.
Funktoniert auf anhieb mit nur 3 Zeilen Code.

Hinweis zu Toms Vorschlage den ich ich schon umgesetzt hatte.
Dies war reativ aufwendig, da wir die Daten in vielen und unterschiedlichen Unterverzeichnissen ablegen.

Nochmals vielen Dank an alle.
Ist damit erledigt. (Wo kann man die Erledigung eintrage?)
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Ganzes Verzeichnis kopieren

Beitrag von UliTs »

Einfach in der ersten Nachricht des Themas mit Ändern bei Betreff
[ERLEDIGT]
hinzufügen.
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten