Spanish Problemas File.Copy con fichero modificado

fran garcar

New Member
Buenas.
Vaya por delante que es mi primer mensaje en estos foros.

A ver si alguien me puede ayudar. El problema que me ocurre es el siguiente.
1. En un proceso, ejecuto File.Copy con un fichero A y lo copia perfectamente en el directorio y con el nombre indicados.
2. Ese mismo fichero A lo edito y lo grabo con el mismo nombre
3. Ejecuto otra vez el File.Copy con ese mismo fichero (ahora modificado) y ya me da el erro siguienter:

javaiofilenotfoundexception ..../files/A.txt open failed EACCES (Permission denied)

Estoy haciendo la actualización de una aplicación a un dispositivo con Android 11 y estoy experimentando problemas que he ido resolviendo pero este que os comento no lo he conseguido
A este problema he llegado de otro inicial que me daba este mismo error al intentar copiar un fichero recibido a través de OneDrive y he ido aislando el problema hasta concluir que algún atributo del fichero recibido a través de OneDrive provoca este error. Cuando he probado a copiar otros ficheros me he dado cuenta de que algunos ficheros que copia perfectamente, en cuanto lo editas y grabas ya da ese mismo error. He supuesto que al grabar le cambiará algún atributo al fichero y a partir de ese momento ya da el error anterior. Pero no sé si eso es cierto o existe alguna otra causa que no acierto a encontrar.

A ver si alguien me puede ayudar.

Saludos
 

josejad

Expert
Licensed User
Longtime User
Hola Fran:

Bienvenido al foro.
La forma más fácil para nosotros de ayudarte, es que pongas tu código (entre etiquetas [code]... tu código ... [/code] o incluso mejor aún, que subas un pequeño proyecto que reproduzca tu error, pero poder probarlo y no tener que estar haciendo suposiciones.

Lo que puedo suponer es que estás teniendo problemas de permisos en el directorio que estás copiando. Android cada vez restringe más los permisos de dónde puedes leer y escribir desde tu aplicación.
Prueba a:
- Buscar tu error en el foro. Siempre debe ser el primer paso, ya que es probable que le haya pasado a alguien
- Leer estos hilos:

saludos,
 
Upvote 0

fran garcar

New Member
Buenas.
Gracias por tu respuesta.
El codigo que da el error es el siguiente:

B4X:
Dim fecha(2) As String
    Dim ff,dato As String

    DateTime.DateFormat = "dd/MM/yyyy"      'or what ever format is required
    
    If LblFec.text.Trim.Length>0 Then
        fecha = Regex.split("/", LblFec.text)
    Else
        fecha = Regex.split("/", DateTime.Date(DateTime.Now))
    End If
    
    ff=fecha(0) & fecha(1) & fecha(2).SubString(2)

    dato= ff & "_" & Main.gUsu & ".txt"
    
    If File.Exists(File.DirDefaultExternal & "/export/", dato) Then
        shared=rp.GetSafeDirDefaultExternal("")
        Dim testfolder As String=rp.GetSafeDirDefaultExternal("export")
                
        rp.CheckAndRequest(rp.PERMISSION_READ_EXTERNAL_STORAGE) 
        Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
        Log($"PERMISSION_WRITE_EXTERNAL_STORAGE = ${Result}"$)
                    
        File.Copy(shared,"configura2.txt",shared,"configura3.txt")
               
    Else
        Msgbox("Error: No existe el fichero de datos: " & File.Combine(File.DirDefaultExternal, "datos.txt") ,"Movilges")
        Return
    End If

El codigo de la linea 25
File.Copy(shared,"configura2.txt",shared,"configura3.txt")
es que causa el error.

java.io.FileNotFoundException: /storage/emulated/0/Android/data/CTO.Movilges/files/configura2.txt: open failed: EACCES (Permission denied)

El error original era al copiar un fichero recibido por Onedrive que es el error que quiero solucionar. En la búsqueda de la solución a este error, he probado la instrucción de copia con un fichero de la instalación llamado Configura.txt

Y lo que he observado es lo siguiente:
1. Copio Configura.txt en Configura2.txt --> Correcto
2. Copio Configura2.txt en Configura3.txt --> Correcto
3. Edito y grabo Configura2.txt con el mismo nombre
4. Error al intentar copiar Configura2.txt en cualquier otro fichero

Es a partir de que lo edito y lo grabo cuando ocurre el error.

Por si os sirve en el Manifest:
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="30"/>
..
AddManifestText(<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />


Por si tiene algo que ver, también os comento que al instalar la aplicación en el dispositivo, no me genera el directorio de la aplicación con el nombre del paquete donde lo hace normalmente. Lo he tenido que generar de forma manual, creando los directorios y subdirectorios. No creo que tenga nada que ver con concreto con el error porque la app funciona bien, aunque da el error que os comento en el post, pero por si tuviera algo que ver.

Saludos
 
Upvote 0

josejad

Expert
Licensed User
Longtime User
Como te comenté, es tema de permisos, lee detenidamente los enlaces que te he puesto.

Mira, de este hilo en el que Erel habla de errores que habría que evitar, el punto 4 dice:
- File.DirDefaultExternal -
Es siempre un error usarlo, en la mayoría de los casos la carpeta correcto debería ser XUI.DefaultFolder (=File.DirInternal). Si necesitas forzosamente usar el almacenamiento externo entonces usa RuntimePermissions.GetSafeDirDefaultExternal.

Otra opción es que dejes que el usuario elija en qué carpeta quiere guardarlo, no requiere permisos

saludos,
 
Upvote 0

Espinosa4

Active Member
Licensed User
Longtime User
Buenos días!

Aprovecho este hilo para hacer una pregunta.
En versiones anteriores a Android 11 yo hacía copias de seguridad en en una carpeta aparte de la del programa que estaba en el raíz. Con Android 11 o superiores no puedo hacer lo mismo. Podría acceder a download, documents o algún sitio similar para poder hacer una copia de la base de datos sin que el usuario intervenga? Cómo?

Un saludo y gracias por adelantado.
 
Upvote 0

josejad

Expert
Licensed User
Longtime User
Hola:

Deberías abrir un hilo nuevo para tu consulta.
No he probado a grabar en carpetas externas (hace ya un tiempecillo que no estoy programando), pero échale un vistazo a este hilo:


Según indica Erel:
RuntimePermissions.GetSafeDirDefaultExternal - Una carpeta en el almacenamiento secundario en la que tu app puede acceder sin permisos.La ruta es un poco extraña, usa el log para ver la que devuelve tu teléfono.
No todas las carpetas son accesibles

Puedes usar la clase ExternalStorage, pero no todas las carpetas son accesibles con esta clase en Android 11+. Concretamente, las carpetas root, Android/data y Download no son accesibles. Más información (en inglés)
Not all folders are accessible with ExternalStorage in Android 11+. Specifically, root, Android/data and Download are not accessible
 
Upvote 0

fran garcar

New Member
Hola de nuevo
Al final lo he solucionado cambiando el directorio donde se ejecuta la aplicación y donde se realizan las acciones y no he tenido mas problemas de permisos.

Sigo con la duda de por qué un fichero lo copia sin problemas la primera vez y ese mismo fichero, una vez editado y grabado, ya provoca el error de permisos. Algún atributo de ese fichero debe cambiar al grabar y es lo que provoca el error supongo.

La otra duda que me queda es donde se instalan ahora las aplicaciones porque no consigo ver la aplicación en el directorio donde siempre lo he visto, es decir: /storage/emulated/0/Android/NombreDePaquete/Files

Sé que está instalada porque se ejecuta correctamente con el acceso directo que genera pero no crea el directorio del paquete donde lo espero y no sé donde la ha instalado. No se si podríais ayudarme en esto también

Saludos y gracias por la ayuda.
 
Upvote 0

Espinosa4

Active Member
Licensed User
Longtime User
Hola:

Deberías abrir un hilo nuevo para tu consulta.
No he probado a grabar en carpetas externas (hace ya un tiempecillo que no estoy programando), pero échale un vistazo a este hilo:


Según indica Erel:
RuntimePermissions.GetSafeDirDefaultExternal - Una carpeta en el almacenamiento secundario en la que tu app puede acceder sin permisos.La ruta es un poco extraña, usa el log para ver la que devuelve tu teléfono.
No todas las carpetas son accesibles

Puedes usar la clase ExternalStorage, pero no todas las carpetas son accesibles con esta clase en Android 11+. Concretamente, las carpetas root, Android/data y Download no son accesibles. Más información (en inglés)
Not all folders are accessible with ExternalStorage in Android 11+. Specifically, root, Android/data and Download are not accessible
Gracias José por la información.
Le pego un vistazo a lo que comentas.

Un saludo.
Gracias
 
Upvote 0

josejad

Expert
Licensed User
Longtime User
Sigo con la duda de por qué un fichero lo copia sin problemas la primera vez y ese mismo fichero, una vez editado y grabado, ya provoca el error de permisos.
Hola, sube un ejemplo que reproduzca el error, será más fácil que alguien lo pruebe y te responda. ¿Cómo copias el fichero la primera vez?
La otra duda que me queda es donde se instalan ahora las aplicaciones porque no consigo ver la aplicación en el directorio donde siempre lo he visto, es decir: /storage/emulated/0/Android/NombreDePaquete/Files
Lee detenidamente también este hilo, que se me pasó ponerte antes.


Ya no es posible acceder con Android 11 a esas carpetas. Si no vas a subir tu app a Google Play, puedes poner targetSdkVersion a 28 y usar Runtime Permissions

 
Upvote 0
Top