I am in process of building a basic chat client using an ftp server as it's host.
To update the chat log, it downloads a file, reads it, adds it to the log on a new line and finally the file is deleted itself. After that the cycle starts again.
But what happens is the when the cycle starts for the 2nd time, it somehow recreates the contents of the previous file even if the file on the server has changed.
This is the part that seems to act funny:
Private Sub bg_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles bg.DoWork
Dim url As String = ("http://vknyazev.0fees.us/message.txt")
Dim fwc As New WebClient
fwc.DownloadFile(url, "log.txt")
Dim freader As New StreamReader("log.txt")
message2 = freader.ReadToEnd
freader.Close()
freader.Dispose()
IO.File.Delete("log.txt")
End Sub
Here is the full solution (starts download from dropbox in .zip file)
It is happening due to a caching issue. The most simple workaround would be to add a random value somewhere inside the url.
Such as http://example.com/file.txt?44351
Related
I have done a simple VB application with this code:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim procName As String = Process.GetCurrentProcess().ProcessName
Dim processes As Process() = Process.GetProcessesByName(procName)
If processes.Length > 1 Then
Process.GetProcessesByName("keyinput")(0).Kill()
End If
End Sub
Public Sub type(ByVal int As Double, str As String)
For Each c As Char In str
SendKeys.Send(c)
System.Threading.Thread.Sleep(int * 1000)
Next
End Sub
Sub vai()
Dim line As String = ""
If File.Exists("trans.txt") Then
Using reader As New StreamReader("trans.txt")
Do While reader.Peek <> -1
line = reader.ReadLine()
type(0.155, line)
'SendKeys.Send(line)
SendKeys.Send("{ENTER}")
Loop
End Using
File.Delete("trans.txt")
End If
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
vai()
End Sub
Basically the timer in it check if a file exists, read it and type the content simulating the keyboard.
I want this exe to start automatically when user login, it does it, apparently, I can see the form1 pop up but doesn't really works. Everyting is fine only if I run it manually by double-clicking the icon. Why and what can I do? Thanks
ps. i already tried to execute it with windows task manager, or putting a shortcut in the windows startup folder, or calling it from a cmd
EDIT:
when app starts automatically , process is running, but windows form is showing like this
Instead starting manually is showing like this:
I don't know this for a fact but I suspect that the issue is the fact that you are not specifying the location of the file. If you provide only the file name then it is assumed to be in the application's current directory. That current directory is often the folder that the EXE is in but it is not always and it can change. DO NOT rely on the current directory being any particular folder. ALWAYS specify the path of a file. If the file is in the program folder then specify that:
Dim filePath = Path.Combine(Application.StartupPath, "trans.txt")
If File.Exists(filePath) Then
Using reader As New StreamReader(filePath)
EDIT:
If you are running the application at startup by adding a shortcut to the user's Startup folder then, just like any other shortcut, you can set the working directory there. If you haven't set the then the current directory will not be the application folder and thus a file identified only by name will not be assumed to be in that folder.
If you are starting the app that way (which you should have told us in the question) then either set the working directory of the shortcut (which is years-old Windows functionality and nothing to do with VB.NET) or do as I already suggested and specify the full path when referring to the file in code. Better yet, do both. As I already said, DO NOT rely on the current directory being any particular folder, with this being a perfect example of why, but it still doesn't hurt to set the current directory anyway if you have the opportunity.
It was a Windows task scheduler fault, that for some reason didn't executed the exe correctly at logon. I've solved the issue by using Task Till Down and everything works fine now.
I am creating a small application to parse HTML of a page into variables so I can generate code for another proprietary application. I am using VB with HTMLAgilityPack for parsing. When I execute the load statement, no error are shown but all other code after that line simply fails to execute, as if it isn't even there.
Private Sub Importer_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim strImportType As String
Dim strImportURL As String
strImportType = main.importType
strImportURL = main.importURL
Dim web As New HtmlAgilityPack.HtmlWeb
Dim content As New HtmlAgilityPack.HtmlDocument
content = web.Load(strImportURL)
After using Visual Vincent suggestion to open the Exceptions Settings and force VB to fail it allowed for more information. This issue was simply that the file was not being found due to spaces in the filename. Adding quotes around the filename resolved the issue.
I am using the below code to navigate to a specific web address as follows :
WebBrowser1.Navigate("http://192.168.0.157/cm?cmnd=POWER%20Toggle"
The fact is that the the link returns a .json file and the WebBrowser controls displays the default save file dialog asking if i want to save the file or run it.
I want to ignore it the dialog and read from the .json file directly(i mean after downloading it).
I just want to get rid of the Save dialog of the webbrowser.I am a newbie so i don't know what to search or how to ask properly.
Though your post is not even close to be standard and hardly explains the issue, what i understand so far is that you have a few issues and i will answer them separately.
Disabling the download dialog of the webbrowser and downloading the files automatically
Firstly, you mentioned it returns a .json file. So , you can easily add a SaveFileDialogto your form or set a custom path(maybe in a variable) and check if the webbrowser is trying to download any .json files. Then you will Cancel the call(typically i mean that cancel the popup that says Save , Run ...) and make use of the SaveFileDialog or the local variable to save the file directly to disk. Here's a sample which uses a local string variable as the path and saves the .json file directly to disk :
Imports System.ComponentModel
...
Dim filepath As String '''class lever variable
Private Sub myBroswer_Navigating(sender as Object, e As WebBrowserNavigatingEventArgs) Handles myBroswer.Navigating
If e.Url.Segments(e.Url.Segments.Length - 1).EndsWith(".json") Then
e.Cancel = True
filepath = "C:\test\" + e.Url.Segments(e.Url.Segments.Length - 1)
Dim client As WebClient = New WebClient()
AddHandler client.DownloadFileCompleted , AddressOf New AsyncCompletedEventHandler(DisplayJson);
client.DownloadFileAsync(e.Url, filepath)
End If
End Sub
Displaying the result AKA .json
It is very easy to de-serialize/parse .json files.But first, download this , extract the ZIP and Add Reference to Newtonsoft.Json.dll. Now consider the bellow code snippet :
Private Sub DisplayJson()
Dim parseJson = Newtonsoft.Json.Linq.JObject.Parse(File.ReadAllLines(filepath))
MsgBox(parseJson("element name here").ToString)
End sub
Hope this helps
I writing a pair of programs in visual basics that will consist of a client and receiver. The client is completed making an output text file similar to below.
Dim FileName As String = "Text.txt"
Dim message As String
Dim file As System.IO.StreamWriter
'lblmessage.text says "Call MsgBox("Hello!", 0, "Version Beta 0.3")"
lblmessage.text = message
Dim Drive As String = "C:\hello world\" & FileName
file = My.Computer.FileSystem.OpenTextFileWriter(Drive, True)
file.WriteLine(message)
file.Close()
A sister program that is designed to be a reader will read the generated file.
The program will then take the text located in the selected file and use it as code in the readers programming.
Best example I can show...
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim fileReader As String
fileReader = My.Computer.FileSystem.ReadAllText("C:\hello world\Text.txt")
fileReader
End Sub
where "fileReader" is suppose to run the generated code from the previous program and use it as code it the Reader.
The point of this program is to create help tickets in the client and have a tool for reviewing these ticket in the same way they were submitted through the second app.
vba and vb.net is different. I'm not sure in which language your doing your stuff.
vba: use the ScriptControl.Eval command to execute a bunch of commands.
vb.net: it's a bit more code. you can use VBCodeProvider Class. s this SO Question: Load VB.net code from .txt file and execute it on fly using System.CodeDom.Compiler
UPDATE
I found a perfekt resource if you are interested in how to do it right and how it works in the background: http://www.codemag.com/article/0211081
The following code should replace the executable and restart the application, which should work because the content should be replaced but not in the current running instance:
Dim tmppath As String = System.IO.Path.GetTempFileName
Private Sub YesBtn_Click(sender As Object, e As EventArgs) Handles YesBtn.Click
Dim client As New WebClient()
AddHandler client.DownloadProgressChanged, AddressOf client_ProgressChanged
AddHandler client.DownloadFileCompleted, AddressOf client_DownloadFileCompleted
client.DownloadFileAsync(New Uri("https://github.com/Yttrium-tYcLief/Scrotter/raw/master/latest/scrotter.exe"), tmppath)
End Sub
Public Sub client_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
File.Replace(tmppath, Application.ExecutablePath, Nothing)
Application.Restart()
End Sub
According to MSDN,
Pass Nothing to the destinationBackupFileName parameter if you do not want to create a backup of the file being replaced.
However, what really happens is that it does create a backup (if the .exe is scrotter.exe, then the new backup is scrotter.exe~RF729c1fe9.TMP). Additionally, a new empty folder called "False" is created in the root directory.
All I want is to replace the running executable with my file and not have any backups or extra folders. Any ideas?
Pretty hard to explain this with the posted code, this smells like a some kind of 3rd party utility stepping in and avoiding the problem your code has. It will never work when you pass Nothing for the backup file name. It is required if you want to replace an executable file that's also loaded into memory. The CLR creates a memory mapped file object for the assembly so Windows can page-in the data from the assembly into RAM on demand. With the big advantage that this doesn't take any space in the paging file. That MMF also puts a hard lock on the file so nobody can alter the file content. That would be disastrous.
That's a lock on the file data, not the directory entry for the file. So renaming the file still works. Which is what File.Replace() does when you provide a non-null backup file name, it renames the assembly so you can still create a file with the same name and not get in trouble with the lock. You can delete the backup copy afterwards, assuming that your program still has sufficient rights to actually remove the file when it starts back up. That's unusual with UAC these days. Or just not bother, disk space is cheap and having a backup copy around to deal with accidents is something you can call a feature.
So get ahead and use File.Replace() properly, use the 3rd argument. Don't forget to delete that backup file before you call Replace().
I think the .exe is locked so long as your process runs - which instance runs is of no concern.
To avoid this, I would place the updater in a separate .exe and shut down your main apllication while updating.