ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > rekursives Verzeichniskopieren | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
11.02.2012, 22:55 Uhr AGSzabo Posts: 1663 Nutzer |
Huhu, meine Routine zum rekursiven kopieren eines Files oder Verzeichnisses samt Inhalt und Subdirs funktioniert nicht richtig. Es werden zwar alle Dateien und Verzeichnisse kopiert, aber Subdirs einer Ebene landen alle ineinandner statt nebeneinander. Kann mir jemand in Pseudocode oder C oder als Erklärung schreiben wie man da vor geht (ausführlich, mit Aufruf der Amiga-Funktionen Examine(), ExNext() usw)? Oder meine Asm Routine korrigieren. Der Ausgangspunkt soll ein Filename oder Verzeichnisname sein. Dann wird entschieden, ob ein File zu kopieren oder ein Verzeichnis zu erstellen ist (Examine) ... code:recursive_copy ; (we are in source dir) ; d1 object name, may be dir or file ; d2 destpathbuffer (with path in it) STRUCTURE d,0 APTR d_objectname APTR d_objectlock APTR d_destpathbuffer APTR d_fib APTR d_newdirlock APTR d_olddir LABEL d_SIZEOF lea -d_SIZEOF(a7),a7 move.l d1,d_objectname(a7) move.l d2,d_destpathbuffer(a7) move.l dosbase(pc),a6 moveq #DOS_FIB,d1 moveq #0,d2 jsr _LVOAllocDosObject(a6) move.l d0,d_fib(a7) beq .free_locals move.l d_objectname(a7),d1 moveq #ACCESS_READ,d2 jsr _LVOLock(a6) move.l d0,d_objectlock(a7) beq .free_fib move.l d0,d1 move.l d_fib(a7),d2 jsr _LVOExamine(a6) tst.l d0 beq .unlock ; add name part to destpath/ move.l d_destpathbuffer(a7),d1 move.l d_fib(a7),a0 lea fib_FileName(a0),a0 move.l a0,d2 move.l #PATHBUFFER_SIZE,d3 jsr _LVOAddPart(a6) move.l d_fib(a7),a0 tst.l fib_DirEntryType(a0) bge .dir ; file move.l d_fib(a7),a0 move.l fib_Size(a0),d3 lea fib_FileName(a0),a0 move.l a0,d1 move.l d_destpathbuffer(a7),d2 bsr copy_file bra .rempart .dir ; makedir in dest dir move.l d_destpathbuffer(a7),d1 jsr _LVOCreateDir(a6) move.l d0,d_newdirlock(a7) beq .rempart ; change into source dir move.l d_objectlock(a7),d1 jsr _LVOCurrentDir(a6) move.l d0,d_olddir(a7) ; loop through dir entries .dir_loop move.l d_objectlock(a7),d1 move.l d_fib(a7),d2 jsr _LVOExNext(a6) tst.l d0 beq .if_end move.l d_fib(a7),a0 lea fib_FileName(a0),a0 move.l a0,d1 move.l d_destpathbuffer(a7),d2 bsr recursive_copy bra .dir_loop .if_end ; change into old dir move.l d_olddir(a7),d1 jsr _LVOCurrentDir(a6) ; unlock new dir move.l d_newdirlock(a7),d1 jsr _LVOUnLock(a6) .rempart move.l d_destpathbuffer(a7),d1 jsr _LVOFilePart(a6) move.l d0,a0 clr.b (a0) .unlock move.l d_objectlock(a7),d1 jsr _LVOUnLock(a6) .free_fib moveq #DOS_FIB,d1 move.l d_fib(a7),d2 jsr _LVOFreeDosObject(a6) .free_locals lea d_SIZEOF(a7),a7 rts Ich ahne der Fehler besteht darin, dass man aus einem Zielverzeichnis an der richtigen Stelle wieder raus gehn muss. Verschiedene Versuche das zu lösen haben bei mir aber nicht funktioniert. ags -- Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system. [ Dieser Beitrag wurde von AGSzabo am 11.02.2012 um 23:32 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
11.02.2012, 23:52 Uhr Thore Posts: 2266 Nutzer |
Hmmm vielleicht gehts so... Du hast eine rekursive Funktion, diese listet nur die Dateien und Verzeichnisse die in einem angegebenen Verzeichnis sind. Ist es ein File, wird es mit seiner Verzeichnisstruktur kopiert. Ist es ein Verzeichnis, wird die rekursive Funktion einfach selbst aufgerufen. Ein Beispiel in Pseudocode: code:function RecCopy(MyPath, DestPath); begin while MyFile=GetNextFile do begin if (MyFile is File) then Copy(MyFile, DestPath+MyFile) else RecCopy(MyFile, DestPath); end; end; MyFile beinhaltet hierbei immer seinen relativen Pfad. Copy legt die Unterverzeichnisse, welche in MyFile mit drin sind an. Im Grunde wird hier eine Standard Tiefensuche verwendet. [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 00:05 Uhr AGSzabo Posts: 1663 Nutzer |
@Thore: > Ist es ein File, wird es mit seiner Verzeichnisstruktur kopiert. Ist es ein Verzeichnis, wird die rekursive Funktion einfach selbst aufgerufen. Mache ich ja so. Ich blick nicht durch warum es trotzdem nicht geht, ist wohl ein Fehler in der Umsetzung. -- Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system. [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 11:01 Uhr Doc Posts: 355 Nutzer |
FWIW, im Aminet gibt's noch mein 'dircmp'. Es wäre nicht so schwer, das entsprechend zu erweitern und in ASM umzusetzen. http://aminet.net/search?query=dircmp -- Ex Amiga-Computerist [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 13:58 Uhr Thore Posts: 2266 Nutzer |
Das Erstellen der Verzeichniskette sollte so unabhängig wie möglich vom übrigen Code sein. Ich würde hier eine Subroutine vorschlagen mit Pointer auf den String der Verzeichniskette und dem current dir. Dann in dieser Routine die Register retten, den string durchparsen und die Verzeichnisse entsprechend anlegen. Dann einfach nach dem Zurückschreiben der Register wieder aus dem Unterroutine zurückspringen. Damit kommst du mit den Verzeichnissen auch nie durcheinander. [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 14:09 Uhr AGSzabo Posts: 1663 Nutzer |
@Thore: Ich verstehe nicht was Du mit "unabhängig" meinst, mache ich doch so, dass meine routine - die sich selbst auf ruft - am Anfang einen Zielfpfad und das CurrentDir erhält. Dazu noch den Namen des zu kopierenden Objekts im CurrentDir. Das kann eine File sein aber auch ein Verzeichnis. -- Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system. [ Dieser Beitrag wurde von AGSzabo am 12.02.2012 um 14:10 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 15:01 Uhr Thore Posts: 2266 Nutzer |
Okay sorum kannsts auch machen, daß das Zielverzeichnis erstellt sobald ein Verzeichnis gefunden wird, und dann rekursiv die Funktion mit diesem Verzeichnis aufgerufen wird. [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 15:28 Uhr AGSzabo Posts: 1663 Nutzer |
Analyse hat ergeben: Bild: http://images.quicktunnels.net/bac.png Wenn es unter dem Verzeichnis "test" nur b, a und c gibt, funktioniert es. Sobald in b das Verzeichnis b_a erstellt wird, wird aus dem ganzen Baum das, was rechts abgebildet ist. -- Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system. [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 17:37 Uhr AGSzabo Posts: 1663 Nutzer |
Gelöst! Ich habe mir jetzt vor dem Selbstaufruf das Ende des gegenwärtigen Zielpfades gemerkt und danach wieder restoriert. Das Ende muß erst gesucht werden. Das gefällt mir nicht ganz, aber jetzt geht es prima.. code:move.l d_destpathbuffer(a7),d2 ; store current end of path move.l d2,a0 .find_loop tst.b (a0)+ bne .find_loop push a0 bsr recursive_copy ; restore end of path pop a0 clr.b -(a0) bra .dir_loop Auf zum nächstens Schritt. -- Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system. [ Dieser Beitrag wurde von AGSzabo am 12.02.2012 um 17:38 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 21:49 Uhr inq Posts: 445 Nutzer |
@AGSzabo: Entschuldige, daß ich das so direkt mitteilen muß: Das wurde auch Zeit. Ich weiß nicht, warum du IMMER als erste aller Optionen statt selbst zu denken (und zwar länger als nur 2 Minuten) direkt und unmittelbar das Forum befragst. Du bist ein talentierter, fähiger Programmierer. Es ist nicht nötig, dir für jeden deiner Schritte irgendwelche Zweitmeinungen einzuholen (ich glaube, ich habe das schonmal vor zwei Jahren oder so geschrieben). Du bist offenbar in der Lage, Probleme (auch solch einfache wie dieses hier) SELBST zu lösen. DARUM programmierst du doch (auch), oder? Ich will NICHT, daß du dem Forum fernbleibst. Ich würde es aber begrüßen, wenn du vermeiden könntest, die "Community" etwas weniger in alltägliche Programmiererfahrung (die du NICHT brauchst und also nur vorgibst) einzuflechten. Nur, um das Forum zu aktualisieren und die Höflichkeit und Toleranzgrenzen der Teilnehmer zu testen - no, thanx. Vielleicht hat auch der ein oder andere hier ein erweitertes Geltungsbedürfnis, das es außerhalb der Knigge-Formeln zu befriedigen gilt---letzten Endes mußt du eine Menge Credits in "deinen" Code schreiben, nur weil du nicht die Ausdauer eines Non-TV-Junkies besitzt . inq [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 22:06 Uhr AGSzabo Posts: 1663 Nutzer |
@inq: Ach es wird doch überall so viel geredet über alles Mögliche. Warum nicht auch hier? Ich würde mir mehr Fragen auch von anderen Leuten wünschen, dann könnte ich mein Wissen weiter geben. Es ist auffällig wenn immer wieder bloß ich hier als Fragender auftrete. Andernfalls würdest Du es garnicht bemerken. Ich will kein Eigenbrötler sein und kein einsamer Spitzenreiter, sondern mich über meine Interessen und Fortschritte ganz normal und offen mitteilen wie bei jedem anderen Hobby auch. Ich glaube wir arbeiten zusammen: my code is your code. Und wenn einer etwas - wenn auch nur moralische - Unterstützung braucht, dann bin ich gerne bereit es zu geben. Bei mir ist das so, dass ich oftmals erst dann das Problem sehe, wenn ich darüber spreche, bzw schreibe. Und warum sollte das ein Selbstgespräch sein. Was ist das für eine Austausch-Plattform, wenn man bloß gesagt bekommt: mach es selbst. Ich, es fällt mir echt auf, bin hier fast der Einzige, der Programmierfragen stellt. Wäre das nicht so, gäbe es keine Verwunderung darüber, das glaube ich. Man sieht im AmiNet und auf Amiga-News bloß immer, wer wann welches tolles Programm geschrieben hat, aber davon abgesehen scheint das eigentliche Programmieren davon jedem seine Privatsache und "geheime Kunst" zu sein, das gefällt mir nicht ... ags ps: wenn Du wüsstest, was ich alles hier NICHT frage. Was ich hier Frage ist alles andere als "jeder Schritt". Du siehst nur die Spitze des Eisbergs! -- Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system. [ Dieser Beitrag wurde von AGSzabo am 12.02.2012 um 22:10 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 22:47 Uhr inq Posts: 445 Nutzer |
Zitat: Ich verstehe, was du meinst. Leider ist das die heutige Situation: Jeder "teilt" alles mit allen: Im vermeintlichen Bewußtsein, daß es sich bei den "Anderen" um nette Leute und Freaks und "User" handelt. Das Problem hierbei ist aber: Alles, was du freigibst, ist "frei", veröffentlicht, der Quelle beraubt. Alles, was du jetzt "frei" diskutierst, kann und wird später evtl. gegen dich in einem Patentstreit verwendet werden. Weil du es selbst nicht erfunden/entdeckt hast. Eben das "wir teilen alles"-Problem der "wir sind doch alle Freunde" Generation. Und "Freund" hat den Sinn verloren. Genauso wie "mein" oder "Kunst". Ersetzt allesamt durch "Klicki-Bunti-Kopie-Flashi-iLike". Amen. Fazit: Grund genug für mich, Open-Src Quellen eben -so wie immer- stets nur als INSPIRATION zu verwenden --- APIs und Libs sind ok-Includes und soweiter bleiben beim Urheber. inq [ Dieser Beitrag wurde von inq am 12.02.2012 um 22:49 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 22:59 Uhr AGSzabo Posts: 1663 Nutzer |
@inq: Gibts bei Software neulich Patente? Mir wurde mitgeteilt ich könne meine "Hitomi-Methode zur Darstellung von in die Tora hinein kodierten Bildern" und das Programm dazu NICHT patentieren lassen. Aber notariell hinterlegt habe ich alles was ich in meinem Buch jetzt schließlich geschrieben habe. Urheberrechte gelten davon unabhängig. -- Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system. [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 23:11 Uhr inq Posts: 445 Nutzer |
@AGSzabo: Es geht (heute) noch nicht mal darum, ob man Software/Algorithmen patentieren kann: Allein dadurch, daß das Wissen oder die Herleitung von bestimmten Lösungen "der Allgemeinheit bekannt" sind, schließt eine Patentierung (laut "Prior Art"oder noch übler) aus. D.h. irgendjemand im "bösen Indien" gießt deine "neue Idee" in ein fertiges Programm, bevor du es tust - hihi, Pech gehabt, würde ich sagen. Klagen dagegen laufen ins Leere, da es ja um "allgemein bekanntes Wissen" geht. Und ich erinnere (sehr gerne) in diesem Zusammenhang an die sog. Trivialpatente an das Zeichnen von Rechtecken, das Ein-Klick-Patent und Sachen wie "Datenaustausch zwischen Teilnehmern". meint ein (nicht paranoider) inq [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 23:24 Uhr AGSzabo Posts: 1663 Nutzer |
@inq: Der Jemand im bösen Indien kann doch auch kein Patent auf allgemein bekanntes Wissen machen, oder hab ich dich mißverstanden? Ich meine, was ich nicht kann, kann/darf er auch nicht. Aber um das mal zu trennen: - meine Hitomi-Methode ist spätestens seit dem Erscheinen meines Buches als mein geistiges Eigentum gesichert. - was ich an sonstens programmiere gibts sowieso schon alles irgendwie - das ganze linux ubuntu gnome etc IST quelloffen und noch nie hat es damit patentwitze gegeben ... oder? ags -- Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system. [ - Antworten - Zitieren - Direktlink - ] |
12.02.2012, 23:46 Uhr inq Posts: 445 Nutzer |
Zitat:Es ist, genau genommen, anders herum: Es wird eine Software veröffentlicht (verkauft!!), gegen die DU nicht vorgehen kannst, weil es nicht patentierbar ist (weil die kleine feine tricky-quicky 68k-ASM-Routine 10 Jahre zuvor FREI für 7Mrd. Menschen zu lesen war-bis ins letzte Byte). Zitat:Bis jemand mit mehr Geld etwas anderes "beweisen kann". Zitat:Genau. IRGENDWIE. Wenn deine RVS, deine Srccodes, eben alles darauf hinweist, daß du es SELBST entwickelt hast, dan IST es auch deines. Es gibt nur SEHR wenige Varianten, ein Rechteck (sinnvoll) zu zeichnen. Es gibt keinen Grund, eine Variante davon IN SRC zu kopieren. DAS kann man auch selbst schreiben; vielleicht machen ein paar Bytes später mal ein paar MIO ChinaEuros aus... inq [ - Antworten - Zitieren - Direktlink - ] |
13.02.2012, 10:40 Uhr Holger Posts: 8116 Nutzer |
Zitat:Hat er irgendwo geschrieben, dass er das will? Ich lese hier das genaue Gegenteil heraus: hätte er etwas dagegen, dass jemand sein Wissen verwendet, würde er es selbstverständlich nicht mit anderen teilen. Zitat:Ja ja, sicher.Zitat:Bis jemand mit mehr Geld etwas anderes "beweisen kann". Das heißt, die einzige Schutzmaßnahme, die ein Autor noch hätte, wäre, gar nichts zu veröffentlichen. Sehr sinnvoll. Zitat:Huch, wo ist denn jetzt Deine Paranoia geblieben? Ich dachte, jemand mit genügend Geld kann eh „beweisen“, dass alles von ihm ist? Im übrigen spielt es bei Patenten ohnehin überhaupt keine Rolle, ob Du den Source kopiert oder dieselbe Idee mit eigenhändig geschriebenen Code re-implementiert hast. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
18.02.2012, 22:44 Uhr inq Posts: 445 Nutzer |
Zitat:Das ist ein Mißverständnis. Wie wir alle wissen, geht es bei vielen Patentklagen nicht so sehr um den deutlichen Beweis einer klaren Patentverletzung, da Patente oftmals so vage formuliert sind, daß sie scheinbar auf alles Mögliche anzuwenden sind (Nostradamus läßt grüßen). Darum "beweisen kann". Und die erwähnte Methode muß (ohne jemandem nahe zu treten) keineswegs neu oder einzigartig sein. Auch wenn der vermeintliche Erfinder das glaubhaft versichert. Demzufolge ist die Kernaussage des Zitats mit Vorsicht zu genießen. Zitat:Falsch. Nur, wenn das Patent auf die Idee gilt, wäre das so. Bei der Verwirklichung einer (banalen, bekannten) Idee spielt sehrwohl der Source eine Rolle. Ich habe nicht umsonst auf das Rechteckzeichnen verwiesen. Übrigens, ich hab' diesem Thread nur beigesenft, weil das eigentlich angesprochene "Problem" nur eine Denkblockade beschreibt, zu deren Lösung normalerweise kein Sourcecode nötig wäre. Immer dieses "teilhaben", "sharing" usw. wirkt auf mich immer etwas übertrieben. Ich werde wohl alt! inq [ - Antworten - Zitieren - Direktlink - ] |
18.02.2012, 22:53 Uhr AGSzabo Posts: 1663 Nutzer |
@inq: Wie ich schon schrieb, vermisse ich aber den regen Austausch. Wie man am Forum sieht, wäre hier mehr lost, würde ich nicht so aufallen. Du wirst nicht alt sondern das Thema ist nicht aktuell genug. Wer programmiert Amiga und die Wenigen, die es tun, warum jeder nur für sich selbst. Das war meine Kritik. ps: auch Denkblokaden haben ein Recht auf Besprechung und Aussprache. -- Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system. [ Dieser Beitrag wurde von AGSzabo am 18.02.2012 um 22:55 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > rekursives Verzeichniskopieren | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |