Italian [Risolto]Delete dir (non vuote) questo sconosciuto...

Luigi S

Active Member
Licensed User
Ho visto che ci sono molti modi per eliminare una cartella contenete altre cartelle e file, ne ho provati un paio simili ed ottengo lo stesso errore.
uno dei metodi è questo:

B4X:
        Dim MyList As List
        MyList.initialize
        Dim MyFile As String
        MyList=File.ListFiles(File.DirRootExternal & "/DirDaCancellare")
        For i= MyList.Size-1 To 0 Step -1
            MyFile=MyList.Get(i)
            File.Delete(File.DirRootExternal & "/DirDaCancellare",MyFile)
        Next

L'errore che ottengo (anche con un altro metodo simile) è questo:

B4X:
actsecondaria$ResumableSub_btnDelete_Clickresume (java line: 854)
java.io.IOException: /storage/emulated/0/DirDaCancellare is not a folder.
    at anywheresoftware.b4a.objects.streams.File.ListFiles(File.java:164)
    at aquile.latina.rchangar.actsecondaria$ResumableSub_btnDelete_Click.resume(actsecondaria.java:854)
    at anywheresoftware.b4a.BA.checkAndRunWaitForEvent(BA.java:275)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:215)
    at anywheresoftware.b4a.BA.raiseEvent(BA.java:201)
    at anywheresoftware.b4a.keywords.Common$15.run(Common.java:1804)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.app.ActivityThread.main(ActivityThread.java:7839)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

Da quello che posso capire io, pare che DirDaCancellare non sia una cartella, ma vi assicuro che c'è viva e vegeta!
Dove sbaglio?
 

LucaMs

Expert
Licensed User
Longtime User
Un paio di commenti sul codice che hai pubblicato:
B4X:
        Dim MyList As List
        MyList.initialize
        Dim MyFile As String
        MyList=File.ListFiles(File.DirRootExternal & "/DirDaCancellare")
        For i= MyList.Size-1 To 0 Step -1
            MyFile=MyList.Get(i)
            File.Delete(File.DirRootExternal & "/DirDaCancellare",MyFile)
        Next

1 - quando hai una List (e non è il solo caso) come quella, è utile e carino scrivere il loop in questo modo:
B4X:
For Each MyFile As String In MyList
    ' qui puoi usare MyFile come vuoi
Next

2 - Non vedo il motivo per scorrere la List al contrario; non mi sembra ci sia, in quel caso.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Hai i diritti (i permessi) su File.DirRootExternal?

1683239400494.png
 

Luigi S

Active Member
Licensed User
Grazie per la risposta, e per i consigli.
Ho provato il codice di erel

B4X:
Sub DeleteFolder (folder As String)
    For Each f As String In File.ListFiles(folder)
        If File.IsDirectory(folder, f) Then
            DeleteFolder(File.Combine(folder, f))
        End If
        File.Delete(folder, f)
    Next
End Sub

ho spostato tutto in DirDefaultExternal in modo (se ho capito bene) di non aver problemi di permessi con le recenti versioni di android.

Ma non ho capito come faccio a dargli la posizione(che suppongo manchi), perchè chiamando semplicemente:
B4X:
DeleteFolder ("Cartella_piena_da_cancellare")

mi da errore
B4X:
IOException: Cartella_piena_da_cancellare is not a folder.

In realtà ho fatto dei tentativi ma senza esito...
 

LucaMs

Expert
Licensed User
Longtime User
ho spostato tutto in DirDefaultExternal in modo (se ho capito bene) di non aver problemi di permessi con le recenti versioni di android.
No, dovresti usare o la DirInternal (zona accessibile soltanto alla tua app) oppure RP.GetSafeDirDefaultExternal (RP è un oggetto RuntimePermission).


DeleteFolder ("Cartella_piena_da_cancellare")
L'hai chiamata bene. Non capisco il motivo dell'errore; che ci sia qualche strano file?
Dopo "For Each f" metti un Log(f) per sapere quale sia il file. Forse meglio ancora con un Try-Catch:

B4X:
Sub DeleteFolder (folder As String)
    For Each f As String In File.ListFiles(folder)
        If File.IsDirectory(folder, f) Then
            DeleteFolder(File.Combine(folder, f))
        End If
        Try
            File.Delete(folder, f)
        Catch
            Log("Err in " & f)
        End Try
    Next
End Sub
 
Last edited:

Luigi S

Active Member
Licensed User
Usando RP.GetSafeDirDefaultExternal riuscirei a vedere il contenuto come succede con DirDefaultExternal?

Niente non ne vengo a capo, ho provato:
B4X:
Sub DeleteFolder (folder As String)
    Log("qua ci sono")
    For Each f As String In File.ListFiles(folder)
        Log("E qua ci sono?")
        If File.IsDirectory(folder, f) Then
            DeleteFolder(File.Combine(folder, f))
        End If
        Try
            File.Delete(folder, f)
        Catch
            Log("Err in " & f)
        End Try
    Next
End Sub
sul Log("qua ci sono") ci sono (scusa il gioco di parole :)) poi più niente...
ho provato anche con una cartella vuota, stesso discorso.

Dove starà l'inghippo, forse centra il fatto che mi trovo nella DirDefaultExternal?
E che mi piace vedere subito nell'emulatore che combino...
 

Sagenut

Expert
Licensed User
Longtime User
Dove starà l'inghippo, forse centra il fatto che mi trovo nella DirDefaultExternal?
E che mi piace vedere subito nell'emulatore che combino...
Usando
B4X:
RP.GetSafeDirDefaultExternal("")
puoi accedere alla cartella se utilizzi un dispositivo/emulatore con versione Android inferiore alla 12.
Troverai i tuoi files in
Android -=> Data -=> PackageName -=> Files
 

Luigi S

Active Member
Licensed User
Usando
B4X:
RP.GetSafeDirDefaultExternal("")
puoi accedere alla cartella se utilizzi un dispositivo/emulatore con versione Android inferiore alla 12.
Troverai i tuoi files in
Android -=> Data -=> PackageName -=> Files
questo già lo faccio con DirDefaultExternal, attraverso l'emulatore v. api31 = android 12
 

LucaMs

Expert
Licensed User
Longtime User
sul Log("qua ci sono") ci sono (scusa il gioco di parole :)) poi più niente...
DeleteFolder ("Cartella_piena_da_cancellare")
L'hai chiamata bene.
Sono stato troppo precipitoso. Sembra che tu l'abbia chiamata bene, ma in realtà non hai scritto la vera istruzione, ci hai dato un segnaposto ("Cartella_piena_da_cancellare).

1683391858815.png


Esce subito dopo quel log o dà errore subito dopo?
Senza sapere questo né il percorso che gli passi, è tosta.
La routine funziona, se la directory che gli passi esiste e se hai i permessi per accedervi.
 

Luigi S

Active Member
Licensed User
ok finalmente ho risolto, usando la sub di Erel:
B4X:
Sub DeleteFolder (folder As String)
    For Each f As String In File.ListFiles(folder)
        If File.IsDirectory(folder, f) Then
            DeleteFolder(File.Combine(folder, f))
        End If
        File.Delete(folder, f)
    Next
End Sub

devo fare la chiamata alla sub cosi:
B4X:
DeleteFolder(File.DirDefaultExternal & "/cartella_piena_da_cancellare/")
ma viene solo svuotata di tutto, devo quindi eliminare la cartella vuota:
B4X:
File.Delete(File.DirDefaultExternal, "/cartella_piena_da_cancellare/")

Grazie a tutti!
 
Last edited:
Top