Autore Topic: Identificare un tipo di file  (Letto 2655 volte)

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 416
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #15 il: 12 Marzo 2012, 22:10:20 »
ho utilizzato il codice da voi postato, scrivendolo cosi:
Codice: [Seleziona]
Public Sub Main()
  Dim firma, nomifile, stringa As String
  For Each nomifile In Dir(User.Home & "/test")
    Print nomifile
    stringa = File.Load(User.Home & "/test/" & nomifile)
    Print Left$(stringa, 4)
  Next
End
Poi gli ho detto di leggere una cartella con un file png, uno mp3, uno avi ed una wma
mi da questo come risultato:
Codice: [Seleziona]
Schermata del 2012-02-14 13:17:27.png
�PNG
07 - Ligabue - Certe Notti.mp3
ID3^C
ED_1024.avi
RIFF
02 Snow ((Hey Oh)).wma
0&�u
Mi da dei caratteri che non legge, forse sono dei caratteri speciali, magari gambads ha la possibilità di impostare l'utf-8 o come si chiama?
Su internet, ho visto che quello di leggere l'header di un file è forse l'unico modo per identificare un file, anche uno con estensione sbagliata o privo.
Avevo pensato quindi di stampare l'header dei file in modo, da conoscere l'header di ogni tipo di file e quindi associarlo come audio, video, immagine ecc...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #16 il: 12 Marzo 2012, 23:30:54 »
Mi da dei caratteri che non legge, forse sono dei caratteri speciali,....

Prendiamo come esempio l'header del file .png:
facendo un'analisi esadecimale del file, vediamo che i primi 4 byte sono: 89 50 4E 47.
Il valore non "leggibile in stampa" è il primo: 89, che in decimale = 137. ...in vero, puoi vederlo nel suo "carattere" corrispondente, se vuoi, in questa maniera:

Codice: gambas [Seleziona]

 Print String.Chr(&0089)

e vedrai comparire questo carattere:  ...ma ai tuoi fini quel valore in quanto "carattere", preso cioè come carattere testuale (...quel tipo strano di carattere), non t'aiuta.

Del resto io ritengo che la cosa non ti debba preoccupare, poiché non tutti i file riportano nel proprio header la denominazione della propria estensione. Il file .png sì, ma per esempio il file Midi no; così anche l'.mp3 non riporta i caratteri "mp3" nell'header. Ciò vuol dire che non potrai "estrapolare" l'estensione da lì da convertirla poi in stringa per mostrarla... per esempio in console.

C'è da capire se gli header di tutti i tipi di file, che ci interessano, si trovano tutti ai primissimi byte di ciascun file.
A mio modesto parere, dovresti fare un elenco dei byte identificativi di ciascun tipo di file. Conoscendo i byte ricorrenti (quindi universali) in un determinato tipo di file, potresti effettuare una "selezione" (e quindi il "riconoscimento", l'"identificazione") del tipo di file tramite una corrispondenza fra byte "raccolti" nel file da analizzare, e elenco presente nel programma.

...una cosa di 'sto genere (la butto di getto):

Codice: gambas [Seleziona]

Public Sub Main()

  Dim firma, nomifile, stringa, stringafinale As String
  Dim a As Integer

  For Each nomifile In Dir(User.Home & "/test")
    Print nomifile
    stringa = File.Load(User.Home & "/test/" & nomifile)

' verifico - per esempio - i primi 4 byte/carattere. Sono costretto - ahimé - a 'sto ciclo,
' per poter mutare ogni singolo carattere nel corrispondente codice ASCII:
        For a = 1 To 4
          stringafinale = stringafinale & Asc(Mid(stringa, a, 1))
        Next

'...e li comparo con il mio seguente "elenco" presente nel programma:        
       Select case stringafinale
         Case "137807871"
            Print "Il file " & nomifile & " è di tipo PNG !"
         Case "........ "
            Print "Il file " & nomifile & " è di tipo ..... !"
          Case etc etc
      Select End

        stringafinale = Null
  Next

End

« Ultima modifica: 19 Marzo 2012, 18:55:16 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #17 il: 13 Marzo 2012, 23:05:19 »
vi chiedo scusa se non ho letto tutta la discussione, quindi magari già avete affrontato ciò che volevo proporvi...

avete provato con  il comando bash  "file  nomefile" che in base al magic number  descrive il tipo di file?

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #18 il: 14 Marzo 2012, 00:53:49 »
vi chiedo scusa se non ho letto tutta la discussione, quindi magari già avete affrontato ciò che volevo proporvi...
avete provato con  il comando bash  "file  nomefile" che in base al magic number  descrive il tipo di file?

Sì. E' stato proposto da sotema:
http://www.gambas-it.org/smf/index.php?topic=2043.msg22532#msg22532

da lì è nato un dibattito al riguardo.
« Ultima modifica: 16 Marzo 2012, 14:43:49 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #19 il: 14 Gennaio 2014, 22:29:06 »
Fai una ricerca su "MIME" e/o "MIMETYPE"...

Riprendo questo suggerimento di md9327, per segnalare che con le funzioni di Gambas è possibile individuare il mimetype di un file, e quindi la sua tipologia in modo inquivocabile, attivando il componente gb.desktop ed utilizzando, dunque, la sua Classe "DesktopMime" in questo modo:
Codice: gambas [Seleziona]

Public Sub Form_Open()

   Print DesktopMime.FromFile("/percorso/del/file").Type

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »