Datei umbenennen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Quaxi
Beiträge: 66
Registriert: 11.09.2004 12:42

Datei umbenennen

Beitrag von Quaxi »

Hallo,
also ich hab eine kleine Konsolen Anwendung geschrieben die alle Jpg Bilder im aktuellen Verzeichniss einliest und diese anschliessend vor ihren Dateinamen ein "Pic." setzt.
Mein Problem ist jetzt das wenn ich zb. 900 Bilder on einem Verzeichniss habe er zb. nur 850 umbennent. Die restlichen 50 lässt er so wie sie sind. Dafür setzt er bei 50 anderen dafür 2 "Pic." hinein.
Diese 50 die er auslässt haben aber weder Sonderzeichen noch irgend eine anderen Merkmale die zu Fehler führen könnten. Bitte um Hilfe!

Hier ein kleiner Auszug von der Schleife:

Code: Alles auswählen

 ;Starte Schleife
  For TempVar_Fortschritt = 0 To var_Anzahl
    
    ;Bennene nun die Datei um
    RenameFile(DirectoryEntryName(), "Pic." + DirectoryEntryName())
    
    ;Zeichne die Konsole neu
    RedrawMyConsole()
    
    ;Schreibe den aktuellen Status hin
    PrintN("--------------------------------------------------------------------------")
    PrintN("-- Aktueller Status: " + StrF((100/var_Anzahl) * TempVar_Fortschritt, 0) + "%")
    PrintN("-- Aktuelle Datei: " + DirectoryEntryName())
    
    ;Aktualisiere die Eintrageliste
    var_Eintrag = NextDirectoryEntry()
    
  Next
Die Variable var_Anzahl stimmt, die hab ich schon überprüft!
Danke im voraus!

edit redacid: Fehler in Überschrift berichtigt (für eventuelle spätere Suchabfrage erforderlich) und Code-Tags gesetzt.
Benutzeravatar
Quaxi
Beiträge: 66
Registriert: 11.09.2004 12:42

Beitrag von Quaxi »

Hier der komplette Quellcode wenn es wenn hilft:

Code: Alles auswählen

;#####################################################
;############### Programm: Quaxi ###############
;#####################################################

;Erstelle die Prozedur die das Programm immer neu zeichnet
Procedure RedrawMyConsole()
  
  ;Zeichne nun die Konsole neu mit den neuen Farben
  ClearConsole()
  
  ;Schreibe nun die Überschrift hin ###################################################
  PrintN("                           JPEG\JPG Konverter")
  PrintN("")
  ;####################################################################################
  
EndProcedure

;Öffne zuerst eine neue Konsole
OpenConsole()

;Stelle nun die neue Konsolen Hintergrundfarbe auf Rot und Textfarbe auf Blau
ConsoleColor(6, 4)

;Zeichne nun die Konsole
RedrawMyConsole()

;Erstelle nun die Variable in der gesagt wird um welchen Eintrag Typ es sich handelt
Global var_Eintrag.b
var_Eintrag = 3

;Erstelle nun die Variable die die Dateianzahl speichert
Global var_Anzahl
var_Anzahl = 0

;Deklariere Antwort Variable
Global var_Antwort.s

;Deklariere nun die Variable die den Fortschritt speichert
Global var_Status.f
var_Status = 0.0

;Schreibe nun bitte warten hin
PrintN("Bitte warten. Daten werden eingelesen...")

;Aktualisiere das Verzeichnis
ExamineDirectory(0, "", "*.jp*")

;Beginne nun die Schleife welche die Anzahl der Bilder einliest
Repeat
  
  ;Abfrage um welchen Eintrag es sich handelt
  var_Eintrag = NextDirectoryEntry()
  
  ;Festellen um welchen Typ es sich handelt
  If var_Eintrag = 1
    
     ;Aktualisiere die Anzahl
    var_Anzahl = var_Anzahl + 1
    
  EndIf
  

Until var_Eintrag = 0

GoShowMenu:  
;Lösche nun wieder den Konsolen Inhalt
RedrawMyConsole()  

;Schreibe nun die Anzahl der gefundenen Bild Dateien hin
PrintN("Es wurden " + Str(var_Anzahl) + " Bilder gefunden.")
PrintN("")

;Abfrage ob 0 gegeben ist
If var_Anzahl = 0
  
  Print("Es kann nichts konvertiert werden. ")
  var_Antwort = Input()
  
  ;Programm beenden
  End

EndIf

;Stelle nun Frage
PrintN("Was moechten sie nun tun?")
PrintN("1 --> Konvertieren")
PrintN("2 --> Reparieren")
PrintN("3 --> Beenden")
Print("Ihre Wahl: ")

;Frage nun die Antwort ab
var_Antwort = Input()

;Entferne alle Leerzeichen
var_Antwort = Trim(var_Antwort)

;Frage nun die Antwort ab
;###################
;##### Bei 3 #######
If var_Antwort = "3"
  
  ;Schreibe Verabschiedung
  PrintN("")
  PrintN("")
  Print("Bye...")
  
  ;Warte 1 Sekunden
  Delay(1000)
  
  ;Beende Programm
  End
EndIf
;#################
;##### Bei 1 #####
If var_Antwort = "1"
  
  ;Aktualisiere das Verzeichnis
  ExamineDirectory(0, "", "*.jp*")
  
  ;Starte Schleife
  For TempVar_Fortschritt = 0 To var_Anzahl
    
    ;Bennene nun die Datei um
    RenameFile(DirectoryEntryName(), "Pic." + DirectoryEntryName())
    
    ;Zeichne die Konsole neu
    RedrawMyConsole()
    
    ;Schreibe den aktuellen Status hin
    PrintN("--------------------------------------------------------------------------")
    PrintN("-- Aktueller Status: " + StrF((100/var_Anzahl) * TempVar_Fortschritt, 0) + "%")
    PrintN("-- Aktuelle Datei: " + DirectoryEntryName())
    
    ;Springe zur nächsten Datei
    NextDirectoryEntry()
    
  Next
  
  ;Schlusstext schreiben
  PrintN("")
  Print("Konvertierung zu 100% abgeschlossen! Beenden mit Return. ")
  
  ;Return abwarten
  var_Antwort = Input()
  
  ;Programm beenden
  End

EndIf
;###################
;### Bei blödsinn ##
;###################
Goto GoShowMenu


edit redacid: Code-Tags gesetzt. Mit den Tags kannst du ja umgehen, da du den Code invers dargestellt hast. Für Code gibt es aber den speziellen Code-Tag, der auf jeden Fall übersichtlicher ist, da z.B. die Einrückungen nicht verloren gehen).
Zuletzt geändert von Quaxi am 13.10.2004 21:01, insgesamt 2-mal geändert.
sbehrens
Beiträge: 274
Registriert: 08.09.2004 18:41
Kontaktdaten:

Beitrag von sbehrens »

Hi,

1. Variablen müssen nicht Global sein, da du sie nicht in Prozeduren benutzt.
2. Die Menu-Abfrage-Routine in eine If-ElseIf-ElseIf-ElseIf-Endif Struktur gepackt. (nicht: If-EndIf,If-Endif usw.)
3.

Code: Alles auswählen

For TempVar_Fortschritt = 0 To var_Anzahl 
----->

Code: Alles auswählen

For TempVar_Fortschritt = 1 To var_Anzahl 
4.Damit DirectoryEntryName() nicht zwei Mal aufgerufen wird, wird das Ergebnis in TempVar_DirName.s gespeichert
5.

Code: Alles auswählen

NextDirectoryEntry()
am Anfang, da sonst beim ersten mal kein DirEntry() "ausgewählt" ist.
6.Bei der Umbenennung der Datei fehlt der Pfad!!!

Code: Alles auswählen

RenameFile(TempVar_FileName, "Pic." + TempVar_FileName)
----->

Code: Alles auswählen

RenameFile(var_Ordner + TempVar_FileName, var_Ordner + "Pic." + TempVar_FileName)
Das war's so funzt es. Das nächste mal bitte CodeTags setzten, und Einrücken ist auch sehr hilfreich! HF beim proggen! :allright:

(Hier der ganze Code:)

Code: Alles auswählen

;##################################################### 
;############### Programm: Quaxi ############### 
;##################################################### 

;Erstelle die Prozedur die das Programm immer neu zeichnet 
Procedure RedrawMyConsole() 
  
  ;Zeichne nun die Konsole neu mit den neuen Farben 
  ClearConsole() 
  
  ;Schreibe nun die Überschrift hin ################################################### 
  PrintN(" JPEG\JPG Konverter") 
  PrintN("") 
  ;#################################################################################### 
  
EndProcedure 

;Öffne zuerst eine neue Konsole 
OpenConsole() 

;Stelle nun die neue Konsolen Hintergrundfarbe auf Rot und Textfarbe auf Blau 
ConsoleColor(6, 4) 

;Zeichne nun die Konsole 
RedrawMyConsole() 

;Directory Variable
var_Ordner.s = "c:\test\" ;;;###Hier Pfad eingeben###;;;
;zB. mit PathRequester()

;Erstelle nun die Variable in der gesagt wird um welchen Eintrag Typ es sich handelt 
var_Eintrag.b  = 3

;Erstelle nun die Variable die die Dateianzahl speichert 
var_Anzahl = 0 

