Italian [RISOLTO] B4J - Estensione file e muovere un file

Roberto Tsolakis

Member
Licensed User
Longtime User
Salve a tutti !
Dopo un bel pò di anni, ho deciso di riutilizzare la piattaforma B4 ... ho praticamente dimenticato tutto, ma grazie alla logica di altri linguaggi con coi programmo (sono un autodidatta da sempre), ho risolto vari problemi guardando semplicemente sul forum, ma questa cosa in particolare, mi sta bloccando l'avanzata di un semplicissimo programma, ovvero trovare l'estensione del file!

B4X:
Private Sub Button1_Click
 Private Path As String = "X:\"
 Private ListaFile As List
 Private Estensione As List

 ListaFile = File.ListFiles(Path)
 For Each x In ListaFile
  If File.IsDirectory(Path,x)=False Then
  Log(Path)
  Log(x)
  Estensione=Regex.Split("." , x )
  Log (Estensione)
  End If
 Next
End Sub

Il problema è che non mi rileva alcun punto all'interno della stringa Estensione (o se vogliamo x)
Ho provato a mettere un carattere al posto del pattern ".", ed in quel caso la lista, mi viene restituita.

Qualche aiuto ?
 

Sagenut

Expert
Licensed User
Longtime User
Nel Regex il "." dovrebbe essere un carattere speciale.
Per poterlo utilizzare devi anteporre il \
B4X:
Estensione=Regex.Split("\." , x )
Prova così.
Bentornato tra noi. ;)
 

Roberto Tsolakis

Member
Licensed User
Longtime User
oh cavolo ... sono dei giorni che ci sbatto la testa (sia ben chiaro, non ho tempo e quindi ci guardo 10/15 min al giorno) ...
eppure le regex le ho conosciute in primis dal php ! Non ci avevo pensato!
Grazie mille Sagenut !
 

LucaMs

Expert
Licensed User
Longtime User
Tre cosette:
  1. Ricordavo qualche comando per ottenere l'estensione (ed anche il nome) di un file tramite un comando; beh, non ho trovato con quale libreria
  2. Sarebbe bene che fossero inseriti nella libreria Core, comando File (un "Wish" da scrivere)
  3. Tieni in considerazione che i file potrebbero non avere estensione, quindi non avere il punto.
 

Elric

Well-Known Member
Licensed User
Io mi sono fatto questi snippets:
B4X:
Public Sub GetDir (Path As String) As String
    If Path.Contains("\") Then
        Return Path.SubString2(0,Path.LastIndexOf("\"))
    Else
        Return Path
    End If
End Sub

Public Sub GetFilenameExt (Path As String) As String
    If Path.Contains("\") Then
        Return Path.SubString(Path.LastIndexOf("\") + 1)
    Else
        Return Path
    End If
End Sub

Public Sub GetFilename (Path As String) As String
    If (Path.Contains("\") And Path.Contains(".")) Then
        Return Path.SubString2(Path.LastIndexOf("\") + 1, Path.LastIndexOf("."))
    Else If (Not(Path.Contains("\")) And Path.Contains(".")) Then
        Return Path.SubString2(0, Path.LastIndexOf("."))
    Else
        Return ""
    End If
End Sub

Public Sub GetFileExtension (Path As String) As String
    If Path.Contains(".") Then
        Return Path.SubString(Path.LastIndexOf(".") + 1)
    Else
        Return ""
    End If
End Sub
 

Sagenut

Expert
Licensed User
Longtime User
Potrebbe esserci il caso limite di un nome file che contiene dei punti o estensioni multiple.
Quindi conviene fare lo split in un Array, o una List come nel post di apertura, e poi fare riferimento all'ultimo elemento per avere l'estensione.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Io mi sono fatto questi snippets:
.........

... che funzionano nel 99,9% dei casi, quindi ottimo lavoro !!!

Però prendi il caso di:
/android/miacartella/cartella.tuttamia/miobelfile

non l'ho provato, ma credo che le tue routine restituiscono valori sbagliati
per estrarre l'estensione del file, prima devi estrarre il nome del file guardando l'ultimo "/", poi da lì l'ultimo "."
 

Roberto Tsolakis

Member
Licensed User
Longtime User
Io semplicemente, se mi trovo numero di array = 0 ... mi da estensione vuota ... e non so perchè mi funziona al 100%.
Praticamente mi sono fatto un utility per radunare i file in base alle estensioni. Se non trova estensione (o nel mio caso, se sono estensioni inutili), me li mentte nella directory ALTRO. Quando avrò terminato (e soprattutto abbellito, visto che è già terminato, lo pubblicherò nel forum, anche se probabilmente non servirà a nessuno).


Piccola precisazione, rilevata in un'altra directory a cui ho fatto fare l'operazione di seprazione file ... effettivamente, i file senza estensione, non mi veniva riportati correttamente.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Tieni in considerazione che i file potrebbero non avere estensione, quindi non avere il punto
Altra cosa da tenere in considerazione: il carattere separatore delle directory del S.O. sul quale giri il tuo SW.
In Windows è il backslash ("\") ma ad esempio in Linux è lo slash ("/").

Ergolo, create una variabile:
B4X:
Dim DirSep As String

Dim JO As JavaObject
JO.InitializeStatic("java.lang.System")
DirSep = JO.RunMethod("getProperty",Array As Object("file.separator"))

e nei vostri codici sostituite il literal "\" con DirSep.

(Serve per B4J, in quanto il vs SW creato con questo potrebbe girare sia su Windows che su Linux ed altri S.O.)
 

Xfood

Expert
Licensed User
Ia IA di google gemini da questi snipeet
Snippet di codice1
Dim FileName As String = "mio_file.tar.gz"
Dim Extensions() As String = File.GetExtensions(FileName)

'Extensions conterrà {"tar", "gz"}

Snippet di codice2
Dim FileName As String = "mio_file.txt"
Dim Extension As String = File.GetExtension(FileName)

'Extension conterrà "txt"
 

Sagenut

Expert
Licensed User
Longtime User

sirjo66

Well-Known Member
Licensed User
Longtime User
Ia IA di google gemini da questi snipeet
Snippet di codice1
Dim FileName As String = "mio_file.tar.gz"
Dim Extensions() As String = File.GetExtensions(FileName)

'Extensions conterrà {"tar", "gz"}

Snippet di codice2
Dim FileName As String = "mio_file.txt"
Dim Extension As String = File.GetExtension(FileName)

'Extension conterrà "txt"

E' codice VB.NET
 

Roberto Tsolakis

Member
Licensed User
Longtime User
Ia IA di google gemini da questi snipeet
Snippet di codice1
Dim FileName As String = "mio_file.tar.gz"
Dim Extensions() As String = File.GetExtensions(FileName)

'Extensions conterrà {"tar", "gz"}

Snippet di codice2
Dim FileName As String = "mio_file.txt"
Dim Extension As String = File.GetExtension(FileName)

'Extension conterrà "txt"
Su ChatGPT avevo richiesto una semplice parte di codice PHP ... eme la diede palesemente sbagliata.
Senza parlare di cenni storici e/o altro (avevo richiesto di farmi un esploso della formula della relatività, se non ricordo male, poi sono andato a cercare su Wikipedia e le cose non coincidevano, dando il merito di alcune parti ad altre persone, se non ricordo male)
 
Top