Vai al contenuto
PLC Forum


Una "buona" Domanda - Come Scrivere E Leggere Un - file allo stesso tempo con VB6?


Brothers

Messaggi consigliati

Problemi di lock in vb6

Come Scrivere e leggere un file allo stesso tempo

ho una form che mi da le connessioni di rete in tempo reale

con refresh ogni 10 secondi Tipo:

iP adress - local port - remote ip - remote port - State - etc.

insomma un "netstat -ano 10"

il tutto in una ListView Visualizzato a colonne.

Domanda:

Posso far scrivere tutto in un file e leggerlo allo stesso tempo?

e cioè:

Far salvare tutto in un file tipo log.txt senza sovrascriverlo

ma aggiungendo sempre il testo ed eventualmente poi aprirlo

in una altra form con una RichTextBox o altro componente

mentre il file viene scritto .?

Esiste un modo o devo fermare per forza il timer? :(

Spero sia una domanda interessante :blink:

e grazie a tutti anticipate. :)

Link al commento
Condividi su altri siti


Ospite bingobongo

un modo sarebbe:

'

'dimensioni la lunghezza massima della stringa che andrai a scrivere (es. 255 char)

'

DIM XYZ AS STRING * 255

'

'apri il file in modalità random

'

OPEN "C:\MIOFILE" FOR RANDOM SHARED AS # 1 LEN=LEN(XYZ$)

'

'quando ci devi scrivere una nuova stringa

'

ULT=LOF(1)\LEN(XYZ$)

PUT #1,ULT+1,XYZ$

'

'quando vuoi leggere quello che hai scritto e lo metti nella list box

'

LIST1.CLEAR

FOR X=1 TO LOF(1)\LEN(XYZ$)

GET #1,X,XYZ$

LIST1.ADDITEM XYZ$

NEXT

;)

Modificato: da bingobongo
Link al commento
Condividi su altri siti

Ho provato i metodi che mi hanno scritto jumpier e bingobongo

Che ringrazio ma non mi funzionano anche perche non ho capito

Come e dove applicarli.

O forse non mi sono spiegato bene.

Credo che li dovrei Applicare al Timer dove ho collocato il Refresh

Ma è meglio che scriva un po di codice per spiegarmi.

Al Form_Load Applica i primi dati alle colonne

==================================================

' Scrive nelle colonne i dati .

.ColumnHeaders.Add , , "Local IP Address"

'etc.etc Ometto tutti gli altri .ColumnHeaders.Add (Faccio prima) .

' Richiama il Timer per il Refresh .

Call Timer1_Timer

==================================================

Il Timer pulisce le colonne e riapplica i dati ogni 10 secondi

==================================================

Private Sub Timer1_Timer()

' Riapplica alle colonne i dati .

With lvwStats.ListItems

Set ListItem = .Add(, , TCPStat1.TCPTable.LocalIPAddress)

ListItem.SubItems(1) = TCPStat1.TCPTable.LocalPort

'etc.etc Ometto gli altri L.SubItems (almeno 6) .

Select Case TCPStat1.TCPTable.State

Case enMIB_TCP_STATE_CLOSED: tmp = "closed"

'etc.etc Ometto gli altri Select Case che sono tanti (12) .

End Select

ListItem.SubItems = tmp

End With

End Sub

=================================================

(Ho omesso molta ma molta parte del codice se nò veniva lungo un km) .

Penso che il timer dovrebbe scrivere il file ogni 10 secondi ma Come Fare?

Ed il peggio viene dopo quando voglio leggere il file

che è in continua scrittura dal Timer.

Aiuto e Perdonate l'inesperienza. :(

Link al commento
Condividi su altri siti

Ospite bingobongo

questa come dichiarazione in un modulo (se ne hai uno)

GLOBAL XYZ AS STRING * 255

oppure nel form (se ne hai uno solo!)

DIM SHARED XYZ AS STRING * 255

in un qualche punto (probabilmente all'avvio dell'applicazione) avrai l'apertura del file dove scrivi le varie informazioni e quindi il file sarà aperto con:

OPEN "C:\MIOFILE" FOR RANDOM SHARED AS # 1 LEN=LEN(XYZ$)

tutte le volte che acquisisci un'informazione che vuoi salvare nel file

XYZ$=lamiainformazione

PUT #1,(LOF(1)\LEN(XYZ$))+1,XYZ$

quando hai bisogno di visualizare le informazioni acquisite che hai detto metti in una list box (sembra che tu lo faccia a tempo nel qual caso mettile nel timer)

LIST1.CLEAR

FOR X=1 TO LOF(1)\LEN(XYZ$)

GET #1,X,XYZ$

LIST1.ADDITEM XYZ$

NEXT

più di così non penso si possa spiegare :blink:

Modificato: da bingobongo
Link al commento
Condividi su altri siti

Grazie bingobongo sei uno molto paziente ma

Sono io che non mi so spiegare bene

Io ho tutto funzionante e vedo le connessioni attive ogni 10 secondi nella ListView

Ma non so come scriverle nel file di txt (LogConn.txt)

Quello che non capisco è come scrivere in LogConn.txt tutto quello che mi visualizza la ListView ,Cioe:

devo istruire la ListView a scrivere nel file LogConn.txt tutto quello che visualizza??

Oppure devo istruire il Timer a scrivere nel file LogConn.txt tutto Quello che scrive

nella ListView??

e poi posso farlo per tutto il risultato complessivo oppure devo farlo colonna per colonna??.

NB Ho provato come ,"credo" , mi suggerisci tu ma mi da diversi errori

Tieni conto che sono un Molto principiante

(Penso comunque che dovrò risolvere prima il problema della scrittura del file e poi in un secondo tempo affrontare quello della lettura per non confondermi ulteriormente.) :blink:

Link al commento
Condividi su altri siti

Con le istruzioni di jumpier

Open LogConn.txt For Append As #1

Print #1, MyString (Per ogni Stringa un Print )

Close #1

applicate al Timer il file viene scritto , ma non in colonne separate ma tutto in una unica colonna e al posto di "closed" o "listening" o "established" etc.etc.

viene scritto "Vero" o "Falso"

Non è ancora un gran che ma forse si può migliorare!!?? :(:)

Ciao e grazie molte

Modificato: da Brothers
Link al commento
Condividi su altri siti

Risolto Con le istruzioni di jumpier :)

Open LogConn.txt For Append As #1

Print #1, MyString

Close #1

invece di un Print Per ogni Stringa

un Print per una serie di stringhe nella solita riga

e aggiungendo dei print uno con data e ora e uno con ======

e venuto fuori un bel risultato che può accontentare :)

ora il problema sarà leggerlo in contemporanea alla scrittura. :blink:

Link al commento
Condividi su altri siti

RISPOSTA MOLTO LUNGA.

non ricordo dove ho trovato questo codice, comunque devi aggiungere ad una form una listview che trovi sotto ai componeti aggiuntivi "Microsoft Windows Common Controls 6.0" (MSCOMCTL.OCX).

All'apertura della form ti fa vedere tutte le porte di rete di sistema, lo stato in cui sono e l'IP dal quale sono eventualmente occupate.

Copia tutto il codice sottostante all'interno di una form.

Naturalmente puoi temporizzare lo script in modo che venga costantemente aggiornato

CIAO!

Option Explicit

Private Type MIB_TCPROW

dwState As Long

dwLocalAddr As Long

dwLocalPort As Long

dwRemoteAddr As Long

dwRemotePort As Long

End Type

Private Const ERROR_SUCCESS As Long = 0

Private Const MIB_TCP_STATE_CLOSED As Long = 1

Private Const MIB_TCP_STATE_LISTEN As Long = 2

Private Const MIB_TCP_STATE_SYN_SENT As Long = 3

Private Const MIB_TCP_STATE_SYN_RCVD As Long = 4

Private Const MIB_TCP_STATE_ESTAB As Long = 5

Private Const MIB_TCP_STATE_FIN_WAIT1 As Long = 6

Private Const MIB_TCP_STATE_FIN_WAIT2 As Long = 7

Private Const MIB_TCP_STATE_CLOSE_WAIT As Long = 8

Private Const MIB_TCP_STATE_CLOSING As Long = 9

Private Const MIB_TCP_STATE_LAST_ACK As Long = 10

Private Const MIB_TCP_STATE_TIME_WAIT As Long = 11

Private Const MIB_TCP_STATE_DELETE_TCB As Long = 12

Private Declare Function GetTcpTable Lib "iphlpapi.dll" (ByRef pTcpTable As Any, ByRef pdwSize As Long, ByVal bOrder As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dst As Any, src As Any, ByVal bcount As Long)

Private Declare Function lstrcpyA Lib "kernel32" (ByVal RetVal As String, ByVal Ptr As Long) As Long

Private Declare Function lstrlenA Lib "kernel32" (ByVal Ptr As Any) As Long

Private Declare Function inet_ntoa Lib "wsock32.dll" (ByVal addr As Long) As Long

Private Declare Function ntohs Lib "wsock32.dll" (ByVal addr As Long) As Long

Public Function GetInetAddrStr(Address As Long) As String

GetInetAddrStr = GetString(inet_ntoa(Address))

End Function

Private Sub Form_Load()

With ListView1

.View = lvwReport

.ColumnHeaders.Add , , "Local IP Address"

.ColumnHeaders.Add , , "Local Port"

.ColumnHeaders.Add , , "Remote IP Address"

.ColumnHeaders.Add , , "Remote Port"

.ColumnHeaders.Add , , "Status "

End With

Dim TcpRow As MIB_TCPROW

Dim buff() As Byte

Dim lngRequired As Long

Dim lngStrucSize As Long

Dim lngRows As Long

Dim lngCnt As Long

Dim strTmp As String

Dim lstLine As ListItem

Call GetTcpTable(ByVal 0&, lngRequired, 1)

If lngRequired > 0 Then

ReDim buff(0 To lngRequired - 1) As Byte

If GetTcpTable(buff(0), lngRequired, 1) = ERROR_SUCCESS Then

lngStrucSize = LenB(TcpRow)

'first 4 bytes indicate the number of entries

CopyMemory lngRows, buff(0), 4

For lngCnt = 1 To lngRows

'moves past the four bytes obtained above

'to get data and cast into a TcpRow stucture

CopyMemory TcpRow, buff(4 + (lngCnt - 1) * lngStrucSize), lngStrucSize

'sends results to the listview

With TcpRow

Set lstLine = ListView1.ListItems.Add(, , GetInetAddrStr(.dwLocalAddr))

lstLine.SubItems(1) = ntohs(.dwLocalPort)

lstLine.SubItems(2) = GetInetAddrStr(.dwRemoteAddr)

lstLine.SubItems(3) = ntohs(.dwRemotePort)

lstLine.SubItems(4) = (.dwState)

Select Case .dwState

Case MIB_TCP_STATE_CLOSED: strTmp = "closed"

Case MIB_TCP_STATE_LISTEN: strTmp = "listening"

Case MIB_TCP_STATE_SYN_SENT: strTmp = "sent"

Case MIB_TCP_STATE_SYN_RCVD: strTmp = "received"

Case MIB_TCP_STATE_ESTAB: strTmp = "established"

Case MIB_TCP_STATE_FIN_WAIT1: strTmp = "fin wait 1"

Case MIB_TCP_STATE_FIN_WAIT2: strTmp = "fin wait 1"

Case MIB_TCP_STATE_CLOSE_WAIT: strTmp = "close wait"

Case MIB_TCP_STATE_CLOSING: strTmp = "closing"

Case MIB_TCP_STATE_LAST_ACK: strTmp = "last ack"

Case MIB_TCP_STATE_TIME_WAIT: strTmp = "time wait"

Case MIB_TCP_STATE_DELETE_TCB: strTmp = "TCB deleted"

End Select

lstLine.SubItems(4) = lstLine.SubItems(4) & "( " & strTmp & " )"

strTmp = ""

End With

Next

End If

End If

End Sub

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As ColumnHeader)

ListView1.SortKey = ColumnHeader.Index - 1

ListView1.SortOrder = Abs(Not ListView1.SortOrder = 1)

ListView1.Sorted = True

End Sub

Public Function GetString(ByVal lpszA As Long) As String

GetString = String$(lstrlenA(ByVal lpszA), 0)

Call lstrcpyA(ByVal GetString, ByVal lpszA)

End Function

Link al commento
Condividi su altri siti

Ottimo codice , anche perchè usa un ocx già presente nel Vb6

io usavo un altro trovato in giro (mzTCPStat) ma il codice che hai scritto tu mi

sembra migliore , anche se più lungo.

Grazie ciao

Link al commento
Condividi su altri siti

  • 2 weeks later...

Beh l'ocx è opzionale, lo usa solo per visualizzare i dati in quel modo. Nessuno vieta di scriverli all'interno di una listbox e quindi di non aggiunger alcun componente.

Il codice non l'ho scritto io, l'ho trovato da qualche parte, giusto per titolo di cronaca...

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...