Seite 1 von 1

Batch-Tool zur Rettung von .chk-Dateien

Verfasst: 27.05.2008 01:22
von Delle
Hallo,

ich habe in einem Ordner knapp 8.000 .chk-Dateien liegen wegen einem Festplattencrash...

Die 8.000 Dateien jetzt im Hex-Editor öffnen und nachschauen was es ev. für eine Dateityp ist, macht natürlich viel Arbeit :-)

Deshalb die Idee eines Tools: Es liest alle Dateien des Verzeichnisses nacheinander ein:

Code: Alles auswählen

Procedure.s ListFiles(directory.s , filename.s, extension.s , directoryid.l )
  If Right(directory,1)<>"\"
    directory+"\"
  EndIf
  If ExamineDirectory(directoryid,directory,"*.*")
    dirid=NextDirectoryEntry(directoryid)
    While dirid
      dirtype = DirectoryEntryType(directoryid)
      Select dirtype
        Case #PB_DirectoryEntry_File
          file.s=DirectoryEntryName(directoryid)
          this_extension.s=LCase(GetExtensionPart(file))
          this_filename.s=LCase(Left(file,Len(file)-Len(this_extension)))
          If Len(this_extension)
            this_filename=Left(this_filename,Len(this_filename)-1)
          EndIf
          If this_extension=extension Or extension="*"
            If this_filename=filename Or filename="*"
              file.s=directory+DirectoryEntryName(directoryid)
              
              Debug file+":"
              
              ReadFile(0, file)
              header$=ReadString(0)
    

              
              ; CHECK



              
              CloseFile(0)
              
              
              
                  
            EndIf
          EndIf
        Case #PB_DirectoryEntry_Directory
          If DirectoryEntryName(directoryid)<>"." And DirectoryEntryName(directoryid)<>".."     
            ListFiles(directory+DirectoryEntryName(directoryid)+"\",filename,extension,directoryid+1)      
          EndIf
      EndSelect
      dirid=NextDirectoryEntry(directoryid)
    Wend
  EndIf
  ProcedureReturn ""
EndProcedure


ListFiles("d:\FOUND.000\","*","chk",0)
Soweit funzt das ja ganz gut, was jetzt noch fehlt ist eine Überprüfung ob z.B. "ID3" im String "header$" vorkommt - wenn ja soll die Datei in {name}.mp3 umbenannt werden. Das Gleiche bei "JFIF" (jpg-Datei) usw.

Hat jemand so eine Vergleichsprozedur für binäre Inhalte oder sowas?

PHP-mäßig würde es so aussehen if(eregi("ID3",$header)){...}

Verfasst: 27.05.2008 04:14
von Delle
So nun mit Erkennung von MP3-Dateien, allerdings werden die .chk-Dateien nicht in .mp3 umbenannt - warum?

Code: Alles auswählen

Procedure.s ListFiles(directory.s , filename.s, extension.s , directoryid.l )
  If Right(directory,1)<>"\"
    directory+"\"
  EndIf
  If ExamineDirectory(directoryid,directory,"*.*")
    dirid=NextDirectoryEntry(directoryid)
    While dirid
      dirtype = DirectoryEntryType(directoryid)
      Select dirtype
        Case #PB_DirectoryEntry_File
          file.s=DirectoryEntryName(directoryid)
          this_extension.s=LCase(GetExtensionPart(file))
          this_filename.s=LCase(Left(file,Len(file)-Len(this_extension)))
          If Len(this_extension)
            this_filename=Left(this_filename,Len(this_filename)-1)
          EndIf
          If this_extension=extension Or extension="*"
            If this_filename=filename Or filename="*"
              file.s=directory+DirectoryEntryName(directoryid)
              
              ;Debug file+":"
              
ReadFile(0, file)
header$=ReadString(0)
pos = FindString(header$, "ID3", 1) ;

  If pos
      
      Debug file+": MP3!"
      
   
      If RenameFile("d:\FOUND.000\"+file, "d:\FOUND.000\"+file+".mp3")
        Debug "erfolgreich."
      Else 
        Debug "fehlgeschlagen."
      EndIf
      
  EndIf 

CloseFile(0)
              
              
              
                  
            EndIf
          EndIf
        Case #PB_DirectoryEntry_Directory
          If DirectoryEntryName(directoryid)<>"." And DirectoryEntryName(directoryid)<>".."     
            ListFiles(directory+DirectoryEntryName(directoryid)+"\",filename,extension,directoryid+1)      
          EndIf
      EndSelect
      dirid=NextDirectoryEntry(directoryid)
    Wend
  EndIf
  ProcedureReturn ""
EndProcedure


ListFiles("d:\FOUND.000\","*","chk",0)


Verfasst: 27.05.2008 09:33
von Kiffi
Delle hat geschrieben:allerdings werden die .chk-Dateien nicht in .mp3 umbenannt - warum?
weil Du die Datei vor dem Umbenennen schließen musst.

Grüße ... Kiffi

Verfasst: 27.05.2008 12:19
von Delle
Ja, das fiel mir heute Nacht im Bett auch noch ein .-)

Hab es geändert, allerdings immer noch ohne Erfolg:

Code: Alles auswählen

ReadFile(0, file)
header$=ReadString(0)
pos = FindString(header$, "ID3", 1) ;

CloseFile(0)

  If pos
      
      Debug file+": MP3!"
      
   
      If RenameFile("d:\FOUND.000\"+file, "d:\FOUND.000\"+file+".mp3")
        Debug "erfolgreich."
      Else 
        Debug "fehlgeschlagen."
      EndIf
      
  EndIf 

Verfasst: 27.05.2008 13:01
von Kiffi
Hallo Delle,

vielleicht vorher noch einen evtl. vorhandenen Schreibschutz entfernen?

Grüße ... Kiffi

// Edit: Lass Dir bitte mal den ersten Parameter via Debug ausgeben.

Verfasst: 27.05.2008 13:23
von Delle
Schreibschutz hat nur der Ordner (normal), alle anderen Dateien darin nicht.

Es ist wirklich komisch...

Verfasst: 27.05.2008 13:29
von Kiffi
nochmal (falls das grade untergegangen ist):

Code: Alles auswählen

Debug "d:\FOUND.000\"+file
Debug "d:\FOUND.000\"+file+".mp3"

If RenameFile("d:\FOUND.000\"+file, "d:\FOUND.000\"+file+".mp3")
  Debug "erfolgreich."
Else
  Debug "fehlgeschlagen."
EndIf
Ich vermute, dass 'file' bereits den kompletten Pfad enthält.

Grüße ... Kiffi

Verfasst: 27.05.2008 13:39
von Delle
Ja ist kompletter Pfad... das habe ich gestern zwar überprüft, allerdings wohl im Gehirn falsch gewertet :-) Thanks!