webForumDet fria alternativet

Läsa in en txt fil från nätet

.NET

18 svar · 402 visningar · startad av medialabs

Medlem sedan mars 20023 686 inlägg
Frågan#1

Hej!

Undrar om det går på något sätt läsa in en vanlig txt fil från en webbsida Tex. (http://www) och sedan i programmet läsa in första raden där man kanske skriver 2.0.0 och sedan så visar programmet detta på en label tex. "Nu finns version: 2.0.0 tillgänglig."

Medlem sedan okt. 20023 030 inlägg
#2

Det går faktiskt helt utan kontroller t.o.m. Med endast en Winsock eller liknande (som t.ex. winsock api som kanske är lite för komplicerat för dig?). Ska ge dig kod snart om ingen hinner före. :)

Medlem sedan mars 20023 686 inlägg
#3

Nexus86 skrev:

Det går faktiskt helt utan kontroller t.o.m. Med endast en Winsock eller liknande (som t.ex. winsock api som kanske är lite för komplicerat för dig?). Ska ge dig kod snart om ingen hinner före. :)

jag har inte tillgång till winsock control, sitter med learning edition av vb. så att du vet :)

Medlem sedan okt. 20023 030 inlägg
#4

Okej. Har du provat med att ta winsockkontrollen från en annan dator och registrera den i windows med hjälp av regsvr32? ;)

Kan vara ett tips annars då detta är en bra kontroll!

Medlem sedan mars 20023 686 inlägg
#5

Nexus86 skrev:

Okej. Har du provat med att ta winsockkontrollen från en annan dator och registrera den i windows med hjälp av regsvr32? ;)

Kan vara ett tips annars då detta är en bra kontroll!

Har inte tillgång till någon annan dator som har den controllen. Men ska kolla hos en polare, Har du någon annan lösning till min fråga? ;)

Medlem sedan okt. 20023 030 inlägg
#6

Går kanske med Init-kontrollen men är inte direkt en höjdare på den. Kan testa lite medan jag väntar på att någon ska svara på min tråd.

/r Skulle vara bra om du kunde skapa en fil åt mig att testa med. :)

Medlem sedan juni 20022 599 inlägg
#7

Det finns "internet"-API:er som ingår i alla Windowsversioner om man inte vill använda kontroller eller koda på winsock-nivå:

'Deklarationer
Private Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Private Const scUserAgent = "VB OpenUrl"
Private Const INTERNET_FLAG_RELOAD = &H80000000

Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
(ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _
ByVal sProxyBypass As String, ByVal lFlags As Long) As Long

Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" _
(ByVal hOpen As Long, ByVal sUrl As String, ByVal sHeaders As String, _
ByVal lLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long

Private Declare Function InternetReadFile Lib "wininet.dll" _
(ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, _
lNumberOfBytesRead As Long) As Integer

Private Declare Function InternetCloseHandle Lib "wininet.dll" _
(ByVal hInet As Long) As Integer

'Kod
Dim hOpen As Long, hOpenUrl, lNumberOfBytesRead As Long
Dim bDoLoop As Boolean, bRet As Boolean
Dim sReadBuffer         As String * 2048, sBuffer As String
hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
hOpenUrl = InternetOpenUrl(hOpen, "http://www.medialabs.nu/version.txt", vbNullString, 0, _
INTERNET_FLAG_RELOAD, 0)
bDoLoop = True
While bDoLoop
   sReadBuffer = vbNullString
   bRet = InternetReadFile(hOpenUrl, sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead)
   sBuffer = sBuffer & Left$(sReadBuffer, lNumberOfBytesRead)
   If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
Wend
If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
If hOpen <> 0 Then InternetCloseHandle (hOpen)
sBuffer = Split(sBuffer, vbNewLine)(0)
'Första raden i version.txt ligger nu i sBuffer.
Medlem sedan okt. 20023 030 inlägg
#8

Sa det lite högre upp men gav ingen kod eftersom att jag inte kunde någon. :r

/r MITT 1111e inlägg!!! :birp

Medlem sedan mars 20023 686 inlägg
#9

---

Medlem sedan juni 20022 599 inlägg
#10

Nexus86 skrev:

Sa det lite högre upp

Jaha, du menade Inet-kontrollen när du skrev Init-kontrollen? ;) Ja, den kontrollen är faktiskt en (onödig) wrappning kring funktionerna i wininet.dll.

medialabs skrev:

tackar, har en följefråga, kan man på något sätt kolla om användaren är ansluten till internet, om inte så ska inte den där funktionen köras.

Eh, ja? Du hade ju själv en funktion för just det i den här tråden. Remember?

Medlem sedan okt. 20023 030 inlägg
#11

niko skrev:

Jaha, du menade Inet-kontrollen när du skrev Init-kontrollen? ;)

Nej. Jag menade precis det jag skrev: :)

jag skrev:

Med endast en Winsock eller liknande (som t.ex. winsock api som kanske är lite för komplicerat för dig?).

Medlem sedan mars 20023 686 inlägg
#12

niko skrev:

Nexus86 skrev:

Sa det lite högre upp

Jaha, du menade Inet-kontrollen när du skrev Init-kontrollen? ;) Ja, den kontrollen är faktiskt en (onödig) wrappning kring funktionerna i wininet.dll.

medialabs skrev:

tackar, har en följefråga, kan man på något sätt kolla om användaren är ansluten till internet, om inte så ska inte den där funktionen köras.

Eh, ja? Du hade ju själv en funktion för just det i den här tråden. Remember?

Nu ska vi inte vara sån :e , fan det är dags för mig att gå och lägga mig snart. :p

Medlem sedan okt. 20023 030 inlägg
#13

Okej då. Erkänner att jag har fel. Såg nu att du skrev att det fanns "Internet"-API:er och nånting om winsock och tänkte genast "Winsock"-API:er. :e

Medlem sedan juni 20022 599 inlägg
#14

Nu ska vi inte vara sån

Fast om vi ska vara allvarliga så kollar faktiskt funktionen i den tråden bara om det finns en LAN-anslutning och inte ifall Internet är tillgängligt. Så om "Internet" inte finns eller om servern är nere så kommer du att få ett problem med att programmet "fryser" i cirka 30 s (TCP/IP-timeouten.)

Två förslag:

1. Låt användaren själv manuellt sköta kontrollen genom en "check for updates"-knapp.
2. Lägg funktonen i en separat bakgrundstråd så att huvudprogrammet inte "hänger" (krångligare).

Medlem sedan mars 20023 686 inlägg
#15

niko skrev:

Nu ska vi inte vara sån

Fast om vi ska vara allvarliga så kollar faktiskt funktionen i den tråden bara om det finns en LAN-anslutning och inte ifall Internet är tillgängligt. Så om "Internet" inte finns eller om servern är nere så kommer du att få ett problem med att programmet "fryser" i cirka 30 s (TCP/IP-timeouten.)

Två förslag:

1. Låt användaren själv manuellt sköta kontrollen genom en "check for updates"-knapp.
2. Lägg funktonen i en separat bakgrundstråd så att huvudprogrammet inte "hänger" (krångligare).

Tänkte just på att lägga in den i en msgbox så att användaren kan klicka på den.

Nu finns det en nu version av System Monitor, döpte den till System Information istället. :p

Medlem sedan juni 20022 599 inlägg
#16

Fast nu råkade jag visst svamla en hel del däruppe. Internet-API verkar inte alls ha samma problem med timeouter som winsock-API:erna, så om Internet inte är tillgängligt (eller din server är nere) så märker du det på att sBuffer blir tom ganska direkt.

Fast det är nog ändå vara en bra idé att låta användaren själv sköta kontrollen: för modemanvändare så kan det ju vara irriterande om modemet börjar ringa upp utan att de vet varför.

Nu finns det en nu version av System Monitor, döpte den till System Information istället.

Bra. Döp om "nätverkskort" till "nätverksinterface" också. Det mesta i listan är ju inte fysiska kort. (adapter<>card på engelska).

Medlem sedan mars 20023 686 inlägg
#17

niko skrev:

Fast nu råkade jag visst svamla en hel del däruppe. Internet-API verkar inte alls ha samma problem med timeouter som winsock-API:erna, så om Internet inte är tillgängligt (eller din server är nere) så märker du det på att sBuffer blir tom ganska direkt.

Fast det är nog ändå vara en bra idé att låta användaren själv sköta kontrollen: för modemanvändare så kan det ju vara irriterande om modemet börjar ringa upp utan att de vet varför.

Nu finns det en nu version av System Monitor, döpte den till System Information istället.

Bra. Döp om "nätverkskort" till "nätverksinterface" också. Det mesta i listan är ju inte fysiska kort. (adapter<>card på engelska).

Ok, ska tänka på om jag ska byta namn på den.

Medlem sedan juni 200314 inlägg
#18

Jag hittade en enkel kod som fungerar.

Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
"URLDownloadToFileA" (ByVal pCaller As Long, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As Long

Public Function DownloadFile(URL As String, _
LocalFilename As String) As Boolean
Dim lngRetVal As Long
lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0)
If lngRetVal = 0 Then DownloadFile = True
End Function

Private Sub Command1_Click()
ret = DownloadFile("http://www.server.com/version.txt", "c:\version.txt")
End Sub

Medlem sedan mars 20023 686 inlägg
#19

krupp skrev:

Jag hittade en enkel kod som fungerar.

Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
"URLDownloadToFileA" (ByVal pCaller As Long, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As Long

Public Function DownloadFile(URL As String, _
LocalFilename As String) As Boolean
Dim lngRetVal As Long
lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0)
If lngRetVal = 0 Then DownloadFile = True
End Function

Private Sub Command1_Click()
ret = DownloadFile("http://www.server.com/version.txt", "c:\version.txt")
End Sub

tack, tror att den där koden kommer till användning till en anna applikation som jag ska bygga ihop :)

268 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)