- Presentación.
Mediante la librería Dialogs, podemos elegir archivos, colores, día, hora, número...
El tutorial de la librería Dialogs lo encontramos en:
http://www.basic4ppc.com/android/help/dialogs.html
El tutorial de la utilización de archivos y directorios lo encontramos en:
http://www.basic4ppc.com/android/help/files.html
NOTA: Échale un vistazo al final de página donde hay aclaraciones con DirRoorExternal y resumen de trabajo con carpetas y archivos.
_______________________
1.- Librería Dialogs.
Conociendo esta librería podemos elegir la Subrutina que necesitamos: elección de archivo, de colores, de números, de fecha...
____________________________
- Designer. Layout.
Designer - Layout
|
El Botón Get File es que se utilizará para elegir un archivo, los demás botones se utilizan para elegir color, fecha, hora,...
|
Creamos mediante el Designer un layout con 10 Button.
Le llamamos Layout.
A los Button le damos de nombre:
btnDate
btnInput
btnTime
btnColor
btnColor2
btnColor3
btnNumber
btnFile
btnCustom1
btnCustom2
Cargamos la librería: Dialogs
|
____________________________
- Código (copia y pega).
Código del Basic4Android
|
'Activity module
Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.
End Sub
Sub Globals
'These global variables will be redeclared each time the activity is created.
'These variables can only be accessed from this module.
Dim btnDate As Button
Dim btnInput As Button
Dim getTime As Button
Dim Bmp As Bitmap
Dim btnColor As Button
Dim btnColor2 As Button
Dim btnNumber As Button
Dim btnFile As Button
Dim btnCustom As Button
Dim lbl1 As Label
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
Bmp.Initialize(File.DirAssets, "android48.png")
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub btnInput_Click
Dim Id As InputDialog
'Id.PasswordMode = True
'Id.InputType = Id.INPUT_TYPE_DECIMAL_NUMBERS
'Id.InputType = Id.INPUT_TYPE_NUMBERS
'Id.InputType = Id.INPUT_TYPE_PHONE
Id.Input = ""
Id.Hint = "Enter some text!"
Id.HintColor = Colors.ARGB(196, 255, 140, 0)
ret = DialogResponse.CANCEL
ret = Id.Show("Input the required text", "B4A Input Dialog", "Yes", "No", "Maybe", Bmp)
ToastMessageShow(ret & " : " & Id.Input, False)
End Sub
Sub btnDate_Click
Dim Dd As DateDialog
Dd.Year = DateTime.GetYear(DateTime.Now)
Dd.Month = DateTime.GetMonth(DateTime.Now)
Dd.DayOfMonth = DateTime.GetDayOfMonth(DateTime.Now)
ret = Dd.Show("Set the required date", "B4A Date Dialog", "Yes", "No", "Maybe", Bmp)
ToastMessageShow(ret & " : " & Dd.DayOfMonth & "/" & Dd.Month & "/" & Dd.Year , False)
End Sub
Sub btnTime_Click
Dim td As TimeDialog
Dim txt As String
Td.Hour = DateTime.GetHour(DateTime.Now)
Td.Minute = DateTime.GetMinute(DateTime.Now)
Td.Is24Hours = True
ret = Td.Show("Set the required time", "B4A Time Dialog", "Yes", "No", "Maybe", Bmp)
ToastMessageShow(ret & " : " & Td.Hour & ":" & Td.Minute, False)
End Sub
Sub btnColor_Click
Dim cd As ColorDialog
Dim color As Int
cd.RGB = Colors.RGB(128, 128, 128)
ret = cd.Show("B4A Color Dialog", "Yes", "No", "Maybe", Bmp)
ToastMessageShow(ret & " : " & cd.Red & " " & cd.Green & " " & cd.Blue, False)
Activity.Color = cd.RGB
End Sub
Sub btnColor2_Click
Dim cd As ColorPickerDialog
Dim color As Int
cd.RGB = Colors.DarkGray
ret = cd.Show("B4A ColorPicker Dialog", "Yes", "No", "Maybe", Bmp)
ToastMessageShow(ret & " : " & cd.RGB, False)
Activity.Color = cd.RGB
End Sub
Sub btnColor3_Click
Dim cd As ColorDialogHSV
Dim color As Int
cd.Hue = 180
cd.Saturation = 0.5
cd.Value = 0.5
ret = cd.Show("B4A ColorPicker Dialog HSV", "Yes", "No", "Maybe", Bmp)
ToastMessageShow(ret & " : " & cd.RGB, False)
Activity.Color = cd.RGB
End Sub
Sub btnNumber_Click
Dim nd As NumberDialog
nd.Digits = 10
nd.Number = -12345
nd.Decimal = 2
nd.ShowSign = True
ret = nd.Show("B4A Number Dialog", "Yes", "No", "Maybe", Bmp)
ToastMessageShow(ret & " : " & nd.Number, False)
End Sub
Sub btnFile_Click
Dim fd As FileDialog
fd.FastScroll = True
fd.FilePath = File.DirRootExternal ' also sets ChosenName to an emtpy string
'fd.FilePath = File.DirInternal
'fd.ShowOnlyFolders = true
'fd.FileFilter = ".txt" ' for example or ".jpg,.png" for multiple file types
ret = fd.Show("B4A File Dialog", "Yes", "No", "Maybe", Bmp)
ToastMessageShow(ret & " : Path : " & fd.FilePath & CRLF & "File : " & fd.ChosenName, False)
End Sub
Sub btnCustom_Click
Dim cd As CustomDialog
Dim pnl As Panel
pnl.Initialize("pnl")
Dim bgnd As ColorDrawable
bgnd.Initialize(Colors.Green, 5dip)
pnl.Background = bgnd
Dim btn1 As Button
btn1.Initialize("btn1")
btn1.Text = "Press me"
pnl.AddView(btn1, 80dip, 50dip, 60dip, 60dip)
lbl1.Initialize("")
pnl.AddView(lbl1, 50dip, 120dip, 120dip, 60dip)
cd.AddView(pnl, 5%x, 0%y, 77%x, 70%y) ' sizing relative to the screen size is probably best
ret = cd.Show("B4A Custom Dialog", "Yes", "No", "Maybe", Bmp)
End Sub
Sub btnCustom2_Click
Dim cd As CustomDialog2
Dim pnl As Panel
pnl.Initialize("pnl")
Dim bgnd As ColorDrawable
bgnd.Initialize(Colors.Cyan, 5dip)
pnl.Background = bgnd
Dim btn1 As Button
btn1.Initialize("btn1")
btn1.Text = "Press me"
pnl.AddView(btn1, 80dip, 50dip, 60dip, 60dip)
lbl1.Initialize("")
pnl.AddView(lbl1, 50dip, 120dip, 120dip, 60dip)
cd.AddView(pnl, 77%x, 60%y) ' sizing relative to the screen size is probably best
ret = cd.Show("B4A Custom Dialog", "Yes", "No", "Maybe", Bmp)
End Sub
Sub btn1_Click
lbl1.Text = "Pressed!"
lbl1.Color = Colors.Black
ToastMessageShow("Pressed!", False)
End Sub
|
_______________________
2.- Elegir directorio y archivo.
Basado en el código anterior vamos a crear un programa para elegir un directorio y un archivo.
____________________________
- Designer. Layout.
- Habilitamos la librería Dialogs, como lo hicimos en el proyecto anterior.
- Creamos un Botón y dos Label mediante código.
- El directorio File.DirRootExternal es la tarjeta de memoria SD Card
- La tarjeta está "montada" en /mnt/sdcard
- Si desde el principio quisieramos posicionarnos en el directorio Android que está en la tarjeta, deberíamos poner:
fd.FilePath = File.Combine(File.DirRootExternal, "/Android/")
- Si quisieramos obtener la dirección absoluta pondríamos:
Label1.Text = "Todo = " & fd.FilePath & "/" & fd.ChosenName
NOTA: si no funciona con el DirRootExternal, cámbialo por el DirAssets. |
|
____________________________
- Código (copia y pega).
Código del Basic4Android
|
' Juan Antonio Villalpando
' juana1991@yahoo.com
Sub Process_Globals
End Sub
Sub Globals
Dim boton As Button
Dim Label1, Label2 As Label
End Sub
Sub Activity_Create(FirstTime As Boolean)
' Crea Botón
boton.Initialize("boton")
Activity.AddView(boton, 5, 50, 260, 55) ' Posicion, ancho y alto
boton.Text = "Pulsa para elegir archivos"
' Crea etiqueta Ruta
Label1.Initialize("Label1")
Label1.TextColor = Colors.Red
Label1.Text = "Ruta = "
Activity.AddView(Label1, 5, 150, 400, 90) ' Posicion, ancho y alto
' Crea etiqueta Archivo
Label2.Initialize("Label2")
Label2.TextColor = Colors.Red
Label2.Text = "Archivo = "
Activity.AddView(Label2, 5, 250, 400, 30) ' Posicion, ancho y alto
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub boton_Click
Dim fd As FileDialog
fd.FastScroll = True
fd.FilePath = File.DirRootExternal ' Para ir a la raiz del SD Card
' fd.FilePath = File.Combine(File.DirRootExternal, "/Android/") ' Para ir a esa carpeta del SD Card
' fd.FileFilter = ".pdf" ' Para filtrar pdf
ret = fd.Show("Elige archivo", "Sí", "No", "Tal vez", Null)
Label1.Text = "Ruta = " & fd.FilePath
Label2.Text = "Archivo = " & fd.ChosenName
End Sub
|
_______________________
3.- Elegir archivos
(no hace falta librería Dialogs)
Mediante el siguiente código podemos ver un listado de archivos que se encuentran en /mnt/sdcard, este directorio se refiere a la tarjeta de memoria SD, que en el código se llama mediante DirRootExternal.
Para realizar este proyecto vamos al Designer y ubicamos: Label1, y un ListView1.
Luego guardamos el Designer llamándolo Layout.
Con este código no es necesario añadir ninguna librería.
- Mediante estas líneas podemos ver a la ruta de cada Directorio
' Msgbox(File.DirRootExternal, "")
' Msgbox(File.DirAssets, "")
' Msgbox(File.DirInternal, "")
' Msgbox(File.DirDefaultExternal, "")
|
|
Código del Basic4Android
|
Sub Process_Globals
' Juan Antonio Villalpando
' juana1991@yahoo.com
End Sub
Sub Globals
Dim ListView1 As ListView
Dim Label1 As Label
Dim ruta, archivo As String
Dim Listado As List
End Sub
Sub Activity_Create(FirstTime As Boolean)
Listado.Initialize
Activity.LoadLayout("Layout")
' Habilita las siguientes líneas para ver la ruta de los distintos directorios
' Msgbox(File.DirRootExternal, "")
' Msgbox(File.DirAssets, "")
' Msgbox(File.DirInternal, "")
' Msgbox(File.DirDefaultExternal, "")
ListFolderContent("/")
' ListFolderContent(File.DirRootExternal)
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub ListFolderContent(folder As String) As String
ruta = folder
Listado.Initialize
Listado = File.ListFiles(ruta)
Listado.Sort(True)
ListView1.Clear
ListView1.AddSingleLine("..") ' Directorio superior
For n = 0 To Listado.Size-1
archivo = Listado.Get(n)
If File.IsDirectory(ruta, archivo)=True Then
ListView1.AddTwoLines2(archivo, "DIR", archivo)
Else
ListView1.AddSingleLine(archivo)
End If
Next
End Sub
Sub ListView1_ItemClick (Position As Int, Value As String)
Try
Activity.Title = File.Combine(ruta & "/", Value)
Label1.Text = File.Combine(ruta & "/", Value)
If Value = ".." Then
' Elimina el último directorio de la ruta
' /mnt/sdcard/Android/data --->>> /mnt/sdcard/Android
ruta = ruta.SubString2(0, ruta.LastIndexOf("/"))
If ruta ="" Then ruta ="/"
ListFolderContent(ruta)
Value = ""
Activity.Title = File.Combine(ruta & "/", Value)
Label1.Text = File.Combine(ruta & "/", Value)
Else
If File.IsDirectory (ruta, Value) Then
ListFolderContent(File.Combine(ruta & "/", Value))
End If
End If
Catch
Msgbox("Error al entrar en el directorio","error")
Value=""
ListFolderContent("/")
End Try
End Sub
|
_______________________
4.- Otro programa: Elegir archivos
(no hace falta librería Dialogs)
Mediante el siguiente código podemos ver un listado de archivos que se encuentran en /mnt/sdcard, este directorio se refiere a la tarjeta de memoria SD, que en el código se llama mediante DirRootExternal.
Para realizar este proyecto vamos al Designer y ubicamos: Label1, Label2 y un ScrollView1.
Luego guardamos el Designer llamándolo Layout.
Con este código no es necesario añadir ninguna librería. |
|
Código del Basic4Android
|
' Juan Antonio Villalpando
' juana1991@yahoo.com
Sub Process_Globals
End Sub
Sub Globals
Dim label2 As Label
Dim ScrollView1 As ScrollView
Dim Send As Label
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
Dim files As List
files = File.ListFiles(File.DirRootExternal) 'Toma todos los archivos de la raíz SD Card
ScrollView1.Panel.Height = 20dip * files.Size
For i = 0 To files.Size - 1
Dim Label1 As Label
Label1.Initialize("Label1")
Label1.Text = files.Get(i)
Label1.Tag=files.Get(i)
ScrollView1.Panel.AddView(Label1, 25dip, 1dip + i * 20dip, ScrollView1.Width, 18dip)
Next
End Sub
Sub Label1_Click
Send=Sender
Label2.Text = File.DirRootExternal & "/" & Send.Tag
End Sub
|
_______________________
5.- Ejemplos con archivos. Guardar, Leer y Escribir.
(no hace falta librería Dialogs)
NOTA: si tienes problemas al escribir en la SdCard (DirRootExternal), añade estas líneas en el AndroidManifest.xml
(Project / Manifest Editor)
AddPermission ("android.permission.WRITE_EXTERNAL_STORAGE")
AddPermission ("android.permission.READ_EXTERNAL_STORAGE")
____________________________________________________
En el tutorial del foro se explica las distintas posibilidades que tiene la lectura, escritura, borrado... de archivo:
http://www.basic4ppc.com/android/help/files.html
En los foros de Basic4Android en inglés explican y exponen el siguiente código como ejemplo de trabajo con archivos...
Foros de Basic4Android:
http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/6690-text-files.html
Código del Basic4Android
|
Sub Process_Globals
End Sub
Sub Globals
End Sub
Sub Activity_Create(FirstTime As Boolean)
If File.ExternalWritable = False Then
Msgbox("Cannot write on storage card.", "")
Return
End If
SaveStringExample
ReadStringExample
WriteListExample
ReadListExample
WriteMapExample
ReadMapExample
WriteTextWriter
ReadTextReader
End Sub
Sub SaveStringExample
File.WriteString(File.DirRootExternal, "String.txt", _
"This is some string" & CRLF & "and this is another one.")
End Sub
Sub ReadStringExample
Msgbox(File.ReadString(File.DirRootExternal, "String.txt"), "")
End Sub
Sub WriteListExample
Dim List1 As List
List1.Initialize
For i = 1 To 100
List1.Add(i)
Next
File.WriteList(File.DirRootExternal, "List.txt", List1)
End Sub
Sub ReadListExample
Dim List1 As List
'We are not initializing the list because it just holds the list that returns from File.ReadList
List1 = File.ReadList(File.DirRootExternal, "List.txt")
Msgbox("List1.Size = " & List1.Size & CRLF & "The third item is: " & List1.Get(2), "")
End Sub
Sub WriteMapExample
Dim Map1 As Map
Map1.Initialize
For i = 1 To 10
Map1.Put("Key" & i, "Value" & i)
Next
File.WriteMap(File.DirRootExternal, "Map.txt", Map1)
End Sub
Sub ReadMapExample
Dim Map1 As Map
'Again we are not initializing the map.
Map1 = File.ReadMap(File.DirRootExternal, "Map.txt")
'Append all entries to a string builder
Dim sb As StringBuilder
sb.Initialize
sb.Append("The map entries are:").Append(CRLF)
For i = 0 To Map1.Size - 1
sb.Append("Key = ").Append(Map1.GetKeyAt(i)).Append(", Value = ")
sb.Append(Map1.GetValueAt(i)).Append(CRLF)
Next
Msgbox(sb.ToString,"")
End Sub
Sub WriteTextWriter
Dim TextWriter1 As TextWriter
TextWriter1.Initialize(File.OpenOutput(File.DirRootExternal, "Text.txt", False))
For i = 1 To 10
TextWriter1.WriteLine("Line" & i)
Next
TextWriter1.Close
End Sub
Sub ReadTextReader
Dim TextReader1 As TextReader
TextReader1.Initialize(File.OpenInput(File.DirRootExternal, "Text.txt"))
Dim line As String
line = TextReader1.ReadLine
Do While line <> Null
Log(line) 'write the line to LogCat
line = TextReader1.ReadLine
Loop
TextReader1.Close
End Sub
|
TextWriter1.Initialize(File.OpenOutput(File.DirRootExternal, "Text.txt", False))
Importante, según la línea anterior acabe en False o True, se añadirá o no un renglón.
Es decir, si ponemos True, lo que escribamos se añadirá al archivo.
Si ponemoa False, solo contendrá la última línea escrita.
_______________________
6.- Aquí tenemos otro código más simple de escritura y lectura de archivo.
(no hace falta librería Dialogs)
El Activity consta de un Layout y dentro de él, un EditText1, un Label1 y dos Botones.
A la SD Card podemos acceder mediante LINUX entrando en el directorio: /mnt/sdcard
Escribe y lee un archivo de la SD Card
|
'Activity module
Sub Process_Globals
End Sub
Sub Globals
Dim pfilename As String
pfilename = "ejemplo.txt"
Dim EditText1 As EditText
Dim Label1 As Label
Dim linea As String
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Button1_Click
Dim mFilePath As String
linea = EditText1.Text
If File.ExternalWritable = True Then
'SD Card Installed
mFilePath = File.DirRootExternal
Else
'No SD Card
mFilePath = File.DirInternal
End If
Dim tw As TextWriter
tw.Initialize(File.OpenOutput(mFilePath, pfilename, True))
tw.WriteLine(linea)
' tw.Write(linea)
tw.Close
End Sub
Sub Button2_Click
Dim mFilePath As String
If File.ExternalWritable = True Then
' Hay tarjeta SD Card Instalada
mFilePath = File.DirRootExternal
Else
'No hay tarjeta SD Card
mFilePath = File.DirInternal
End If
If File.Exists(mFilePath, pfilename) = True Then
Dim tr As TextReader
tr.Initialize(File.OpenInput(mFilePath, pfilename))
Label1.Text = tr.ReadLine
'Label1.Text = ReadList(mFilePath, pfilename)
Label1.Text = File.ReadString(mFilePath, pfilename)
' Label1.Text = tr.ReadAll
tr.Close
End If
End Sub
|
_______________________ 7.- Otro código de escritura y lectura de archivo.
Guardar información en distintos :campos: de una línea.
(no hace falta librería Dialogs)
|
Creamos un Layout, lo llamamos Layout.
Insertamos:
Label1.... Nombre
Label2.... Edad
Label3.... Ciudad
EditText1
EditText2
EditText3
Button1
Button2 |
En este caso escribimos tres datos: nombre, edad y ciudad y lo guardamos en el archivo fichero.txt
Los datos se agrupan en una línea separada por un separador de campo, en este caso ":"
Juan:23:Grazalema
Si tenemos tarjeta de memoria SD Card, se guardará alli, si no la tenemos se guardará en el directorio interno.
Escribimos la línea con este código:
escribir.Initialize(File.OpenOutput(directorio, archivo, False))
escribir.WriteLine(linea)
Si en vez poner False, ponemos True, las distintas líneas que escribamos se añadirán al final de la última.
En este código particular no vemos el efecto de añadir, solo se muestra una línea.
El botón de lectura de código contiene esta línea de lectura:
leer.Initialize(File.OpenInput(directorio, archivo))
linea = leer.ReadLine
Lee una línea, la línea obtenida es de la forma
Juan:23:Grazalema
Mediante las funciones de cadenas, se van obteniendo los distintos campos.
Esta función encuentra la primera aparición del carácter ":" y nos devuelve su posición, en este caso está en el lugar 4
linea.IndexOf2(":",0) ' 4
Esta función toma los caracteres desde el 0 hasta el finalnombre
nombre = linea.SubString2(0, finalnombre) ' Juan
Esta función muestra la longitud de la cadena.
finallinea = linea.Length ' 16
Nota: una vez más este código se podría realizar con otros algoritmos: Listas, Maps, tablas... pero he querido presentar la opciones de cadenas.
Este código nos puede servir para guardar las variables en un archivo, para que en el caso que el programa se apague o vaya a segundo plano, se guarden las variables, la parte de guardar de este código lo tendríamos que poner en Activity_Pause.
Escribe y lee datos en un archivo
|
' Juan Antonio Villalpando
' juana1991@yahoo.com
Sub Process_Globals
End Sub
Sub Globals
Dim archivo As String
archivo = "fichero.txt"
Dim EditText1, EditTExt2, EditText3 As EditText
Dim Label1, Label2, Label3 As Label
Dim linea As String
Dim nombre, edad, ciudad As String
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Button1_Click
nombre = EditText1.Text
edad = EditText2.Text
ciudad = EditText3.Text
' Voy a unirlo todo en una línea con un separador de campo :
' Juan:23:Grazalema
linea = nombre & ":" & edad & ":" & ciudad
Dim directorio As String
If File.ExternalWritable = True Then
' Si hay SD Card lo guarda en ella
directorio = File.DirRootExternal
Else
' Si no hay SD Card lo guarda en directorio interno
directorio = File.DirInternal
End If
Dim escribir As TextWriter
' Sobreescribe línea
escribir.Initialize(File.OpenOutput(directorio, archivo, False))
escribir.WriteLine(linea)
escribir.Close
EditText1.Text = ""
EditText2.Text = ""
EditText3.Text = ""
End Sub
Sub Button2_Click
Dim directorio As String
If File.ExternalWritable = True Then
' Si hay SD Card lo leerá de ella
directorio = File.DirRootExternal
Else
' Si no hay SD Card lo leerá del directorio interno
directorio = File.DirInternal
End If
If File.Exists(directorio, archivo) = True Then
Dim leer As TextReader
' Lee Línea
leer.Initialize(File.OpenInput(directorio, archivo))
linea = leer.ReadLine
' linea = Juan:23:Grazalema
finalnombre = linea.IndexOf2(":",0) ' 4
nombre = linea.SubString2(0, finalnombre) ' Juan
EditText1.Text= nombre
finaledad = linea.IndexOf2(":", finalnombre+1) ' 8
edad = linea.SubString2(finalnombre+1, finaledad) ' 23
EditText2.Text = edad
finallinea = linea.Length ' 16
ciudad = linea.SubString2(finaledad+1, finallinea) ' Grazalema
EditText3.Text = ciudad
leer.Close
End If
End Sub
|
NOTA: Para cortar (Split) una cadena en trozos según un separador de campo, se puede utilizar la instrucción:
Dim data As String
data = " 123,432,13,4,12,534 "
Dim numbers() As String
numbers = Regex.Split( "," , data)
Dim l As List
l.Initialize2(numbers)
Log (l)
Ver en el tutorial oficial.
_______________________
8.- Obtener un listado de los archivos que se encuentren en la SD Card
Consultamos el archivo TweetRecursive de este tutorial:
http://www.basic4ppc.com/forum/basic4android-updates-questions/12285-recursive-method-traversing-sdcard.html#post68941
Hay que tener en cuenta que según la marca del móvil o tablet, la SD Card estará "montada" en un directorio u otro.
Ver en foros.
En LINUX hay un archivo importante, llamado fstab, en donde están indicados los dispositivos montados y la forma en que se pueden montar.
En Android ese archivo se llama vold.fstab y está en el directorio /system/etc
_______________________
9.- Ver un listado de los archivos que están en la carpeta File.
(no hace falta librería Dialogs)
Dentro de cada carpeta de programa hay una subcarpeta llamada File, en ella suele estar el layout.bal, imagenes, sonidos...
Los archivos de esta carpeta son estáticos, es decir, los podemos introducir mientras realizamos el programa, pero cuando el programa está en funcionamiento no podemos crear ni manipular archivos en esa carpeta, es un directorio de solo lectura.
El directorio File, se representa en el código mediante: File.DirAssets
Para ver un listado de los archivos existentes en la carpeta Files mediante código podemos hacerlo así...
Dim Lista As List
Dim i As Int
Lista.Initialize
Lista.AddAll(File.ListFiles(File.DirAssets))
Msgbox("Archivos = " & Lista.Size, "")
For i = 0 To Lista.Size - 1
Msgbox(Lista.Get(i), "")
Next
_______________________
10.- Otra manera de ver un listado de archivos que están en la carpeta Files.
(no hace falta librería Dialogs)
En este caso hace un listado de los archivos que extensión .txt que existen en esa carpeta.
|
' https://www.b4x.com/android/forum/threads/path-assetsdir-does-not-exist.20718/
'Read available files
Dim AllFiles As List
AllFiles.Initialize
AllFiles.AddAll(File.ListFiles(File.DirAssets))
Dim myDropDown As Spinner
myDropDown.Initialize("myDropDown")
Dim text As String
For I = 0 To AllFiles.Size -1
text = AllFiles.Get(I)
If text.IndexOf(".txt") > - 1 Then
myDropDown.Add(text)
End If
Next
'Let the user select a file
Dim cd As CustomDialog
cd.AddView(myDropDown, 0, 0, 300, 40)
cd.Show("DropDown Title", "OK", "Cancel", "", Null)
text = myDropDown.SelectedItem
End Sub
|
En vez de poner la carpeta Files (File.DirAssets) se puede poner cualquier otra carpeta.
_______________________
11.- Ver el árbol de directorios.
También es interesante estudiar este ejemplo del foro. Se trata de mostrar los directorios y archivos, en este caso de la SdCard, en forma de árbol de directorios.
Se nos presenta los directorios y archivos, y pulsando en un directorio podemos ver la información que contiene, es un explorador de archivos.
Se encuentra en este foro y la podemos bajar en Treeview.zip
En el código podemos ver la línea:
tv.rootnode.tag = File.DirRootExternal ' example for directory treeview
en donde pondremos la raíz desde donde queremos ver los ficheros.
_______________________
12.- Resumen de trabajo con carpetas y archivos. IMPORTANTE.
(no hace falta dialogs)
- Creamos con el Designer un Layout, lo llamamos "Layout" con estos botones:
Para permitir que se pueda leer y escribir en elementos externos debemos añadir estas líneas en el Manifest Editor
AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)
AddPermission(android.permission.READ_EXTERNAL_STORAGE )
Trabajo con carpeta y archivo.
|
Sub Process_Globals
' Juan Antonio Villalpando
' juana1991@yahoo.com
' Enero 2015
End Sub
Sub Globals
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Button1_Click
If File.ExternalWritable = False Then
Msgbox("La SdCard no tiene permiso de escritura.", "")
Else
Msgbox("La SdCard sí tiene permiso de escritura.", "")
End If
If File.ExternalReadable = False Then
Msgbox("La SdCard no tiene permiso de lectura.", "")
Else
Msgbox("La SdCard sí tiene permiso de lectura.", "")
End If
End Sub
' Crea una carpeta
Sub Button2_Click
If File.Exists(File.DirRootExternal, "MiCarpeta" ) = False Then '
File.MakeDir(File.DirRootExternal, "MiCarpeta")
Msgbox("Se ha creado MiCarpeta.", "")
Else
Msgbox("MiCarpeta ya existía.", "")
End If
End Sub
' Borra una carpeta
Sub Button3_Click
If File.Exists(File.DirRootExternal, "MiCarpeta" ) = False Then '
Msgbox("MiCarpeta no existía.", "")
Else
File.Delete(File.DirRootExternal,"MiCarpeta")
Msgbox("Acaba de ser borrada MiCarpeta.", "")
End If
End Sub
' Crea un archivo de texto
Sub Button4_Click
If File.Exists(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt" ) = False Then '
File.WriteString(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt","")
Msgbox("Se ha creado MiArchivo.", "")
Else
Msgbox("MiArchivo ya existía.", "")
End If
End Sub
' Borra un archivo
Sub Button5_Click
If File.Exists(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt" ) = False Then '
Msgbox("MiArchivo.txt no existía.", "")
Else
File.Delete(File.DirRootExternal,"/MiCarpeta/MiArchivo.txt")
Msgbox("Acaba de ser borrado MiArchivo.txt.", "")
End If
End Sub
' Escribir hola en un archivo mediante WriteString
' (Se puede crear un archivo y a la vez escribirle algo)
' Con esta forma de WriteString solo podemos escribir una vez cuando creamos el archivo nuevo.
' Si escribimos otra vez se borrará lo anterior.
' Por eso cuando escribes varias veces solo se ve la última línea.
' Se pueden escribir varias líneas mediante una List
Sub Button6_Click
If File.Exists(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt" ) = False Then '
Msgbox("MiArchivo.txt no existía. No se puede ESCRIBIR. Crealo antes", "")
Else
File.WriteString(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt","hola")
Msgbox("Ya he escrito la palabra: 'hola'", "")
End If
End Sub
' Leer el contenido de un archivo.
Sub Button7_Click
If File.Exists(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt" ) = False Then '
Msgbox("MiArchivo.txt no existía. No se puede LEER. Crealo antes", "")
Else
Msgbox(File.ReadString(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt"), "")
End If
End Sub
' Escribir adios en un archivo mediante TextWriter
' Con TextWriter se pueden escribir varios renglones con facilidad.
' Luego podemos leerlo con el ReadString (Button7) visto anteriormente
Sub Button8_Click
If File.Exists(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt" ) = False Then
Msgbox("MiArchivo.txt no existía. No se puede ESCRIBIR. Crealo antes", "")
Else
Dim TextWriter1 As TextWriter
TextWriter1.Initialize(File.OpenOutput(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt", True)) ' Si ponemos False al final de la línea anterior, solo escribe una línea
TextWriter1.WriteLine("adios")
TextWriter1.Close
Msgbox("Ya he escrito la palabra: 'adios'", "")
End If
End Sub
' Otra forma de leerlo es mediante TextReader
' Dim TextReader1 As TextReader
' TextReader1.Initialize(File.OpenInput(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt"))
' Dim linea As String
' linea = TextReader1.ReadLine
' Do While linea <> Null
' Log(linea)
' linea = TextReader1.ReadLine
' Loop
' TextReader1.Close
|
_______________________
_______________________
- Recordamos tres lugares de directorios.
Ejecuta esta órdenes para comprobar la ruta de cada directorio
Msgbox(File.DirRootExternal, "")
Msgbox(File.DirAssets, "")
Msgbox(File.DirInternal, "")
Msgbox(File.DirDefaultExternal, "")
DirAssets es el directorio del programa C:\Android\<Programa>\Files
es un directorio de solo lectura durante la ejecución del programa, por lo tanto no podemos (desde el programa), cambiar nada en él.
Carpeta Files, de solo lectura durante la ejecución del programa.
DirRootExternal es un directorio en la tarjeta de memoria SD de nuestro móvil. Si tenemos un directorio que se llama Fotos, podemos ir a ese directorio de esta manera...
out = File.OpenOutput(File.DirRootExternal & "/" & "Fotos", "foto2.jpg", True)
ATENCIÓN, consulta al final de esta página una aclaración importante sobre DirRootExternal, no es la tarjetita que insertamos a nuestro móvil.
- Podemos llegar a la SD Card, entrando en... /mnt/sdcard
Esto lo debemos hacer desde el shell de LINUX como vimos en un tutorial anterior.
La manera de llegar a ese directorio es yendo a linux y pasando a la carpeta
cd /mnt/sdcard
ls
DirInternal es un directorio existente en nuestro Programa y que solo podemos acceder mediante ese Programa.
Para ver el listado de archivos en ese directorio, lo debemos hacer mediante el shell del LINUX, esto lo he comentado anteriormente y se explica con más detalle en el tutorial LINUX. Este directorio se encuentra en una subcarpeta de nuestro Programa, pero no podemos verlo mediante el Explorador de Windows.
out = File.OpenOutput(File.DirInternal & "/" , "logo2.png", True)
La manera de llegar a ese directorio es yendo a linux y pasando a la carpeta
cd /data/data/<tu.programa>/files
ls
DirInternal visto con Dalvik Debug Monitor.
/data/data/com.variasmarcas/files
- Copiar un archivo desde la carpeta Files a la DirInternal
File.Copy(File.DirAssets,"web4.htm", File.DirInternal,"web4.htm")
DirDefaultExternal es el directorio por defecto de la aplicación en el móvil. Puede acceder a él cualquier aplicación mediante la ruta [external device]/Android/data/[package name]/files/
Por ejemplo: /mnt/sdcard/Android/data/tu.programa/files/
La manera de llegar a ese directorio es yendo a linux y pasando a la carpeta
cd /mnt/sdcard/Android/data/tu.programa/files
ls
DirDefaultExternal visto con Dalvik Debug Monitor.
/mnt/sdcard/Android/data/com.variasmarcas/files
- Copiar un archivo desde la carpeta Files a la DirDefaultExternal
File.Copy(File.DirAssets,"web4.htm", File.DirDefaultExternal,"web4.htm")
_________________________________________
- Aclaraciones sobre DirRoorExternal.
Hay dudas acerla de DirRootExternal, no es la tarjetita de memoria que insertamos en el móvil o tablet, esto se refiere a una memoria del dispositivo interno. Para llegar a la tarjetita externa de memoria que insertamos, debemos saber su dirección, de la forma /mnt/sdcard, esto no es tan fácil de saber ya que cada dispositivo según su marca y modelo la monta en un sitio distinto.
Debemos investigar dónde en qué dirección está nuestra tarjetita de memoria.
_________________________________________
- En los foros leemos:
DirRootExternal No es tu SdCard Externa (no es la tarjetita que tienes insertada), es la SdCard interna.
Los Dispositivos tienen al menos dos almacenamientos estándar, el interno y el externo. Si el dispositivo también tiene una SdCard esta será la tercera SdCard Externa.
Es decir, el directorio DirRootExternal no es nuestra tarjeta de memoria SdCard, es una memoria interna del dispositivo.
Si queremos ir a nuestra tarjeta debemos consultar el archivo vold.fstab para ver dónde está montada y luego llamarla escribiendo su dirección, por ejemplo: /mnt/sdcard
Más adelante dice que el acceso a la tarjeta externa SdCard es limitado a partir de la versión 4.4 de Android
Se puede obtener la dirección de la tarjeta SdCard externa mediante su dirección de absoluta de LINUX
en este mensaje lo indican.
Por ejemplo podría ser
/mnt/sdcard/ext-sd
/storage/sdcard0
/mnt/sdcard/exStorages/SdCard
/mnt/sdcard/sdcard1
/sdcard 1
/mnt/sdcard/external_sd
/mnt/sdcard
/Removable/MicroSD
Pero... Se podría ver dónde está montada desde del archivo vold.fstab, pero desde la versión 4.3 este archivo ya no está presente ha sido sustituido por fstab.xxx y para leerlo es necesario permiso de root.
http://stackoverflow.com/questions/19272852/vold-fstab-file-in-android-4-3
Así que si quieres entrar en tu tarjeta SdCard, primero debes saber dónde está montada, algo así... /mnt/sdcard (dependiendo de la marca y modelo del móvil será una dirección distinta)
Una vez que sepa dónde está la tarjeta ya puedes trabajar con ella de la forma...
If File .Exists( "" , "/mnt/sdcard/MiCarpeta/MiArchivo.txt" ) Then