Ganzes Verzeichnis kopieren [ERLEDIGT]
Moderator: Moderatoren
-
- Cut&Paste-Entwickler
- Beiträge: 26
- Registriert: Di, 22. Jul 2008 18:27
Ganzes Verzeichnis kopieren [ERLEDIGT]
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
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.
- Tom
- 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
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)!
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
Tom
- brandelh
- 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
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 ?
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
Hubert
- AUGE_OHR
- 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
meinst du das kopieren mit der SHfile API ? damit kann man die Windows "Copy - Animation" bekommen.brandelh hat geschrieben:Hat Jimmy nicht auch was mit Windowsanzeige veröffentlicht ?
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
Jimmy
-
- Cut&Paste-Entwickler
- Beiträge: 26
- Registriert: Di, 22. Jul 2008 18:27
Re: Ganzes Verzeichnis kopieren
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.
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.
- brandelh
- 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
warum das, eventuell muss man beide nur in " einschließen, falls Blanks darin sind.wibo050447 hat geschrieben: Der Vorschlag, mit XCOPY aus einer Anwendung heraus scheitert bei mir, bei wegen Übergabe
des Ursprungs- und Zielverzeichnisses.
Code: Alles auswählen
xcopy "D:\Von dieser Quelle\*.*" "e:\Auf das Ziel" /S ...
Allerdings ist die Integration in ein eigenes Programm schöner und man kann genauer z.B. den Verlauf anzeigen.
Gruß
Hubert
Hubert
- Friedhelm
- Cut&Paste-Entwickler
- Beiträge: 46
- Registriert: Sa, 08. Apr 2006 17:20
- Wohnort: Leverkusen
- Kontaktdaten:
Re: Ganzes Verzeichnis kopieren
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
- Tom
- 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
@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.
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
Tom
- AUGE_OHR
- 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
hier mal die SH API von Pablo umgesetzt mit der Ot4xb.wibo050447 hat geschrieben:hat jemand eine Ahnung wie man ein ganzes Verzeichnis einschl. aller Dateien
und Unterverzeichnisse aus einer Anwendung kopiert.
gruss by OHR
Jimmy
Jimmy
- AUGE_OHR
- 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
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.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
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
... und dann gibt es noch die "Tip" von Hubert http://www.xbaseforum.de/viewtopic.php? ... lit=shfile
gruss by OHR
Jimmy
Jimmy
- brandelh
- 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
Hi,
ich hatte meine Kopierfunktion noch nicht in der Wissensbasis, nur das Löschen ... das habe ich geändert
http://www.xbaseforum.de/viewtopic.php?f=16&t=5235
ich hatte meine Kopierfunktion noch nicht in der Wissensbasis, nur das Löschen ... das habe ich geändert
http://www.xbaseforum.de/viewtopic.php?f=16&t=5235
Gruß
Hubert
Hubert
- AUGE_OHR
- 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
hi,
... 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.und man bekommt auch noch die entsprechende (OS abhängig) "Copy" Animation
das meinte ich eigendlich nicht sondern den Thread "Windows Kontextmenü neu: Kopieren und Verschieben nach ..."brandelh hat geschrieben:ich hatte meine Kopierfunktion noch nicht in der Wissensbasis, nur das Löschen ... das habe ich geändert
... 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
gruss by OHR
Jimmy
Jimmy
- brandelh
- 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
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)
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
Hubert
-
- Cut&Paste-Entwickler
- Beiträge: 26
- Registriert: Di, 22. Jul 2008 18:27
Re: Ganzes Verzeichnis kopieren
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?)
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?)
-
- 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
Einfach in der ersten Nachricht des Themas mit Ändern bei Betreff
Uli
hinzufügen.[ERLEDIGT]
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück