Seite 1 von 1

Problem mit RenameFile

Verfasst: 30.11.2014 19:49
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.

Re: Problem mit RenameFile

Verfasst: 30.11.2014 23:38
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

Re: Problem mit RenameFile

Verfasst: 01.12.2014 02:35
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

Re: Problem mit RenameFile

Verfasst: 01.12.2014 12:47
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

Re: Problem mit RenameFile

Verfasst: 01.12.2014 15:38
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

Re: Problem mit RenameFile

Verfasst: 01.12.2014 19:05
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 :)

Re: Problem mit RenameFile

Verfasst: 02.12.2014 12:22
von Vera
Danke für die Warnung Sicro :allright:

das werd' ich ab jetzt berücksichtigen ~ Vera