DirectoryNotFoundException was unhandled - vb.net

I'm trying to make a new file and write binary in it but the below error occurred
Could not find a part of the path 'C:\Users\user\Documents...\bin\Debug\data\binary\admin.bin'.
Here is my code
Dim bw As BinaryWriter
dim pathBin As String = Application.StartupPath & "\binary"
Dim fileExist As Boolean
Try
bw = New BinaryWriter(New FileStream(pathBin & "\admin.bin", FileMode.create))
fileExist = True
Catch ex As IOException
MessageBox.Show(ex.Message & vbNewLine & "Cannot create file.")
End Try
bw.Close()

Your issue is the path you are using does not exist which will make FileStream quite upset. Try something like this before you use the FileStream:
If Not Directory.Exists(pathBin) Then
Directory.CreateDirectory(pathBin)
End If
This will ensure that if the directory does not exist then it is created ahead of time.

Related

extract my.setting.whatever from another exe

Ussing vb.net I extract an image from another exe using the following code.
My question is, is it also possible to extract a setting value from another exe using a simular method?
Try
Dim ExternalAssembly As Assembly = Assembly.LoadFile(Application.StartupPath & "/" & PluginPath)
Dim TargetPlugin As String = IO.Path.GetFileNameWithoutExtension(Application.StartupPath & "/" & PluginPath)
Dim ExternalResourceManager As Resources.ResourceManager
ExternalResourceManager = New Resources.ResourceManager(TargetPlugin & ".resources", ExternalAssembly)
If ExternalResourceManager.GetObject("MyStringRefrenceName") = Nothing Then
.Image = My.Resources.ResourceManager.GetString("MyStringRefrenceName").testing 'or is it value?
Msgbox(MyStringRefrenceName)
End If
Catch ex As Exception
Msgbox("failed")
End Try

End of Stream encountered before parsing was completed. while Deserializing in vb.net

I am getting error:
End of Stream encountered before parsing was completed while deserializing the file
code:
Dim fs As FileStream = Nothing
Try
fs = IO.File.OpenRead(Filename)
'fs = New FileStream(Filename, FileMode.Open)
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
bf.AssemblyFormat = Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full
bf.TypeFormat = Runtime.Serialization.Formatters.FormatterTypeStyle.TypesWhenNeeded
fs.Seek(0, SeekOrigin.Begin)
Dim obj As Object = bf.Deserialize(fs)
Return obj
Catch ex As Exception
MsgBox("There was an exception while trying to convert binary file to object. Exception: " & ex.Message & " | Stacktrace: " & ex.StackTrace)
Finally
If fs IsNot Nothing Then
fs.Close()
End If
End Try
I have tried with fs.Position=0 also even it is not working.
Any one can help me. Thanks in advance
The error is probably in serializing part of code.
Please for now get rid of Format properties in both procedures and make sure you were using using everywhere where possible so that all bytes of all streams, writers, readers and their wrappers have been flushed.

IOException issue with asynchronous PDF creation

