我正在关闭并处理本地声明的流写入器,但我仍然得到另一个进程异常使用的文件
本文关键字:另一个 文件 异常 进程 处理 声明 | 更新日期: 2023-09-27 18:18:20
我想实现以下几点:
- 将一堆单独的文本文件合并成一个组合文件,
- 将合并后的文件移动到新文件夹中。
我已经将这些任务分配给一个方法。
第一个方法中的某些东西挂在文件上,即使我正在关闭并处理流读取器-但我不知道是什么。我知道第一个方法的进程挂在文件上,因为当我注释掉第一个方法时,第二个方法可以毫无问题地移动文件。
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