简体   繁体   中英

VB.NET - Problems trying to write a textfile

I have problems when trying to delete/create/write to this file.

The error:

The process cannot access the file 'C:\Users\Administrador\AppData\Local\Temp\PlayList_temp.txt' because it is being used by another process.

The highlighted lines by debugger:

If System.IO.File.Exists(Temp_file) = True Then System.IO.File.Delete(Temp_file)
System.IO.File.Create(Temp_file)

(Any of two, if I delete one line, the other line takes the same error id)

The sub:

Public Sub C1Button2_Click(sender As Object, e As EventArgs) Handles Button1.Click

        If Not playerargs = Nothing Then

        Dim Str As String
        Dim Pattern As String = ControlChars.Quote
        Dim ArgsArray() As String
        Dim Temp_file As String = System.IO.Path.GetTempPath & "\PlayList_temp.txt"
        Dim objWriter As New System.IO.StreamWriter(Temp_file)

        Str = Replace(playerargs, " " & ControlChars.Quote, "")
        ArgsArray = Split(Str, Pattern)

        If System.IO.File.Exists(Temp_file) = True Then System.IO.File.Delete(Temp_file)
        System.IO.File.Create(Temp_file)

    For Each folder In ArgsArray
        If Not folder = Nothing Then
            Dim di As New IO.DirectoryInfo(folder)
            Dim files As IO.FileInfo() = di.GetFiles("*")
                Dim file As IO.FileInfo

            For Each file In files
                ' command to writleline
                'Console.WriteLine("File Name: {0}", file.Name)
                'Console.WriteLine("File Full Name: {0}", file.FullName)
                objWriter.Write(file.FullName)
                objWriter.Close()
            Next
        End If
        Next

    If randomize.Checked = True Then
            RandomiseFile(Temp_file)
    End If

    Process.Start(userSelectedPlayerFilePath, playerargs)
    If autoclose.Checked = True Then
        Me.Close()
    End If
    Else
    MessageBox.Show("You must select at least one folder...", My.Settings.APPName)
    End If
End Sub

First, File.Create creates or overwrite the file specified, so you don't need to Delete it before.
Second, initializing a StreamWriter as you do, blocks the file and therefore you can't recreate it after.
So, simply move the StreamWriter intialization after the File.Create, or better, remove altogether the File.Create and use the StreamWriter overload that overwrites the file

....
If Not playerargs = Nothing Then
    ....
    Dim Temp_file As String = System.IO.Path.GetTempPath & "\PlayList_temp.txt"

    Using objWriter As New System.IO.StreamWriter(Temp_file, false)
        For Each folder In ArgsArray
            If Not folder = Nothing Then
                Dim di As New IO.DirectoryInfo(folder)
                Dim files As IO.FileInfo() = di.GetFiles("*")
                Dim file As IO.FileInfo
                For Each file In files
                    ' command to writleline
                    'Console.WriteLine("File Name: {0}", file.Name)
                    'Console.WriteLine("File Full Name: {0}", file.FullName)
                    objWriter.Write(file.FullName)
                    ' objWriter.Close() 
                Next
            End If
        Next
    End Using ' Flush, close and dispose the objWriter
    ....

Noticed also that you close the writer while still inside the loop, use the Using statement to close correctly the writer after the work is done.

The process cannot access the file 'C:\Users\Administrador\AppData\Local\Temp\PlayList_temp.txt' because it is being used by another process.

That means the file is opened or been used by another process.

Open your task manager and check if the file is there, then close it or simplex end the process.

I have had the same issue but I got it solved by closing the file.

Hope this helps!

From your details it seems that you are willing to delete if file exists and creates a new one.

I would suggest to remove this line:

 System.IO.File.Create(Temp_file)

and move this line just over the streamwriter line:

If System.IO.File.Exists(Temp_file) = True Then System.IO.File.Delete(Temp_file)

Something like this would help you:

Partial code:

Dim Temp_file As String = System.IO.Path.GetTempPath & "\PlayList_temp.txt"

' Delete file if exists
If System.IO.File.Exists(Temp_file) = True Then System.IO.File.Delete(Temp_file)    

' Create file for write.
Dim objWriter As New System.IO.StreamWriter(Temp_file)

Str = Replace(playerargs, " " & ControlChars.Quote, "")
ArgsArray = Split(Str, Pattern)
...
...
...

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