Italian Errore misterioso su DirInternalCache

Giovanni Passali

Member
Licensed User
Longtime User
Ciao a tutti,
ho scritto del codice per visualizzare delle immagini scaricate da un mio server.
Per ottimizzare i download, salvo le immagini sul cellulare, e poi quando ne cerco una, verifico se già è presente oppure la scarico dal server.
Il sistema funziona (vedo l'immagine in una ImageView, sia da filesystem che da download), ma misteriosamente la app va in crash dopo una trentina di secondi.
Usavo la DirInternalCache dove creavo (se non esistenti) delle sotto cartelle. Ma non ho trovato il punto di codice dove si verifica l'errore, anche mettendo opportuno breakpoint.
Allora ho sostituito tutti i DirInternaCache con DirInternal, e l'errore si verifica lo stesso!!!
Ecco il log:
B4X:
** Service (check2receive) Start **
** Service (check2receive) Start **
** Service (check2receive) Start **
java.lang.RuntimeException: java.io.FileNotFoundException: /data/data/com.XXXZZZ.demo/cache/6: open failed: EISDIR (Is a directory)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:201)
    at anywheresoftware.b4a.BA$3.run(BA.java:320)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4476)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:816)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:583)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.io.FileNotFoundException: /data/data/com.XXXZZZ.demo/cache/6: open failed: EISDIR (Is a directory)
    at libcore.io.IoBridge.open(IoBridge.java:406)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
    at anywheresoftware.b4a.objects.streams.File.OpenOutput(File.java:370)
    at anywheresoftware.b4a.samples.httputils2.httputils2service._hc_responsesuccess(httputils2service.java:130)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:175)
    ... 10 more
Caused by: libcore.io.ErrnoException: open failed: EISDIR (Is a directory)
    at libcore.io.Posix.open(Native Method)
    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
    at libcore.io.IoBridge.open(IoBridge.java:390)
    ... 16 more
Qualche idea???
 

LucaMs

Expert
Licensed User
Longtime User
Difficile dirlo senza avere il codice.

L'unica cosa che salta agli occhi è il messaggio, ripetuto più volte:

open failed: EISDIR (Is a directory)

come se tu cercassi di aprire un file di nome EISDIR che invece è una directory.
 

Giovanni Passali

Member
Licensed User
Longtime User
Misterioso pure per me, visto che non c'è nessuna cartella EISDIR; ma credo che sia un messaggio interno. Ora provo.
 

Giovanni Passali

Member
Licensed User
Longtime User
Questo è il pezzetto di codice
B4X:
Sub SaveImage(link As String)
' link è qualcosa del tipo "cartella/nomefile.jpg"
    Dim i1, i2, lungo As Int
    Dim nomeFile, cartella As String
    i1 = link.LastIndexOf("/")
    i2 = link.LastIndexOf2("/",i1-1)
    cartella = link.SubString2(i2+1,i1)
    nomeFile = link.SubString(i1+1)
    If nomeFile.Length<1 Then
        Log("Nome file immagine non trovato")
        Return
    End If
   'creo la cartella se non esiste
    If File.IsDirectory(File.DirInternal,cartella)=False Then
        File.MakeDir(File.DirInternal,cartella)
    End If
   
    Dim cnv As Canvas
' logoProdotto è una ImageView
    cnv.Initialize(logoProdotto)
    Dim Out As OutputStream
    Out = File.OpenOutput(File.DirInternal & "/" & cartella, nomeFile, False)
    cnv.Bitmap.WriteToStream(Out, 100, "PNG")
    Out.Close
End Sub
La cosa sconcertate è che mettendo qui dei breakpoint il codice si ferma quando salva l'immagine (e poi la vedo!) ma non si ferma qui (né altrove dove sembrava ragionevole) quando va in crash!
 

LucaMs

Expert
Licensed User
Longtime User
Non dar retta alla mia "qualifica" di Expert, eh.

Io proverei ad usare la funzione File.Combine
B4X:
Dim Path As String = File.Combine(File.DirInternal, cartella)
Out = File.OpenOutput(Path, nomeFile, False)
 

Giovanni Passali

Member
Licensed User
Longtime User
Ok ho risolto.
Ho usato il tuo consiglio, ma ho idea che abbia risolto perché ho fatto (dalle impostazioni del cellulare) la pulizia della cache della mia app.
Infatti non usavo più nel codice la DirInternalCache (come avevo fatto inizialmente) e non c'era motivo che andasse in crash, se non perché (immagino) la app andava a controllare i dati nella sua internal cache, trovandoli corrotti.
Comunque sia, dopo la pulizia, niente crash.
Grazie in ogni caso.

PS.
A proposito della tua qualifica da Expert...
A volte mi succede che qualche cliente mi dica una frase del tipo: "sa, io non mi intendo di informatica..."
Allora io replico: "Io neanche: la differenza è che io non lo vado a dire in giro..."
:D
 

LucaMs

Expert
Licensed User
Longtime User
Bellissima questa !!!!

Sergio

Vero, ma non è solo molto divertente.

A parte il fatto che ho il vago sospetto che in quel momento tu l'abbia confessato :p...
sospetto anche che molte persone "di successo" facciano altrettanto, soprattutto politici:
hanno magari qualche titolo ma praticamente sono esperti in... niente.

Insomma, nel 2014 l'abito fa ancora il monaco.
 
Top