Autor | Thema: Kopieren von Verzeichnissen | | Datum:17.07.02 19:52 
(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
|
| | Datum:17.07.02 21:47 
(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
|
| | Datum:18.07.02 17:42 
(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
|
| | Datum:18.07.02 17:58 
| |
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
|
| | Datum:18.07.02 19:00 
(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
|
| | Datum:18.07.02 19:09 
| |
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?
|
| | Datum:18.07.02 20:22 
| |
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
|
| | Datum:25.07.02 10:55 
(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&
|
| | Datum:25.07.02 12:57 
(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 ;)
|
| | Datum:25.07.02 14:26 
(joerse@gmx.de) | |
Hallo Werner,
In Prfellow gibt es eine Vorlage namens FOLDCOPY.PRV.
Die macht genau was Du suchst.
Gruß
Jörg
|
| | Datum:25.07.02 16:14 
(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
|
| | Datum: 25.07.02 20:36 
(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
|
|
|