我正在关闭并处理本地声明的流写入器,但我仍然得到另一个进程异常使用的文件

本文关键字:另一个 文件 异常 进程 处理 声明 | 更新日期: 2023-09-27 18:18:20

我想实现以下几点:

  1. 将一堆单独的文本文件合并成一个组合文件,
  2. 将合并后的文件移动到新文件夹中。

我已经将这些任务分配给一个方法。

第一个方法中的某些东西挂在文件上,即使我正在关闭并处理流读取器-但我不知道是什么。我知道第一个方法的进程挂在文件上,因为当我注释掉第一个方法时,第二个方法可以毫无问题地移动文件。

EDIT 第一个方法是为新的大文件返回一个值。这将作为参数传递给第二个方法。当第二个方法试图引用这个文件时,程序就会抛出错误(从底部算起第5行)

大多数帖子建议关闭/处置IO对象,但我已经这样做了。他们还建议使用第三方工具来调查哪个进程挂在文件上,但我已经知道这是第一个合并方法(因为当它被注释掉时,程序运行)。

这是一个类似的问题:https://stackoverflow.com/questions/8088225/file-use-by-another-process-exception-in-c-sharp

我错过了什么?

newBigFile as string = mergeFiles (inputLocation, outputLocation) 
moveFiles = moveMergedFiles(inputLocation, outputLocation, newBigFile)
Private Function mergeFiles(ByVal inputLocationFilesToMerge As String, ByVal outputLocationHL7 As String) As String

    Dim newMergedFile As String = inputLocationFilesToMerge & "'jointFile" & DateTime.Now.Month & DateTime.Now.Day & DateTime.Now.Year & DateTime.Now.Hour & DateTime.Now.Minute & ".hl7"
    Dim objWriter As New System.IO.StreamWriter(newMergedFile)
    Dim HL7FilePaths As String() = System.IO.Directory.GetFiles(inputLocationFilesToMerge, "*.hl7")
    For Each p As String In HL7FilePaths
        Dim sr As StreamReader = New StreamReader(p)
        objWriter.Write(sr)
        sr.Close()
        sr.Dispose()
    Next
    objWriter.Close()
    objWriter.Dispose()
    Return (newMergedFile) 
End Function
Private Sub moveMergedFiles(ByVal inputLocationFilesToMerge As String, ByVal outputLocationHL7 As String, ByVal mergedFile As String)

    For Each q As String In System.IO.Directory.GetFiles(inputLocationFilesToMerge, "*.hl7")
        If (Not (q = mergedFile)) Then **this is where the error comes from**
            File.Move(q, outputLocationHL7 & "'" & Path.GetFileName(q)) 
        End If
    Next
End Sub

我正在关闭并处理本地声明的流写入器,但我仍然得到另一个进程异常使用的文件

objWriter.Write(sr)线上,您不应该呼叫sr.ReadToEnd()吗?似乎你正在传递streamReader对象而不是流数据(除非有一个我不知道的隐式强制转换)。

如果内存不是一个问题,也许尝试代替StreamReader快速File.ReadAllBytes(filename)。这样至少可以看到它是否是streamReader。

Dim objWriter As New System.IO.StreamWriter(newMergedFile)

在代码的其他地方使用了这个?-通常这是因为你创建了太多的新实例,或者该文件的流仍然打开,只是创建一个objWriter As New System.IO.StreamWriter(newMergedFile)的全局实例

完成后,关闭objWriter.Close(),我退出这个…代码看起来很混乱,缺乏清晰的思路和方向。

您没有处理objwriter。我还建议您对物理文件使用FileStream

最后但并非最不重要的是使用

所以在c# (ish)中,因为我不是VB头

using (FileStream fs = new FileStream(newMergedFile, FileMode.Create, FileAccess.Write))
{
    TextWriter objWriter = new StreamWriter(fs);
    foreach(String fileName in HL7FilePaths)
    {
        using (FileStream frs = new FileStream(fileName,FileMode.Open, FileAccess.Read))
        {
            ObjWriter.AppendStream(frs);
            ObjWriter.Flush(); 
        }
    }
}

不记得新FileStream的确切语法,合并文件的Create和ReadWrite和FileMode的Open和read,通常由FileAccess或类似的方法完成。

只是我们养成的一个习惯,总是使用using块,它会为你关闭和处置,Flush()来确保,如果在你尝试读或写之前有任何错误,FileStream会失败。

很少得到文件问题,如果您遵循这样的路径。

有两个问题…
1)您正在尝试打开jointFile进行读取,而该文件正在被用于写入。
2)你需要用sr.ReadToEnd读取文件,如ach

所述

改变:

For Each p As String In HL7FilePaths      
     Dim sr As StreamReader = New StreamReader(p)   
     objWriter.Write(sr)           
     sr.Close()
     sr.Dispose()       
Next   

:

For Each p As String In HL7FilePaths
            If p <> newMergedFile Then
                Dim sr As StreamReader = New StreamReader(p)
                objWriter.Write(sr.ReadToEnd)
                sr.Close()
                sr.Dispose()
            End If
Next