Italian RandomAccessFile

Spectre

Active Member
Licensed User
Longtime User
Salve....
C'è un modo di "appendere" dei dati in un file usando RandomAccessFile?
O meglio, è possibile aprire il file (esistente ) e scriverci alla fine un valore o altro senza per forza doverlo leggere tutto nel programma e poi inserire il valore?
 

LucaMs

Expert
Licensed User
Longtime User
Posso anticipare che ricordo i file ad accesso casuale dalle prime versioni del Basic (MS), questi non li ho usati, ma immagino funzionino allo stesso modo, ovvero l'accesso ad un record dovrebbe essere diretto, senza la necessità di leggere tutto il file (gli dò un'occhiatina e ti rispondo meglio ;))

Altrimenti, puoi usare:
File.OpenOutput(Dir As String, FileName As String, Append As Boolean)

Impostando Append a True, aggiungi testo.
 

LucaMs

Expert
Licensed User
Longtime User
Sì, infatti funziona più o meno come i file random dei vecchi vb.

Ad esempio, con:
WriteDouble (Value AsDouble, Position AsLong)
scrivi un valore Double nella posizione che passi, ovunque essa sia all'interno del file.

Puoi guardare qui, Wiki
 

Spectre

Active Member
Licensed User
Longtime User
Chiaro... sto facendo delle prove la prima scrittura va bene, pero poi quanto tento di aprire il file per "appendere" dei valori mi dice che non posso scrivere. credo che dipenda dal fatto che uso questo parametro:

B4X:
 raf.Initialize(LogTrackDirToSave,LogTrackTxtToSave, False)

Però in fase di creazione non credo si possa settare a true...


B4X:
Dim raf As RandomAccessFile

    If File.Exists(LogTrackDirToSave,LogTrackTxtToSave)=False  Then
   
        raf.Initialize(LogTrackDirToSave,LogTrackTxtToSave, False)
    Else
        raf.Initialize(LogTrackDirToSave,LogTrackTxtToSave, true)
    End If 

      Dim row(4) As String
   
    row(0) = Npoint
    row(1) = DateTime.Date(DateTime.now) & "-" & DateTime.time(DateTime.Now)
    row(2) = Round2(PointLAT,6)
    row(3) = Round2(PointLON,6)   
 
    raf.WriteObject(row, False, raf.CurrentPosition)
    raf.Close
 

LucaMs

Expert
Licensed User
Longtime User
come ti ho scritto, non ho usato quella libreria.

La studio insieme a te :)

Si, il terzo parametro dell'inizializzazione è giustissimo, non puoi settarlo a readonly.

Suppongo (non ho provato) che il CurrentPosition venga sì aggiornato automaticamente, ma il primo record?

Evidentemente CurrentPosition non è readonly e dovresti impostarlo tu a 0 (oppure a 1?), per il primo record.

Però: tu controlli se il file esiste e se non è così, lo crei con False... se invece esiste, lo apri con True, cioè a sola lettura?
 

Spectre

Active Member
Licensed User
Longtime User
Ciao... se tenti di creare il file con attributo "True" ti da un errore, quindi per forza sei costretto a crearlo come false...
Sto provando e leggendo wiki... ma non capisco bene... CurrentPosition è come dici tu...
 

LucaMs

Expert
Licensed User
Longtime User
Credo che probabilmente quando usi Initialize il file venga creato automaticamente, se non esiste.

Quindi, prova ad usare semplicemente:

raf.Initialize(LogTrackDirToSave,LogTrackTxtToSave, False)

e poi scrivi il primo record, senza nemmeno impostare la CurrentPosition
(prima del Close, usa un Flush, per sicurezza, semmai rimanesse un buffer con dei dati)
 

Spectre

Active Member
Licensed User
Longtime User
Provo ... ma mia sa che.... vediamo se Erel ci legge... ahahaho_O
 

Spectre

Active Member
Licensed User
Longtime User
azz... se era vb.net... avevo già finito.... ahhaha
Mi da sempre errore o in creazione, file non esiste (parametro true) o in scrittura, che non posso scrivere...
PS non puoi non usare "current position".

se non risolvo cosi scriverò un csv e poi ogni x minuti lo carico in una list e lo riscrivo.
In gergo automazione industriale "faccio una porchetta"...

ho paura però che per log molto lunghi la memoria inizierà a scarseggiare...
Si parla di loggare delle posizioni gps ogni 10 sec magari per una giornata intera.
 
Last edited:

Spectre

Active Member
Licensed User
Longtime User
Ciao alla fine ho fatto cosi... perché sto random ma rotto...
Credo di poter togliere anche il file Exists...
Con il true predispongo il file per "appendere" alla fine le linee...
Certo il random aveva il "compressed" ma per ora faccio cosi.

B4X:
Sub SaveTableToCSVArray(Npoint As Long, PointLAT As Double , PointLON As Double)
Dim tw As TextWriter

    If File.Exists(LogTrackDirToSave, "/" & LogTrackTxtToSave)=False  Then
        tw.Initialize(File.OpenOutput(LogTrackDirToSave,"/" & LogTrackTxtToSave, True))  
    Else
        tw.Initialize(File.OpenOutput(LogTrackDirToSave,"/" & LogTrackTxtToSave, True))
    End If
    
    tw.WriteLine(Npoint & ";" &  DateTime.Date(DateTime.now) & ";" & DateTime.time(DateTime.Now) & ";" & Round2(PointLAT,7) & ";" & Round2(PointLON,7))
    tw.Close

End Sub
 
Top