Stapelverarbeitung rekursiv
Übersicht

![]() |
4pacBetreff: Stapelverarbeitung rekursiv |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi liebe Proggerz!
Ich hab hier in der Firma das Problem, daß ich einen kleinen Batch-Renamer coden muss (in B+), der sich auch durch sämtliche Unterverzeichnisse des Startordners wühlt und dort ebenfalls sämtliche Dateien umbenennt. Das Mini-Tool ist schon fertig, bis auf die Rekursion. Mir fehlt ein brauchbarer Ansatz, quasi ein Algorhythmus, wie es zu bewerkstelligen ist, daß a. erst alle Dateien im Startverzeichnis bearbeitet werden, und danach in alle Unterordner gegangen wird. Ich erinnere mich, daß ich vor 1/2 Jahr oder so schon mal vor diesem Problem stand und auch nicht weiterkam. Hat von Euch schon mal jemand Hirnschmalz darauf investiert und kann mir einen Tipp geben? Danke & Grüße, Thomas |
||
René Meyer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, spare Dir das Programmieren. :)
Es gibt einen feinen COMMAND.COM-Ersatz namens 4DOS, der hat den Befehl GLOBAL. Damit führst Du einen Befehl in allen Unterverzeichnissen aus. Wenn ich mich recht entsinne, macht das Tool WHEREIS das Gleiche. (Falls Du es doch programmieren willst - im Buch ist ein Beispiel für rekursives Programmieren, das könnte ich hier posten.) |
||
www.blitzbasic.de | Das Buch zu Blitz Basic: www.schreibfabrik.de/txt/bbb |
![]() |
4pac |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Rene!
In Deinem letzten BlitzBasic-Buch? Das hätte ich sogar hier (ist meine bevorzugte Buslektüre ![]() Grüße, Thomas |
||
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich würds so machen
Code: [AUSKLAPPEN] function RenameDir(dirname$)
dir = readdir(dirname$) file$ = nextfile(dir) while file$ <> "" select filetype(dirname$ + "\" + file$) case 1: Rename(dirname$ + "\" + file$) case 2: RenameDir(dirname$ + "\" + file$) end select file$ = nextfile(dir) wend end function Da müsste man eben noch Rename() schreiben. |
||
OJay |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hrhr, ich liebe rekursive programmierung ![]() Code: [AUSKLAPPEN] function renamedir(dirname$)
dir=readdir(dirname) file$=nextfile(dir) while not file$="" if filetype(file)=1 dateiumbenennfunktion(file) else renamedir(file$) endif file$=nextfile(dir) wend end function kann mich grad nicht an die funktion zum dateiumbennen errinnern ![]() /edit: eh, spielverderber ![]() |
||
- Zuletzt bearbeitet von OJay am Do, Jan 15, 2004 17:36, insgesamt einmal bearbeitet
René Meyer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, es gibt einen Abschnitt über Rekursion. Im Prinzip: Alle Verzeichnisse im aktuellen Ordner suchen und mit der gleichen Funktion aufrufen sowie die Aktion ausführen, die Du geplant hast. Die Funktion ruft sich immer wieder selbst auf, bis es keine weiteren Unterverzeichnisse mehr gibt.
Code: [AUSKLAPPEN] ; REKURSIV1.BB
Global Grund = 10 Tiefe = 0 Graben(Tiefe) WaitKey ; Function Graben(Tiefe) If Tiefe <> Grund Then Tiefe = Tiefe + 1 Print "Tiefe nun: " + Tiefe Graben(Tiefe) Print "Position nun: " + Tiefe EndIf End Function |
||
www.blitzbasic.de | Das Buch zu Blitz Basic: www.schreibfabrik.de/txt/bbb |
![]() |
4pac |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke, Leute ![]() Zitat: kann mich grad nicht an die funktion zum dateiumbennen errinnern - Bei mir heißt die CopyFile plus DeleteFile. Ich glaub das geht nicht anders in BlitzBasic - zumindest lt. mitgelieferter Befehlsreferenz.
![]() Viele Grüße, Thomas |
||
![]() |
Xenon |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hui, rekursiv ist aber schlecht, obwohl es mir auch gefällt!
Jede Rekursive Funktion geht auch in eine normale umwandeln... werde mich mal vor das Problem setzen, wenn ich von Zahnarzt zurück bin. Vielleicht schaff ichs ja ![]() |
||
![]() |
4pac |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, ich sitz noch immer in der Firma und knobel dran. Die Codebeispiele funzen bei mir irgendwie alle nicht recht... ![]() Viele Grüße, Thomas |
||
OJay |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
doch, sollte eigentlich. poste mal den code (zumindest den teil, der dafür verantwortlich ist). vielleicht haste einfach nur irgendwo ein $ vergessen...
besonders bei meiner version bin ich mir sehr sicher, weil ich die auch benutzte, um verzeichnisse rekursiv einzulesen (etwa für treeviews) |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
auf blitzbase gibt es dirscanner (quellcodes) | ||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
![]() |
4pac |
![]() Antworten mit Zitat ![]() |
---|---|---|
OJay hat Folgendes geschrieben: doch, sollte eigentlich. poste mal den code (zumindest den teil, der dafür verantwortlich ist). vielleicht haste einfach nur irgendwo ein $ vergessen...
besonders bei meiner version bin ich mir sehr sicher, weil ich die auch benutzte, um verzeichnisse rekursiv einzulesen (etwa für treeviews) Klar, gerne. Ich brauche nur das Werkzeug, an den Copyrights habe ich kein Interesse ![]() ![]() Code: [AUSKLAPPEN] ; blitz batch renamer v.2.01a
dw=GadgetWidth(Desktop()) dh=GadgetHeight(Desktop()) Global x=dw/2 - w/2 : Global y=dh/2 - h/2 Global arbeitsverzeichnis$ Global bilddatei$ Global fileout = 0 Global file$="" Global gesamtzaehler ; -------------------- GUI ---------------------------------------- Global window1 = CreateWindow("Blitz Batch Renamer v2.01",x,y,270,240,0,1+4+8+16) Global dirbutton2 = CreateButton("Select source file directory",42,22,180,22,window1) SetGadgetLayout dirbutton2,0,0,0,0 Global dirlabel1 = CreateLabel("Source file directory:",85,50,120,16,window1) SetGadgetLayout dirlabel1,1,0,1,0 Global dir1 = CreateTextField(5,71,250,22,window1) SetGadgetLayout dir1,1,1,1,0 SetGadgetText dir1,CurrentDir$() Global actionbutton = CreateButton("start batch",74,130,115,21,window1) SetGadgetLayout actionbutton,1,1,1,1 Global filemenu1 = CreateMenu ("Menu", 0, WindowMenu (window1)) CreateMenu ("About", 1, filemenu1) CreateMenu ("End", 2, filemenu1) UpdateWindowMenu window1 ActivateWindow window1 ;---------------------------------------------------------------- ; Hauptschleife ;---------------------------------------------------------------- While Not KeyHit(1) WaitEvent() Select EventID() Case $401 ; gadget event Select EventSource() Case dirbutton2 : ChooseWorkDir() Case actionbutton : batch_rename(arbeitsverzeichnis$) : Exit End Select Case $1001 ; a menu event Select EventData() Case 1 : Menu_About() Case 2 : Exit End Select End Select Wend End ;---------------------------------------------------------------- ; functions ;---------------------------------------------------------------- Function ChooseWorkDir() ChangeDir RequestDir$("Verzeichnis für die Stapel-Umbenennung:") SetGadgetText dir1,CurrentDir$() arbeitsverzeichnis$ = CurrentDir$() End Function Function batch_rename(dirname$) leseverzeichnis = ReadDir(dirname$) Repeat bilddatei$ = NextFile$(leseverzeichnis) If bilddatei$ = "" Then Exit ;FileType = Datei? Dann umbenennen If FileType(bilddatei$) = 1 Then zaehler = zaehler + 1 gesamtzaehler = gesamtzaehler +1 neuerdateiname$ = zaehler + ".jpg" ;Dateinamen links mit nullen auffüllen wenn die Zahl nur 1 oder 2 stellig ist If Len(neuerdateiname$) = 5 Then neuerdateiname$ = "00" + neuerdateiname$ If Len(neuerdateiname$) = 6 Then neuerdateiname$ = "0" + neuerdateiname$ ;Umbennenen geht nicht direkt, deshalb Kopieren mit anderem Namen, dann Quelldatei löschen CopyFile bilddatei$, neuerdateiname$ DeleteFile bilddatei$ End If If FileType(bilddatei$) = 2 Then batch_rename(bilddatei$) Forever Notify "Stapelverarbeitung abgeschlossen." + gesamtzaehler + " Dateien umbenannt." End Function ;-------------------------------------------------------------------------- Function Menu_About() AppTitle "Info" Notify "Blitz Batch Renamer v.2.01" End Function Viele Grüße, Thomas |
||
OJay |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
soweit ich weiß, liefert nextfile() nur den dateinamen zurück. filetype() benötigt aber den kompletten pfad.
die lösung deines problems könnte also lauten: Code: [AUSKLAPPEN] filetype(currentdir()+bilddatei$)
hab kein blitz+. aber das ist eine mögliche fehlerquelle. |
||
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Fast, aber nicht CurrentDir(), das wird nicht geändert, sondern
Code: [AUSKLAPPEN] FileType(dirname$ + "\" + bilddatei$)
und Code: [AUSKLAPPEN] ... Then batchrename(dirname$ + "\" + bilddatei$)
|
||
OJay |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
currentdir() gibt das aktuelle verzeichnis aus. und readdir() setzt das aktuelle auf das angegebene verzeichnis. demnach müsste currentdir() genauso gehen...
aber deine variante ist natürlich die sicherere ![]() |
||
walskiEhemaliger Admin |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] ; just a tiny renamer ; (c) 2004 by walski RenameFiles("c:\temp","*.m00","*.asf") Print "Done - Press any key to exit" WaitKey() Function RenameFiles(dir$,search$,repl$,SubFolder=1) If Right(dir$,1)<>"\" Then dir$=dir$+"\" EndIf iDir=ReadDir(dir$) DebugLog Str(iDir) + ":" + dir$ File$ = NextFile(iDir) While Not File$="" If FileType(dir$+File$)=2 And File$<>"." And File$<>".." Then RenameFiles(dir$ + File$,search$,repl$,SubFolder) File$ = NextFile(iDir) Wend stream = WriteFile("c:\bbrenametemp.bat") WriteLine stream,"cd " + dir$ WriteLine stream,"rename " + search$ + " " + repl$ CloseFile stream ExecFile("c:\bbrenametemp.bat") DeleteFile("c:\bbrenametemp.bat") CloseDir iDir End Function Sodele, gant simpel. Ich hoffe die auftretenden DOS-Boxen stören nicht! Dadurch, dass einfache "DOS" Kommandos benutzt werden sind auch so schöne sachen wie: *blabla.ex* möglich oder ?bla*.e?e Naja, also einfach: RenameFiles(DerStartOrdnerMitLaufWerkVorneWeg$,WasSollGesuchtWerden$,WodurchSollEsErsetztWerden$,AuchUnterOrdner) walski |
||
buh! |
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
OJay hat Folgendes geschrieben: currentdir() gibt das aktuelle verzeichnis aus. und readdir() setzt das aktuelle auf das angegebene verzeichnis. demnach müsste currentdir() genauso gehen...
aber deine variante ist natürlich die sicherere ![]() Sieht für mich nicht so aus. Probier mal das aus: Code: [AUSKLAPPEN] Print CurrentDir()
dir = ReadDir("C:\") Print CurrentDir() WaitKey |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group