;Deklariere Antwort Variable 
var_Antwort.s 

;Deklariere nun die Variable die den Fortschritt speichert 
var_Status.f = 0.0

;Schreibe nun bitte warten hin 
PrintN("Bitte warten. Daten werden eingelesen...") 

;Aktualisiere das Verzeichnis 
ExamineDirectory(0, var_Ordner, "*.jp*") 

;Beginne nun die Schleife welche die Anzahl der Bilder einliest 
Repeat 
  
  ;Abfrage um welchen Eintrag es sich handelt 
  var_Eintrag = NextDirectoryEntry() 
  
  ;Festellen um welchen Typ es sich handelt 
  If var_Eintrag = 1 
    
    ;Aktualisiere die Anzahl 
    var_Anzahl = var_Anzahl + 1 
    
  EndIf 
  
  
Until var_Eintrag = 0 

GoShowMenu: 
;Lösche nun wieder den Konsolen Inhalt 
RedrawMyConsole() 

;Schreibe nun die Anzahl der gefundenen Bild Dateien hin 
PrintN("Es wurden " + Str(var_Anzahl) + " Bilder gefunden.") 
PrintN("") 

;Abfrage ob 0 gegeben ist 
If var_Anzahl = 0 
  
  Print("Es kann nichts konvertiert werden. ") 
  var_Antwort = Input() 
  
  ;Programm beenden 
  End 
  
EndIf 

;Stelle nun Frage 
PrintN("Was moechten sie nun tun?") 
PrintN("1 --> Konvertieren") 
PrintN("2 --> Reparieren") 
PrintN("3 --> Beenden") 
Print("Ihre Wahl: ") 

;Frage nun die Antwort ab 
var_Antwort = Input() 

;Entferne alle Leerzeichen 
var_Antwort = Trim(var_Antwort) 

;Frage nun die Antwort ab 
;################### 
;##### Bei 3 ####### 
If var_Antwort = "3" 
  
  ;Schreibe Verabschiedung 
  PrintN("") 
  PrintN("") 
  Print("Bye...") 
  
  ;Warte 1 Sekunden 
  Delay(1000) 
  
  ;Beende Programm 
  End 
  ;################# 
  ;##### Bei 1 ##### 
ElseIf var_Antwort = "1" 
  
  ;Aktualisiere das Verzeichnis 
  ExamineDirectory(0, var_Ordner, "*.jp*") 
  
  ;Temporäre Variable für DirectoryEntryName()
  TempVar_FileName.s = ""
  
  ;Starte Schleife 
  For TempVar_Fortschritt = 1 To var_Anzahl 
    
    ;Springe zur nächsten Datei 
    NextDirectoryEntry() 
    
    ;Bennene nun die Datei um 
    TempVar_FileName = DirectoryEntryName()
    RenameFile(var_Ordner + TempVar_FileName, var_Ordner + "Pic." + TempVar_FileName) 
    
    ;Zeichne die Konsole neu 
    RedrawMyConsole() 
    
    ;Schreibe den aktuellen Status hin 
    PrintN("--------------------------------------------------------------------------") 
    PrintN("-- Aktueller Status: " + StrF((100/var_Anzahl) * TempVar_Fortschritt, 0) + "%") 
    PrintN("-- Aktuelle Datei: " + DirectoryEntryName()) 
    
  Next 
  
  ;Schlusstext schreiben 
  PrintN("") 
  Print("Konvertierung zu 100% abgeschlossen! Beenden mit Return. ") 
  
  ;Return abwarten 
  var_Antwort = Input() 
  
  ;Programm beenden 
  End 
  
EndIf 
;################### 
;### Bei blödsinn ## 
;################### 
Goto GoShowMenu 
mfG
Basti
enjoy life... while you can!
Benutzeravatar
Quaxi
Beiträge: 66
Registriert: 11.09.2004 12:42

Beitrag von Quaxi »

Zu Punkt 6. Ich habe schon einen Pfad angegeben gehabt. Zummindest den Dateinamen, denn wenn kein Pfad angegeben wurde, nimmt er automatisch den Pfad der .exe Datei.

Aber abgesehen davon, hab ich mal deine Version komplett übernommen und ausprobiert. Und sie funktioniert auch nicht! Das gleiche Problem wie mit meiner.
Ca. 389 Dateien macht sie richtig, die letzten 150 lässt sie aber aus und überschreibt statdessen Dateien die schon drann waren einfach 2 mal mit Pic.

An den Jpg Bildern selber kann es nicht liegen, ich habe es auch schon mit anderen Bildern versucht. Kann es einfach nur sein das die Funktion NextDirectoryEntry() nicht mit so vielen Dateien arbeiten kann?

Vielleicht ein Fehler des Compilers?!?[/i]

EDIT------
Was mir aber gerade zusätzlich aufgefallen ist das er immer 391 Dateien richtig macht, und wenn dann zb 222 Dateien noch übrig sind einfach noch mal bei den vorherigen 391 Dateien wieder anfängt, und sie wieder mit nem Pic. anhängt.
sbehrens
Beiträge: 274
Registriert: 08.09.2004 18:41
Kontaktdaten:

Beitrag von sbehrens »

Hmm, mist, ich habe gehofft meine Version würde funzen. Ich glaube du hast recht, das kann eigentlich nur noch am Compiler liegen.
Quaxi hat geschrieben:Was mir aber gerade zusätzlich aufgefallen ist das er immer 391 Dateien richtig macht, und wenn dann zb 222 Dateien noch übrig sind einfach noch mal bei den vorherigen 391 Dateien wieder anfängt, und sie wieder mit nem Pic. anhängt.
D.h. wenn er 391 (lol, die neuste PB Version 3.91 vielleich liegt es ja daran :lol: ) richtig macht, und dann noch 222 Dateien übrig sind hast du am Ende:
-222 Dateien mit 2 * "Pic."
-169 Dateien mit 1 * "Pic."
-222 Datein ohne "Pic."
(-613 Dateien insgesamt)
sehr seltsam!

mfG
Basti
enjoy life... while you can!
Benutzeravatar
Quaxi
Beiträge: 66
Registriert: 11.09.2004 12:42

Beitrag von Quaxi »

Na toll. Und morgen früh brauch ich das Programm schon. hrmpf!

Kennt sich dann jemand mit so Windows Batch Dateien aus? Hab schon ewig nix mehr damit gemmacht. Kann mir vielleicht dann jemand noch schnell so net Batch Datei schreiben, wo einfach alle Dateien im Ordner am Anfang ein Pic. angehängt bekommen? Währe dafür sehr dankbar!
sbehrens
Beiträge: 274
Registriert: 08.09.2004 18:41
Kontaktdaten:

Beitrag von sbehrens »

Sry das ich dir nicht helfen konnte...
Hier aber ein Tip:
Benutze dafür IrfanView ( www.irfanview.com )
File->Batch Conversion/Rename
->Folder suchen
->Dateityp auf "*.jpg" stellen
->alles gefundenen "*.jpg" Dateien in die Liste einfügen
->Auf Den Button "Use this directory as output" drücken
->Dann unter "Work As:" auf "Batch Rename" Stellen
->Name Pattern zu "Pic.$N" ändern
->Unter "Set rename options" auf "Rename original/input files (...)"
(oder wenn du sicher gehen willst so lassen wie es ist. Musst dann aber die alten Bilder manuell löschen)
->Und dann endlich "Start"... (ist ganz oben links)

[Ich übernehme keine Verantwortung für Schäden!]

Ich hoffe das hilft wenigstens ein bisschen...

mfG
Basti

//Edit: Batchfile Tuts:
http://www.axel-hahn.de/axel/page_compi ... cindex.htm
http://home.t-online.de/home/erdalkaraca/html/batch.htm
Batchfile Erstellungstool:
http://www.soft-ware.net/system/eingabe/makro/index.asp (Batchrun 4.10)
enjoy life... while you can!
Tibor
Beiträge: 42
Registriert: 29.08.2004 03:25
Wohnort: Mittelerde, südlich der großen Grasplantagen

Beitrag von Tibor »

Ich übernehme keine Haftung für das Programm.
Das habe ich innerhalb von 2 Minuten geschrieben und außerdem bin ich hunde müde.

Code: Alles auswählen

Procedure.s ExePath() 
  ExePath$ = Space(2048) 
  GetModuleFileName_(0,@ExePath$,2048) 
  ProcedureReturn GetPathPart(ExePath$) 
EndProcedure

Procedure.s ExeName() 
  ExeName$ = Space(2048) 
  GetModuleFileName_(0,@ExeName$,2048) 
  ProcedureReturn GetFilePart(ExeName$) 
EndProcedure

If ExamineDirectory(0, ExePath(), "")
  exe$= ExeName()
  Repeat
    Select NextDirectoryEntry()
      Case 0
        Break
      Case 1
        name$= DirectoryEntryName()
        If name$ <> exe$
          RenameFile(name$, "Pic."+name$)
        EndIf
    EndSelect
  ForEver
EndIf
PS. @Danilo die Proceduren habe ich dir geklaut. ;)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Tibor hat geschrieben:PS. @Danilo die Proceduren habe ich dir geklaut. ;)
Nö, die hast Du den FAQs entnommen - dafür sind sie ja da. :)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten