简体   繁体   中英

Add a path to a code VB.net / visual basic

how do I add a path to a code where "HERE_HAS_TO_BE_A_PATH" is. When I do, Im getting an error message. The goal is to be able to specific the path where is the final text file saved. Thanks!

Here is a code:

    Dim newFile As IO.StreamWriter = IO.File.CreateText("HERE_HAS_TO_BE_A_PATH")
    Dim fix As String
    fix = My.Computer.FileSystem.ReadAllText("C:\test.txt")
    fix = Replace(fix, ",", ".")
    My.Computer.FileSystem.WriteAllText("C:\test.txt", fix, False)


    Dim query = From data In IO.File.ReadAllLines("C:\test.txt")
                Let name As String = data.Split(" ")(0)
                Let x As Decimal = data.Split(" ")(1)
                Let y As Decimal = data.Split(" ")(2)
                Let z As Decimal = data.Split(" ")(3)
                Select name & " " & x & "," & y & "," & z


    For i As Integer = 0 To query.Count - 1
        newFile.WriteLine(query(i))
    Next

    newFile.Close()

1) Use a literal string:

The easiest way is replacing "HERE_HAS_TO_BE_A_PATH" with the literal path to desired output target, so overwriting it with "C:\\output.txt":

Dim newFile As IO.StreamWriter = IO.File.CreateText("C:\output.txt")

2) Check permissions and read/write file references are correct:

There's a few reasons why you might be having difficulties, if you're trying to read and write into the root C:\\ directory you might be having permissions issues.

Also, go line by line to make sure that the input and output files are correct every time you are using one or the other.

3) Make sure the implicit path is correct for non-fully qualified paths:

Next, when you test run the program, it's not actually in the same folder as the project folder, in case you're using a relative path, it's in a subfolder "\\bin\\debug", so for a project named [ProjectName], it compiles into this folder by default:

C:\path\to\[ProjectName]\bin\Debug\Program.exe

In other words, if you are trying to type in a path name as a string to save the file to and you don't specify the full path name starting from the C:\\ drive, like "output.txt" instead of "C:\\output.txt", it's saving it here:

C:\path\to\[ProjectName]\bin\Debug\output.txt

To find out exactly what paths it's defaulting to, in .Net Framework you can check against these:

Application.ExecutablePath
Application.StartupPath

4) Get user input via SaveFileDialogue

In addition to a literal string ("C:\\output.txt") if you want the user to provide input, since it looks like you're using .Net Framework (as opposed to .Net Core, etc.), the easiest way to set a file name to use in your program is using the built-in SaveFileDialogue object in System.Windows.Forms (like you see whenever you try to save a file with most programs), you can do so really quickly like so:

Dim SFD As New SaveFileDialog
SFD.Filter = "Text Files|*.txt"
SFD.ShowDialog()

' For reuse, storing file path to string
Dim myFilePath As String = SFD.FileName

Dim newFile As IO.StreamWriter = IO.File.CreateText(myFilePath) ' path var

' Do the rest of your code here

newFile.Close()

5) Get user input via console

In case you ever want to get a path in .Net Core, ie with a console, the Main process by default accepts a String array called args(), here's a different version that lets the user add a path as the first parameter when running the program, or if one is not provided it asks the user for input:

Console.WriteLine("Hello World!")

Dim myFilePath = ""
If args.Length > 0 Then
    myFilePath = args(0)
End If

If myFilePath = "" Then
    Console.WriteLine("No file name provided, please input file name:")
    While (myFilePath = "")
        Console.Write("File and Path: ")
        myFilePath = Console.ReadLine()
    End While
End If

Dim newFile As IO.StreamWriter = IO.File.CreateText(myFilePath) ' path var

' Do the rest of your code here

newFile.Close()

6) Best practices: Close & Dispose vs. Using Blocks

In order to keep the code as similar to yours as possible, I tried to change only the pieces that needed changing. Vikyath Rao and Mary respectively pointed out a simplified way to declare it as well as a common best practice.

For more information, check out these helpful explanations: Can any one explain why StreamWriter is an Unmanaged Resource. and Should I call Close() or Dispose() for stream objects?

In summary, although streams are managed and should garbage collect automatically, due to working with the file system unmanaged resources get involved, which is the primary reason why it's a good idea to manually dispose of the object. Your ".close()" does this. Overrides for both the StreamReader and StreamWriter classes call the ".dispose()" method, however it is still common practice to use a Using .. End Using block to avoid "running with scissors" as Enigmativity puts it in his post, in other words it makes sure that you don't go off somewhere else in the program and forget to dispose of the open filestream.

Within your program, you could simply replace the "Dim newFile As IO.StreamWriter = IO.File.CreateText("C:\\output.txt")" and "newFile.close()" lines with the opening and closing statements for the Using block while using the simplified syntax, like so:

'Dim newFile As IO.StreamWriter = IO.File.CreateText(myFilePath) ' old
Using newFile As New IO.StreamWriter(myFilePath) ' new

    Dim fix As String = "Text from somewhere!"
    newFile.WriteLine(fix)
    ' other similar operations here

End Using ' new -- ensures disposal
'newFile.Close() ' old

You can write that in this way. The stream writer automatically creates the file.

 Dim newFile As New StreamWriter(HERE_HAS_TO_BE_A_PATH)

PS: I cannot mention all these in the comment section as I have reputations less than 50, so I wrote my answer. Please feel free to tell me if its wrong

regards, vikyath

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM