Закройте файл перед вызовом File.WriteAllBytes? - PullRequest
1 голос
/ 27 июня 2019

У меня есть приложение Windows Forms, которое хранит PDF-файлы в виде байтовых массивов в базе данных (не мой выбор, но я не настраивал базу данных ...).Я хочу, чтобы пользователь мог просматривать один из этих сохраненных файлов, щелкая обычную кнопку «Просмотр документа».

С кодом, который у меня есть сейчас, байты записываются в файл на диске, а затем открываются с помощью внешнего процесса (программа чтения PDF по умолчанию на компьютере пользователя).Проблема заключается в том, что если они снова нажимают кнопку «просмотреть документ» перед закрытием файла, возникает исключение, потому что открытый файл не может быть перезаписан.

Поскольку я использовал Process.Start () дляоткрыть файл, я пробовал различные способы убить процесс, но я не могу найти способ получить процесс по имени файла (а не какой-либо программе чтения открывает файл, который неизвестен приложению).

Соответствующий код внутри обработчика щелчков является базовым:

File.WriteAllBytes("document.pdf", PDFBytes)
Process.Start("document.pdf")

(PDFBytes - это байтовый массив, document.pdf - это просто путь, который я использую для сохранения файла перед его открытием.. Он будет перезаписываться каждый раз, когда пользователь нажимает кнопку «Просмотр документа», что нормально).

Ожидаемый результат: пользователь может нажать «Просмотр документа», чтобы открыть PDF несколько раз, и файл будетзакройте и снова открывайте каждый последующий щелчок без проблем.

Фактический результат: первый щелчок открывает документ очень хорошо, следующий щелчок (без закрытия файла первым) выдает «System.IO.IOException: запрошенная операция не может быть выполненадля файла с открытым разделом, отображенным пользователем. "

1 Ответ

1 голос
/ 27 июня 2019

Если я понимаю проблему, это может помочь

    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

edit:

удалить старые 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...