Problem mit RenameFile

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
argus
Beiträge: 18
Registriert: 24.02.2014 12:12

Problem mit RenameFile

Beitrag von argus »

Hallo Leute,

ich habe ein Problem, an dem ich verzweifle:

Ich habe folgendes Mini-Programm geschrieben, mit dem ich alle von Thunderbird exportierten EML-Dateien in einem Verzeichnis umbenenne. Das Programm greift die letzten 19 Zeichen des Namens ab und verwendet sie für den neuen Namen, das Verzeichnis holt er sich aus dem Clipboard:

Code: Alles auswählen

Verzeichnis$=GetClipboardText()

If ExamineDirectory(0,Verzeichnis$,"*.eml")
  While NextDirectoryEntry(0)
    If DirectoryEntryType(0)=#PB_DirectoryEntry_File
      oldname$=DirectoryEntryName(0)
      newname$=Right(oldname$,19)
      newname$=ReplaceString(newname$," ","_")
      Debug oldname$+" > "+newname$
      If RenameFile(oldname$ , newname$) = 0
        n=n+1
      EndIf
    EndIf
  Wend
Else
  MessageRequester("ExamineDirectory "+Verzeichnis$,"Es ist ein Problem beim Lesen des Verzeichnisses aufgetreten!")
EndIf

If n>0
  MessageRequester("RenameFile","Umbenennen "+n+"-mal fehlgeschlagen!")  
EndIf

End
Das Programm machte zunächst auch das, was es machen sollte - zumindest bis gestern. Ich habe es dann heute als Executable kompiliert und jetzt benennt es keine einzige Datei mehr um. Daraufhin habe ich es noch mal in der IDE-Umgebung laufen lassen und einen DEBUG-Command eingefügt, um mir vor dem Umbenennen den alten und neuen Dateinamen anzeigen zu lassen. Das lieferte dann den folgenden Output:

aaa - 2014-11-27 0940.eml > 2014-11-27_0940.eml
bbb - 2014-06-27 1542.eml > 2014-06-27_1542.eml
ccc - 2014-10-29 1744.eml > 2014-10-29_1744.eml

Das sieht vollkommen korrekt aus, so wie das Programm es machen soll, bloß macht es das nicht und ich weiß nicht warum.

Ich habe unter Windows 7 zwei PB-Versionen laufen: PB 5.21 (32 Bit) und PB 5.21 (64 Bit). Das obige Programm habe ich unter dem 32-Bit-PB laufen lassen, aber unter dem 64-Bit-PB tritt das gleiche Problem auf. Ich weiß nicht, wo der Fehler liegt.

Vielen Dank schon mal vorab.
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Problem mit RenameFile

Beitrag von Sicro »

Siehe Kommentare im Code:

Code: Alles auswählen

Verzeichnis$=GetClipboardText()

If ExamineDirectory(0,Verzeichnis$,"*.eml")
  While NextDirectoryEntry(0)
    If DirectoryEntryType(0)=#PB_DirectoryEntry_File
      oldname$=DirectoryEntryName(0)
      newname$=Right(oldname$,19)
      newname$=ReplaceString(newname$," ","_")
      Debug oldname$+" > "+newname$
      
      If Right(Verzeichnis$, 1) <> "\": Verzeichnis$ + "\": EndIf
      
      ; Du willst doch die Datei im Verzeichnis$ umbenennen, dann musst du das Verzeichnis auch angeben,
      ; sonst möchte RenameFile() die Datei im aktuellem Verzeichnis umbenennen, wo es die Datei aber nicht gibt,
      ; weil aktuelles Verzeichnis ist nicht Verzeichnis$
      If RenameFile(Verzeichnis$ + oldname$ , Verzeichnis$ + newname$) = 0
        n=n+1 ;<<<< geht auch so: n+1
      EndIf
    EndIf
  Wend
Else
  MessageRequester("ExamineDirectory "+Verzeichnis$,"Es ist ein Problem beim Lesen des Verzeichnisses aufgetreten!")
EndIf

If n>0
  MessageRequester("RenameFile","Umbenennen "+n+"-mal fehlgeschlagen!") 
EndIf

End
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
argus
Beiträge: 18
Registriert: 24.02.2014 12:12

Re: Problem mit RenameFile

Beitrag von argus »

Hallo Sicro,

sorry, da hatte ich wohl ein Brett vorm Kopf ... :)
Kaum macht man's richtig, schon funktioniert's.

Danke.

VG von Argus
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Problem mit RenameFile

Beitrag von Vera »

Hallo Argus, hier ein kleiner alternativ-Tip.

Man könnte das gewählte Verzeichnis als 'Arbeitsverzeichnis' setzen, dann reichen auch nur die Dateinamen.
Sowas ist auch ganz hilfreich, wenn man portabel oder mit relativen Pfaden arbeiten will.
Auch macht es hier das Anhängen des Backslashs unnötig und der Code bliebe cross-plattform.

Code: Alles auswählen

Verzeichnis$=GetClipboardText()
 
SetCurrentDirectory(Verzeichnis$) 

If ExamineDirectory(0,Verzeichnis$,"*.eml")
Gruß ~ Vera
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
argus
Beiträge: 18
Registriert: 24.02.2014 12:12

Re: Problem mit RenameFile

Beitrag von argus »

Hallo Vera,

danke für den Tipp. :)
Das macht auf jeden Fall Sinn, besonders wenn man öfter auf auf den Verzeichnis-Namen referenzieren muss.

VG von Argus
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Problem mit RenameFile

Beitrag von Sicro »

Vera hat geschrieben:SetCurrentDirectory(Verzeichnis$)
Dazu ein Hinweis:
Sollte der Code später in einem großem, schlecht überschaubarem Code stecken oder in einem Include, könnte diese Variante zu Problemen führen, wenn man doch das standardmäßige CurrentDirectory im weiterem Code verwenden möchte und an den geänderten Wert nicht denkt.

Code: Alles auswählen

Procedure Machwas()
  SetCurrentDirectory("...")
  ; ...
EndProcedure

; [viel Code]

Machwas()

If ReadFile(0, "Database.dat") ; <<<==== hier möchte man eigentlich auf das standardmäßige CurrentDirectory zugreifen
Also besser so:

Code: Alles auswählen

Procedure Machwas()
  Protected OldCurrentDirectory.s = GetCurrentDirectory()  
  SetCurrentDirectory("...")

  ; [Code]

  SetCurrentDirectory(OldCurrentDirectory)
EndProcedure
Bei der Verwendung von Threads wird die Sache noch problematischer, weil vielleicht schon ein Thread auf das standardmäßige CurrentDirectory zugreifen möchte, bevor SetCurrentDirectory(OldCurrentDirectory) ausgeführt wurde.

Beachtet man dies, ist diese Variante natürlich noch besser :)
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Problem mit RenameFile

Beitrag von Vera »

Danke für die Warnung Sicro :allright:

das werd' ich ab jetzt berücksichtigen ~ Vera
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Antworten