我有一个Windows Forms应用程序,将PDF文件作为字节数组存储在数据库中(不是我的第一选择,但我没有设置数据库...)。我希望用户能够通过单击基本的“查看文档”按钮来查看这些存储的文件之一。
使用我现在拥有的代码,将字节写入磁盘上的文件,然后使用外部进程(用户计算机上的默认PDF阅读器)打开字节。问题在于,如果他们在关闭文件之前再次单击“查看文档”按钮,则会抛出异常,因为无法覆盖打开的文件。
由于我使用过Process.Start()打开文件,因此我尝试了各种杀死进程的方法,但是找不到通过文件名获取进程的方法(而不是任何读取器程序)会打开该文件,而该文件对该应用程序是未知的)。
点击处理程序中的相关代码是基本的:
init(viewController:)
(PDFBytes是字节数组,document.pdf只是我在打开文件之前用于存储文件的路径。每次用户单击“查看文档”按钮都将被覆盖,这很好)
预期结果:用户可以单击“查看文档”多次打开PDF,随后每次单击该文件都将关闭并重新打开,而不会出现问题。
实际结果:第一次单击可以很好地打开文档,然后单击(首先不关闭文件)会抛出“ System.IO.IOException:不能在打开用户映射部分的文件上执行请求的操作。” < / p>
答案 0 :(得分:1)
如果我了解此问题,则可能会有所帮助
Dim tempFileName As String
Dim pathToFile As String
Try
tempFileName = IO.Path.GetTempFileName
pathToFile = IO.Path.ChangeExtension(tempFileName, "pdf")
IO.File.WriteAllBytes(pathToFile, PDFBytes)
Process.Start(pathToFile)
IO.File.Delete(tempFileName)
Catch ex As Exception
'todo
End Try
编辑:
删除旧的pdfs
Dim tdir As String = IO.Path.GetTempPath
Dim di As New IO.DirectoryInfo(tdir)
Dim fis() As IO.FileSystemInfo = di.GetFileSystemInfos
Dim ctDel As Integer = 0
For Each fi As IO.FileSystemInfo In fis
If fi.CreationTime.AddDays(28) < Date.Now Then 'older than 28 days
Try
If fi.Extension = ".pdf" Then
IO.File.Delete(fi.FullName)
ctDel += 1
End If
Catch ex As Exception
'todo
' Stop
End Try
End If
Next