Stapelverarbeitung rekursiv

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

4pac

Betreff: Stapelverarbeitung rekursiv

BeitragDo, Jan 15, 2004 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 15, 2004 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 15, 2004 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Rene!

In Deinem letzten BlitzBasic-Buch? Das hätte ich sogar hier (ist meine bevorzugte Buslektüre Smile ) - nein, Mist, ausgerechnet heute hab ich es nicht eingesteckt.

Grüße, Thomas
 

Edlothiol

BeitragDo, Jan 15, 2004 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 15, 2004 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
hrhr, ich liebe rekursive programmierung Very Happy

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 Laughing aber es sollte funktinieren.


/edit: eh, spielverderber Razz
  • Zuletzt bearbeitet von OJay am Do, Jan 15, 2004 17:36, insgesamt einmal bearbeitet
 

René Meyer

BeitragDo, Jan 15, 2004 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jan 15, 2004 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, Leute Smile ! Ich muss damit mal herumprobieren.

Zitat:
kann mich grad nicht an die funktion zum dateiumbennen errinnern Laughing aber es sollte funktinieren.
- 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

BeitragDo, Jan 15, 2004 18:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy

4pac

BeitragDo, Jan 15, 2004 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich sitz noch immer in der Firma und knobel dran. Die Codebeispiele funzen bei mir irgendwie alle nicht recht... Crying or Very sad

Viele Grüße,
Thomas
 

OJay

BeitragDo, Jan 15, 2004 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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)

TheShadow

Moderator

BeitragDo, Jan 15, 2004 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
auf blitzbase gibt es dirscanner (quellcodes)
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

4pac

BeitragFr, Jan 16, 2004 0:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile ist ja an sich auch eine ziemlich banale Geschichte auf dem Anwendungsmarkt. Ich muss es bloß auf die ganz konkreten Bedürfnisse meines Arbeitgebers zurechtschneiden. Und scheitere an dieser Rekursionskacke. Zur Not werde ich das sonst statisch coden, funktionieren wird es auf jeden Fall, aber was für ein stilistischer Rückfall in das frühe Mittelalter Very Happy Na, hier kommt das Kummerkind:

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

BeitragFr, Jan 16, 2004 0:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 16, 2004 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Fast, aber nicht CurrentDir(), das wird nicht geändert, sondern
Code: [AUSKLAPPEN]
FileType(dirname$ + "\" + bilddatei$)

und
Code: [AUSKLAPPEN]
... Then batchrename(dirname$ + "\" + bilddatei$)
 

OJay

BeitragFr, Jan 16, 2004 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
 

walski

Ehemaliger Admin

BeitragFr, Jan 16, 2004 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jan 16, 2004 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

Sieht für mich nicht so aus. Probier mal das aus:
Code: [AUSKLAPPEN]
Print CurrentDir()
dir = ReadDir("C:\")
Print CurrentDir()
WaitKey

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group