Einsteigerfragen zur PROFAN Programmierung

| Suchen
| Zurück zur Übersicht

Autor | Thema: Kopieren von Verzeichnissen
Werner Wagner
| 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
Martin Pohl
| 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
Werner Wagner
| 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
Mathias Kranze
| 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
Werner Wagner
| 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
Mathias Kranze
| 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?
Werner Wagner
| 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
Werner Wagner
| 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&
Sven Schmidts
| 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 ;)
Jörg Sellmeyer
| 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
Jörg Sellmeyer
| 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
Werner Wagner
| 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

| Zurück zur Übersicht

| Ein kostenloses WebMart Forum WebMart Homepage Tools kostenlos |