在调用File.WriteAllBytes之前关闭文件?

时间:2019-06-27 17:04:24

标签: arrays vb.net winforms pdf

我有一个Windows Forms应用程序,将PDF文件作为字节数组存储在数据库中(不是我的第一选择,但我没有设置数据库...)。我希望用户能够通过单击基本的“查看文档”按钮来查看这些存储的文件之一。

使用我现在拥有的代码,将字节写入磁盘上的文件,然后使用外部进程(用户计算机上的默认PDF阅读器)打开字节。问题在于,如果他们在关闭文件之前再次单击“查看文档”按钮,则会抛出异常,因为无法覆盖打开的文件。

由于我使用过Process.Start()打开文件,因此我尝试了各种杀死进程的方法,但是找不到通过文件名获取进程的方法(而不是任何读取器程序)会打开该文件,而该文件对该应用程序是未知的)。

点击处理程序中的相关代码是基本的:

init(viewController:)

(PDFBytes是字节数组,document.pdf只是我在打开文件之前用于存储文件的路径。每次用户单击“查看文档”按钮都将被覆盖,这很好)

预期结果:用户可以单击“查看文档”多次打开PDF,随后每次单击该文件都将关闭并重新打开,而不会出现问题。

实际结果:第一次单击可以很好地打开文档,然后单击(首先不关闭文件)会抛出“ System.IO.IOException:不能在打开用户映射部分的文件上执行请求的操作。” < / p>

1 个答案:

答案 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
相关问题