I have an asynchronous method that creates a PDF file from XML retrieved from a database. Everything works great, but occasionally I get an IOException because when I try to cleanup the temporary .fo file after creating the PDF, the file is still in use.
Public Sub FormatObjectToPdf(ByVal intRxNo As Integer, ByVal strSourceFileName As String)
Dim startInfo As New ProcessStartInfo
Dim strPdfFile As String = g_strRootPath & "Paperwork\" & intRxNo & "M.pdf"
' if the PDF file already exists, no need to re-create it
If Not File.Exists(strPdfFile) Then
Try
startInfo.Arguments = "-fo """ & strSourceFileName & """ -pdf """ & strPdfFile & """"
startInfo.FileName = g_strAppPath & "FO.NET\fonet.exe"
startInfo.UseShellExecute = True
startInfo.WindowStyle = ProcessWindowStyle.Hidden
Using proc As Process = Process.Start(startInfo)
proc.WaitForExit()
If proc.HasExited Then
proc.Dispose()
End If
End Using
Catch ex As Exception
Call InsertLog("ErrorLog", "FormatObjectToPdf: " & ex.Message, ex)
MessageBox.Show(ex.Message, "Create PDF", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Try
End If
' wait 3 seconds to allow file to be released
System.Threading.Thread.Sleep(3000)
' delete the source FO file when processing is complete
If File.Exists(strSourceFileName) Then
Try
File.Delete(strSourceFileName)
Catch iEx As IOException
Call InsertLog("ErrorLog", "Could not delete file '" & strSourceFileName & "': " & iEx.Message, iEx)
Catch ex As Exception
Call InsertLog("ErrorLog", "Error deleting file '" & strSourceFileName & "': " & ex.Message, ex)
End Try
End If
End Sub
The FormatObjectToPdf method is called from another method, AsyncXmlToPdf, which is actually where the IOException is thrown. I had initially thought that the exception was in FormatObjectToPdf since that is where I am deleting the .fo file, so I had added a Sleep(3000) to see if giving it a few seconds would help.
Here is the AsyncXmlToPdf:
Public Sub AsyncXmlToPdf(ByVal state As Object)
Dim intRxNo = state(0)
Dim flgPrintResult As Boolean = state(1)
Dim strFileName As String = g_strAppPath & intRxNo & ".fo"
Dim strOutput As String
Dim strPdfFile As String = g_strRootPath & "Paperwork\" & intRxNo & "M.pdf"
Try
If File.Exists(strPdfFile) Then
File.Delete(strPdfFile)
End If
If Not File.Exists(strPdfFile) AndAlso Not File.Exists(strFileName) Then
strOutput = XmlToFormatObject(intRxNo, g_strAppPath & "FO.NET\immfo.xsl")
Using writer As StreamWriter = New StreamWriter(strFileName)
writer.Write(strOutput)
End Using
Call FormatObjectToPdf(intRxNo, strFileName)
End If
Catch ex As Exception
Call InsertLog("ErrorLog", "AsyncXmlToPdf: " & ex.Message, ex)
End Try
End Sub
The only part of either method other than the declaration of strFileName that even does anything with the .fo file is in FormatObjectToPdf and that method has a Catch block for IOException. Why is the exception being caught in AsyncXmlToPdf?? Here is the actual error message:
3/25/2015 11:15 AM: [IOException] AsyncXmlToPdf: The process cannot access the file 'C:\Users\<username>\AppData\Local\Apps\2.0\1M2D4TCB.REJ\3LH3JZY2.TQC\<clickonce app>\561964.fo' because it is being used by another process.
Everything works as expected, other than the occasional orphaned .fo file when this exception occurs. Anyone have any suggestions on how I might be able to find out where the problem is?
The only part of either method ... that even does anything with the .fo file is in FormatObjectToPdf It appears that AsyncXmlToPdf will also try to open a streamwriter on it.
If there is a chance that some other BackGroundWorker, Thread or Task could also be working on the same set of files, it would be possible for the same file to be in use in AsyncXmlToPdf and FormatObjectToPdf. MSDN warns of this in the File.Exists entry:
Be aware that another process can potentially do something with the file in between the time you call the Exists method and perform another operation on the file, such as Delete.
In your case it looks like it might be a a coin flip which method the Exception will happen in.
If an accidental double click could start the same process twice, it is possible that the same file could be in use in both methods at the same time. You could add another test to see if you can open the file for ReadWrite. Given that the file was not supposed to exist yet, you could at least be somewhat certain as to the reason.
Some sort of flag to prevent more than one set of jobs from starting might be the final solution.

My VB project fails to download an exe file

I have an update dialog and when the "Direct Download" button is pressed it used to download an exe file from a dropbox location. However, now it just doesn't download the file anymore, and it's meant to launch the file after download but it will say: File Not found.
The code is:
Dim TempPath As String = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Temp"
Try
My.Computer.FileSystem.DeleteFile(TempPath & "\animeygocardmaker.exe")
My.Computer.Network.DownloadFile("https://dl.dropboxusercontent.com/u/72383434/animeygocardmaker.exe", TempPath & "\animeygocardmaker.exe")
Catch ex As Exception
MsgBox("An error occured while trying to download the file")
End Try
System.Diagnostics.Process.Start(TempPath & "\animeygocardmaker.exe")
Dim CloseAllWindows As New CloseAll
Form1.Pause()
CloseAllWindows.CloseAll()
And like I said it always used to work. Could the problem be that the file takes too long to download?
Dim TempPath As String = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Temp"
Try
My.Computer.Network.DownloadFile("https://dl.dropboxusercontent.com/u/72383434/animeygocardmaker.exe", TempPath & "\animeygocardmaker.exe")
System.Diagnostics.Process.Start(TempPath & "\animeygocardmaker.exe")
Dim CloseAllWindows As New CloseAll
Form1.Pause()
Catch ex As Exception
MsgBox("An error occured while trying to download the file" + ex.ToString)
End Try
CloseAllWindows.CloseAll()

Creating and appending text to txt file in VB.NET

Using VB.NET, I am trying to create a text file if it doesn't exist or append text to it if exists.
For some reason, though it is creating the text file I am getting an error saying process cannot access file.
And when I run the program it is writing text, but how can I make it write on a new line?
Dim strFile As String = "C:\ErrorLog_" & DateTime.Today.ToString("dd-MMM-yyyy") & ".txt"
Dim sw As StreamWriter
Dim fs As FileStream = Nothing
If (Not File.Exists(strFile)) Then
Try
fs = File.Create(strFile)
sw = File.AppendText(strFile)
sw.WriteLine("Start Error Log for today")
Catch ex As Exception
MsgBox("Error Creating Log File")
End Try
Else
sw = File.AppendText(strFile)
sw.WriteLine("Error Message in Occured at-- " & DateTime.Now)
sw.Close()
End If
Try this:
Dim strFile As String = "yourfile.txt"
Dim fileExists As Boolean = File.Exists(strFile)
Using sw As New StreamWriter(File.Open(strFile, FileMode.OpenOrCreate))
sw.WriteLine( _
IIf(fileExists, _
"Error Message in Occured at-- " & DateTime.Now, _
"Start Error Log for today"))
End Using
Don't check File.Exists() like that. In fact, the whole thing is over-complicated. This should do what you need:
Dim strFile As String = $#"C:\ErrorLog_{DateTime.Today:dd-MMM-yyyy}.txt"
File.AppendAllText(strFile, $"Error Message in Occured at-- {DateTime.Now}{Environment.NewLine}")
Got it all down to two lines of code :)
This should work for you without changing program logic (by not outputting "Start error" on the top of each file) like the other answers do :)
Remember to add exception handling code.
Dim filePath As String = String.Format("C:\ErrorLog_{0}.txt", DateTime.Today.ToString("dd-MMM-yyyy"))
Dim fileExists As Boolean = File.Exists(filePath)
Using writer As New StreamWriter(filePath, True)
If Not fileExists Then
writer.WriteLine("Start Error Log for today")
End If
writer.WriteLine("Error Message in Occured at-- " & DateTime.Now)
End Using
You didn't close the file after creating it, so when you write to it, it's in use by yourself. The Create method opens the file and returns a FileStream object. You either write to the file using the FileStream or close it before writing to it. I would suggest that you use the CreateText method instead in this case, as it returns a StreamWriter.
You also forgot to close the StreamWriter in the case where the file didn't exist, so it would most likely still be locked when you would try to write to it the next time. And you forgot to write the error message to the file if it didn't exist.
Dim strFile As String = "C:\ErrorLog_" & DateTime.Today.ToString("dd-MMM-yyyy") & ".txt"
Dim sw As StreamWriter
Try
If (Not File.Exists(strFile)) Then
sw = File.CreateText(strFile)
sw.WriteLine("Start Error Log for today")
Else
sw = File.AppendText(strFile)
End If
sw.WriteLine("Error Message in Occured at-- " & DateTime.Now)
sw.Close()
Catch ex As IOException
MsgBox("Error writing to log file.")
End Try
Note: When you catch exceptions, don't catch the base class Exception, catch only the ones that are releveant. In this case it would be the ones inheriting from IOException.
Why not just use the following simple call (with any exception handling added)?
File.AppendAllText(strFile, "Start Error Log for today")
EDITED ANSWER
This should answer the question fully!
If File.Exists(strFile)
File.AppendAllText(strFile, String.Format("Error Message in Occured at-- {0:dd-MMM-yyyy}{1}", Date.Today, Environment.NewLine))
Else
File.AppendAllText(strFile, "Start Error Log for today{0}Error Message in Occured at-- {1:dd-MMM-yyyy}{0}", Environment.NewLine, Date.Today)
End If
While I realize this is an older thread, I noticed the if block above is out of place with using:
Following is corrected:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim filePath As String =
String.Format("C:\ErrorLog_{0}.txt", DateTime.Today.ToString("dd-MMM-yyyy"))
Using writer As New StreamWriter(filePath, True)
If File.Exists(filePath) Then
writer.WriteLine("Error Message in Occured at-- " & DateTime.Now)
Else
writer.WriteLine("Start Error Log for today")
End If
End Using
End Sub
Try it this way:
Dim filePath As String =
String.Format("C:\ErrorLog_{0}.txt", DateTime.Today.ToString("dd-MMM-yyyy"))
if File.Exists(filePath) then
Using writer As New StreamWriter(filePath, True)
writer.WriteLine("Error Message in Occured at-- " & DateTime.Now)
Else
writer.WriteLine("Start Error Log for today")
End Using
end if