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

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 416
    • Mostra profilo
Identificare un tipo di file
« il: 08 Marzo 2012, 20:51:16 »
Come faccio ad identificare una tipologia di file? Ad esempio, se ho 3 file, uno video, uno audio ed una immagine, come faccio a far capire al programma qual'è quello video tra i 3? Tramite le estensioni?

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #1 il: 08 Marzo 2012, 21:21:55 »
Come faccio ad identificare una tipologia di file? Ad esempio, se ho 3 file, uno video, uno audio ed una immagine, come faccio a far capire al programma qual'è quello video tra i 3? Tramite le estensioni?

Codice: gambas [Seleziona]

Public Sub button1_Click()

 dim est As String

  est = File.Ext("percorso_del_file")

  Print est

End



Più in particolare per quanto hai chiesto. Supponiamo che hai tre file: uno .avi, uno .wav ed uno .tif:

Codice: gambas [Seleziona]

Public Sub button1_Click()
 Dim ogniFile As String

 For Each ogniFile In Dir("/percorso_cartella_contenente_i_tre_file/", "*.*")

  If File.Ext(ogniFile) = "avi" Then
   Print ogniFile
  Endif
 
 Next

End



...anzi, ancor più brevemente:
Codice: gambas [Seleziona]

Public Sub button1_Click()
 Dim ogniFile As String

 For Each ogniFile In Dir("/percorso_cartella_contenente_i_tre_file/", "*.avi")

' vedo in console quali file .avi sono stati trovati:
    Print ogniFile
  
 Next

End
« Ultima modifica: 19 Marzo 2012, 18:54:10 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 sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #2 il: 08 Marzo 2012, 22:12:53 »
Attento che l'estensionsene può essere ingannevole; ad esempio un file .ogg può essere audio e/o video.
Potrebbe essere una soluzione usare la funzione shell unitamente al comando bash file. Qualcosa del tipo:

Codice: gambas [Seleziona]
Dim sFile As String

  Shell "file " & User.home &/ "Music" &/ "Josh.ogg" To sFile


la stringa sFile conterrà la descrizione del tipo di file, ad esempio nel caso:

/home/emynadia/Music/Josh.ogg: Ogg data, Vorbis audio, stereo, 44100 Hz, ~100000 bps, ...

oppure:

/home/emynadia/Videos/Fast.ogg: Ogg data, Theora video

o ancora:

/home/emynadia/Pictures/gambas.svg: SVG Scalable Vector Graphics image
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #3 il: 09 Marzo 2012, 03:37:54 »
Attento che l'estensionsene può essere ingannevole; ad esempio un file .ogg può essere audio e/o video.
Potrebbe essere una soluzione usare la funzione shell unitamente al comando bash file. Qualcosa del tipo:

Codice: gambas [Seleziona]
Dim sFile As String

  Shell "file " & User.home &/ "Music" &/ "Josh.ogg" To sFile


la stringa sFile conterrà la descrizione del tipo di file

Se il fine del programma è di "far distinguere direttamente dal programma", (come mi pare  :-\ chiedeva Lux), un preciso "tipo" di file fra diversi con la medesima estensione, entrambe le soluzioni da noi proposte, seppur interessanti, non bastano.

Sia riguardo alla tua soluzione che alla mia, pertanto, a mio modesto parere, Lux dovrà far effettuare dal programma comunque un'analisi capace di individuare il tipo di file voluto:
- nella tua soluzione ritengo analizzando le righe presenti nella variabile stringa restituita da Shell, rintracciando uno o due di elementi che identifichino il tipo di file;

- nel mio caso potrebbe farsi un'analisi esadecimale (o anche solo testuale, laddove utile) dell'header (che distingue il tipo di file), oppure di altro segmento del file. Riguardo all'header, ad esempio, per il Midi (...deformazione "professionale"  ;D ) è: 4D 58 68 64  (testualmente è: MThd). Insomma si potrebbe fare una cosa come il seguente esempio:
In una cartella poniamo un vero file Midi e vari file di altro tipo, ai quali cambiamo  :devil: l'estensione in .mid. In questo modo tutti i file, presenti nella cartella, avranno l'estensione .mid ; ma... quale è il vero file Midi ?  :rolleyes:
Allora... risolvo  così:

Codice: gambas [Seleziona]

Public Sub Button1_Click()

 Dim $F, ogniFile As String

  For Each ogniFile In Dir("/percorso_del_file/", "*.mid")

' vedo in console il nome di ciascun file .mid esistente nella cartella:
    Print ogniFile

' quindi me lo carico....
    $f = File.Load("/percorso_del_file/" & ogniFile)

'...e verifico che i primi 4 byte del file caricato corrispondano ai caratteri: MThd
' ossia all'inizio dell'Header Chunk che tipicizza il file Midi standard:
    If Left($f, 4) = "MThd" Then
      Print "Il file Midi VERO è: "; ogniFile
    Endif

  Next

End

...ed infatti funziona.  

...che ne pensi ?
« Ultima modifica: 19 Marzo 2012, 18:54:35 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 sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #4 il: 09 Marzo 2012, 09:38:43 »
e se il file audio/video fosse in formato mp3?
se ricordo bene ma mp3 non ha un vero e proprio header, ma solo dei frame header.
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #5 il: 09 Marzo 2012, 14:07:47 »
e se il file audio/video fosse in formato mp3?
se ricordo bene ma mp3 non ha un vero e proprio header, ma solo dei frame header.

Sì, è vero. ...ma con quale forza miracolosa lo stesso comando "File", da te segnalato, riesce a capire che si tratta di un file .mp3, indicandone addirittura anche alcune caratteristiche essenziali, e non di un video... porno  :P ? E come fa, per esempio, A-Mule/E-Mule a riconoscere i file falsi (fake) ?
Suppongo ci sia qualche parte del codice binario comune a tutti (e solo a loro) i file .mp3 da poter sottoporre e quindi rilevare mediante analisi sintattica (Parsing) !
....
http://stackoverflow.com/questions/4177922/how-to-determine-file-type
http://www.visual-basic.it/articoli/sfTagMP3_ID3_04.htm
http://www.visual-basic.it/articoli/sfMp3pa5.htm
http://pugnonelvento.blogspot.com/2011/11/ricercare-file-audio.html
http://forum.html.it/forum/showthread/t-955606.html
http://willcode4beer.com/parsing.jsp?set=mp3ID3
http://www.mp3-tech.org/
http://www.id3.org/Home
https://forums.oracle.com/forums/thread.jspa?threadID=2150253

 ;)
« Ultima modifica: 09 Marzo 2012, 23:33:39 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 sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #6 il: 09 Marzo 2012, 15:44:37 »
in quanto al video porno...è comunque un video!  ;D
Ad ogni modo è vero che anche il comando file ha dei limiti, ad esempio non tratta i file con caratteri speciali, come capita spesso con Amule/Emule.
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #7 il: 09 Marzo 2012, 15:50:40 »
in quanto al video porno...è comunque un video!  ;D

ᶘ(^_^)ᶅ
  /‿ ‿\
     。
 (  ▼  )

Comunque sia, questa discussione ci ha consentito di approfondire un po' l'argomento.... del riconoscimento dei file, intendo !  ;D
« 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #8 il: 09 Marzo 2012, 16:19:57 »
Fai una ricerca su "MIME" e/o "MIMETYPE"...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #9 il: 09 Marzo 2012, 16:31:43 »
Fai una ricerca su "MIME" e/o "MIMETYPE"...
Interessante, ma...... suppongo che il suggerimento sia indirizzato - ovviamente - a Lux ! :P
« Ultima modifica: 10 Marzo 2012, 13:36:43 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 Lux

  • Maestro Gambero
  • ****
  • Post: 416
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #10 il: 10 Marzo 2012, 12:46:35 »
Eccomi tornato, perdonate la mia lunga assenza, ma il lavoro chiama. Mamma mia quanto avete scritto!
Allora comincerò a fare un po di ricerche utilizzando i vostri link, in modo da chiarirmi le idee.
Grazie! :2birre:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #11 il: 10 Marzo 2012, 17:07:47 »
Allora comincerò a fare un po di ricerche utilizzando i vostri link, in modo da chiarirmi le idee.

Facci sapere eventuali informazioni e soluzioni trovate, nonché progressi con il codice !
« 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #12 il: 12 Marzo 2012, 16:37:09 »
E soprattutto fai un bella donazione alla fondazione MD9327!!!  ;D

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #13 il: 12 Marzo 2012, 17:07:34 »
E soprattutto fai un bella donazione alla fondazione MD9327!!!  ;D

Aaaaah ! Ora ho capito il tuo nome !

Make Donation 9327 (euro to my foundation) !

...messaggio subliminare !  


« Ultima modifica: 12 Marzo 2012, 19:54:21 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 Lux

  • Maestro Gambero
  • ****
  • Post: 416
    • Mostra profilo
Re: Identificare un tipo di file
« Risposta #14 il: 12 Marzo 2012, 21:48:47 »
Mamma mia, 9327 Euro?  :o comincia a diventare costoso questo forum...... :hatecomputer: