Einsteigerfragen zur PROFAN Programmierung
  Suchen
 Zurück zur Übersicht
 AutorThema: Kopieren von Verzeichnissen
Werner Wagner
Datum:17.07.02 19:52 Antwortenals Email verschicken (ww.wbn@t-online.de) 


Hallo zusammen,

habe wieder mal ein Problem. Bin dabei ein Programm zu schreiben bei dem es erforderlich ist ganze Verzeichnisse zu kopieren. Wollte das mit dem Aufruf von XCOPY lösen. Ich hatte jedoch Ärger mit langen Datei bzw. Verzeichnisnamen. Das habe ich mit @LongName$ bzw. @ShortName$ gelöst. Doch dann bekam ich ein anderes Problem. Da die Verzeichnisnamen ausgelesen werden und Leerzeichen enthalten können ( das kann ich leider nicht vermeiden ), führt XCOPY den Kopiervorgang nicht aus ( trotz Längenwandlung ). Außerdem sollte man sich langsam von MS DOS verabschieden. Ich habe es dann mit dem internen copy Befehl versucht und mit @FindFirst$(S) - @FindNext$() jede Datei einzeln kopiert. Da hatte ich Probleme mit dem eigenen Verzeichnis und den Unterverzeichnissen, die als [.] und [..] erschienen sind und eine Fehlermeldung verursachten. Das habe ich dann auch noch gelöst:
neq$(quell$,"[.]"),neq$(quell$,"[..]"). Das funktioniert zwar, doch erscheint mir alles recht umständlich.
Da auch am Ziel erst alle Verzeichnisse angelegt werden müssen.

Kennt jemand eine einfachere Lösung ? Am schönsten wäre ein neuer Befehl "DIRCOPY" . . . ( Hallo Herr Hülsmann, das wäre doch was für Weihnachten ).

mfg.

Werner



Martin Pohl
Datum:17.07.02 21:47 Antwortenals Email verschicken (bananenfresser@msn.com) 


Am Anfang würde ich SetLFN 1 schreiben, das aktiviert lange Datei- und Verzeichnisnamen. Die Namen sollten auch mit Gänsefüsschen versehen werden, Beispiel: "Name von Verzeichnis", denn dann dürften auch keine Probleme mit Leerzeichen entstehen. Und dann halt das übliche Kopieren. Das müsste meiner Meinung nach klappen.

Gruß, Martin


Werner Wagner
Datum:18.07.02 17:42 Antwortenals Email verschicken (ww.wbn@t-online.de) 


Hallo,

zuerst mal Danke für die schnelle Antwort !!!

Das Problem sind nicht die langen Verzeichnisnamen ( die habe ich "zerkleinert" ). Mein Problem sind die Leerzeichen im String des Verzeichnisnamens ( der wird aus einer Datenbank ausgelesen ). Diese Namen enthalten oft Leerzeichen. Z.B. "Fa. Meier und Co KG". Das würde dann so aussehen: "Fa. Me~1".
Das Leerzeichen hinter "Fa." bereitet XCOPY Probleme.
Beseitigt SetLFN N dieses Problem ??? Ich werde es testen.

Der profaninterne Copy Befehl kann das leisten ( lange Verzeichnisnamen incl. Leerzeichen ), jedoch erscheint mir das Filtern der Dateinamen ( [.] und [..] müssen raus ), das Anlegen der Zielverzeichnisse ( wenn das Quellverzeichnis einige Unterverzeichnisse hat, muss ich diese erst am Ziel anlegen ) und das Auslesen der einzelnen Dateien aus dem Quellverzeichnis ( und dessen Unterverzeichnissen ) reichlich kompliziert. Da ist XCOPY schon einfacher ( wenn das Leerzeichen - Problem nicht wäre).

Ich denke, dass wird auf eine Inc Datei hinauslaufen. Aber vielleicht gibt es ja noch eine elegantere und einfachere Lösung ?

mfg.

Werner



Mathias Kranze
Datum:18.07.02 17:58 Antwortenals Email verschicken  


Wieso machst du es nicht so:

Lese das Verzeichnis aus, lasse alle dateien in eine liste auflisten, lese dann aus wieviele einträge die liste hat, lese immer einen eintrag aus und kopiere diesen mit copyto


Werner Wagner
Datum:18.07.02 19:00 Antwortenals Email verschicken (ww.wbn@t-online.de) 


Hallo,

ebenfalls Danke für die Antwort !!!

Weil meine Quellverzeichnisse mitunter viele Unterverzeichnisse haben. Diese können auch wieder Unterverzeichnisse enthalten. Ich brauche die Struktur des gesamten Zielsordners ( incl. Unterverzeichnisse ) gleich der des Quellordners. Der gesamte Kopiervorgang soll durch ein einziges Ereignis gestartet werden. Wie soll ich das in einen Quellcode umsetzen ? Mir fehlt ein guter Einfall.
Bei XCOPY wird die gesamte Verzeichnisstruktur durch den Zusatz /s beim Kopieren übernommen.

mfg.

Werner




Mathias Kranze
Datum:18.07.02 19:09 Antwortenals Email verschicken  


mhhhh, hab das wird wohl ein problem.......

willlste das ganze verzeichnis mit unterordner kopieren oder willste alle dateien, die sich in den ordner, unterordenr usw, befinden in ein verzeichnis kopieren?


Werner Wagner
Datum:18.07.02 20:22 Antwortenals Email verschicken  


Im Prinzip würde es ausreichen den Inhalt des Quellverzeichnisses und dessen Unterverzeichnissen auszulesen und direkt in ein Zielverzeichnis zu kopieren. Das kann aber zu Problemen führen, da Dateinamen gleich sein könnten. So lange diese in Unterverzeichnissen liegen ist das kein Problem. Will man sie aber in einen einzigen Ordner legen, gebe es Überschneidungen. Also ist es doch sinnvoller die Struktur zu übernehmen. Ganz schön verzwickt oder ???

Am einfachsten wäre eine fertige Lösung die genau das macht
( z.B. ein Api Aufruf ). Ich kenne aber ( außer XCOPY ) keine, welche diese Aufgabe bewältigen könnte. Doch leider gibt es damit ( wie schon erwähnt ) andere Probleme.

mfg.

Werner


Werner Wagner
Datum:25.07.02 10:55 Antwortenals Email verschicken (W.Wbn@t-online.de) 


Hallo,

hier habe ich eine VB Routine ausgegraben. Kann die jemand umsetzen ? Ich muss das noch üben.
mfg.

Werner

Attribute VB_Name = "Module1"
Option Explicit

Public Type SHFILEOPSTRUCT
hWnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAborted As Boolean
hNameMaps As Long
sProgress As String
End Type

Public Const FO_MOVE = &H1
Public Const FO_COPY = &H2
Public Const FO_DELETE = &H3
Public Const FO_RENAME = &H4

Public Const FOF_SILENT = &H4
Public Const FOF_RENAMEONCOLLISION = &H8
Public Const FOF_NOCONFIRMATION = &H10
Public Const FOF_SIMPLEPROGRESS = &H100
Public Const FOF_ALLOWUNDO = &H40

Public Declare Function SHFileOperation _
Lib "shell32.dll" Alias "SHFileOperationA" _
(lpFileOp As SHFILEOPSTRUCT) As Long


Public Declare Function SHGetPathFromIDList _
Lib "shell32.dll" Alias "SHGetPathFromIDListA" _
(ByVal pidl As Long, ByVal pszPath As String) As Long

Public Declare Function SHGetSpecialFolderLocation _
Lib "shell32.dll" _
(ByVal hwndOwner As Long, _
ByVal nFolder As Long, _
pidl As Long) As Long

Public Declare Function SHBrowseForFolder _
Lib "shell32.dll" Alias "SHBrowseForFolderA" _
(lpBrowseInfo As BROWSEINFO) As Long

Public Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type

Public Const NOERROR = 0
Public Const CSIDL_DESKTOP = &H0
Public Const BIF_RETURNONLYFSDIRS = &H1
Public Const BIF_STATUSTEXT = &H4
Public Const BIF_RETURNFSANCESTORS = &H8

Public FLAG&



Sven Schmidts
Datum:25.07.02 12:57 Antwortenals Email verschicken (schmidts@flat2serv.de) 


Soweit ich das erkennen kann, nutzt dieser VB-Code garnichts. Er ist dafuer da, dass

A) Dateien in den Papierkorb geloescht werden und
B) Die landesspezifischen Ordner (c:\programme usw.) ermittelt werden

Eine Funktion in Profan² einzubauen, welche alle Verzeichnisse inkl. Unterverzeichnisse kopiert, macht genausoviel Sinn wie die implementierung von Sleep().

Zur vorgehensweise:

- Alle Dateien aus den Unterpfaden inkl. Dir-Namen ermitteln
- Neue Pfade auf 2. Platte erstellen, ggf. die zugeh. Pfade ermitteln
- Die Dateien reinkopieren

Es liegt nicht an Profan², es würde also durch DLL's (Prospeed o.ä.) nur beschleunigt werden, es lässt sich aber durchaus mit Prf. lösen.

Mfg.
Sven Schmidts

PS: Bei XCopy32 Dateinamen in " übergeben und schon geht's ;)


Jörg Sellmeyer
Datum:25.07.02 14:26 Antwortenals Email verschicken (joerse@gmx.de) 


Hallo Werner,
In Prfellow gibt es eine Vorlage namens FOLDCOPY.PRV.
Die macht genau was Du suchst.
Gruß
Jörg


Jörg Sellmeyer
Datum:25.07.02 16:14 Antwortenals Email verschicken (joerse@gmx.de) 


Hallo,
Jetzt hat's mir keine Ruhe gelassen und ich hab mal mit reinen Profanmitteln
eine Routine zum Verzeichnis kopieren geschrieben.
Def CharCount(2) int(Sub(Len(@$(1)),Len(translate$(@$(1),@$(2),""))))
Def VerzeichnisTiefe(1) int(Sub(Len(@$(1)),Len(Translate$(@$(1),"\\",""))))
Def PfadTeil(2) SubStr$(@$(1),@%(2),"\\")'Vorher sollte man die Verzeichnistiefe ermitteln
Def DateiName(1) SubStr$(@$(1),VerzeichnisTiefe(@$(1)) + 1,"\\")
Def DateiPfad(1) Translate$(@$(1),"\\" + DateiName(@$(1)),"")
Declare ZielVerzeichnis$,ZielOrdner$,QuellVerzeichnis$


Set("Errorlevel",-1)
'Sonst bricht Copy mit Fehlermeldung ab - evtl. sichern und zurücksetzen

Proc CopyDir
	Parameters Quelle$,Ziel$
	Declare tmpVerzeichnis$,Datei$,ZielDatei$
	Declare FileListBox&
	FileListBox&=CreateSortedListBox(%hwnd,"",200,10,400,400)
	'Die Listbox kann natürlich auch unsichtbar sein
	ChDir QuellVerzeichnis$ + "\\"
	AddFiles * "*.*"
	MoveListToList(FileListBox&)
	MkDir ZielVerzeichnis$
	
	WhileLoop 0,Getcount(FileListBox&) - 1
		Datei$=GetString$(FileListBox&,&Loop)
		ZielDatei$=Translate$(Datei$,QuellVerzeichnis$,ZielVerzeichnis$)
		Copy Datei$ > ZielDatei$
		If %ioresult
			tmpVerzeichnis$=DateiPfad(ZielDatei$)
			MkDir tmpVerzeichnis$
			While %IoResult
				tmpVerzeichnis$=DateiPfad(tmpVerzeichnis$)
				MkDir tmpVerzeichnis$
			Wend
			
			Copy Datei$ > ZielDatei$
		EndIf
	Wend
	DestroyWindow(FileListBox&)
EndProc

Cls
QuellVerzeichnis$=ChooseDir$("Bitte Verzeichnis wählen")
QuellVerzeichnis$=Left$(QuellVerzeichnis$,Len(QuellVerzeichnis$) - 1)
'letzten Backslash entfernen
ZielVerzeichnis$=InPut$("Bitte neues Verzeichnis eingeben","Eingabe",QuellVerzeichnis$)
ZielOrdner$=DateiName(ZielVerzeichnis$)
CopyDir QuellVerzeichnis$,ZielVerzeichnis$
Print "Fertig"
WaitInput

Gruß
Jörg



Werner Wagner
Datum: 25.07.02 20:36 Antwortenals Email verschicken (w.wbn@t-online.de) 


Hallo Sven,

Die VB Routine ist nur ein Ausschnitt, ich maile dir mal die komplette.
XCOPY32 Dateinamen mit " übergeben - So einfach kanns gehen ( oh Schande ). Zu meiner Ehrenrettung sei gesagt, ich habe seit MS DOS 3.3 und damaliger Anschaffung des Norton Commander 2X aufgehört lange DOS Befehlszeilen zu tippen.
Super Tip. Danke !!!

Hallo Jörg,

ich habe auch angefangen eine Routine zu schreiben, habe aber
noch nicht den richtigen Faden gefunden. Deine läuft super !!!
Hut ab, da muss ich wohl noch ein bischen üben. Aber ich arbeite dran :o). Das ist das tolle an diesem Forum, hier trifft man Leute die wissen wie´s geht.

mfg.

Werner




 Zurück zur Übersicht
 

 Ein kostenloses WebMart Forum
WebMart Homepage Tools kostenlos
doteu.info: Don´t miss your .eu-Domain