使用 visual basic 在使用所述文件后尝试删除文件

Trying to delete a file after using said file, using visual basic

我正在开发一个程序,可以根据程序的屏幕截图创建 PDF 文件 window。这是我程序的 layout/UI:

基本上对于我的程序,我正在截取您在上面看到的 UI 的屏幕截图,将其保存为 Jpg 文件,然后将该 Jpg 文件转换为 PDF。

程序成功将 Jpg 转换为 PDF 后,我希望程序删除 Jpg,留下 PDF 文件。 问题2) Create PDF 按钮点击事件引起的 IOexception 错误引起:

The process cannot access the file 'C:\Users\Aliza\OneDrive\Desktop\test14\notebook_3412312.jpg' because it is being used by another process.'

我应该注意到程序成功地制作了我想要的 PDF,但我只是希望程序在从 Jpg 文件创建 PDF 后删除 Jpeg 文件。

这是我在 2) Create PDF 活动中的代码:

    Dim filename As String
    Dim collectionPeriod As String
    Dim fileLocation As String
    filename = CompNam.Text
    If filename = "" Then
        MessageBox.Show("Enter name of your file")
        End
    End If
    collectionPeriod = collectPeriod.Text
    If collectionPeriod = "" Then
        MessageBox.Show("Enter name of your collection period")
        End
    End If

    fileLocation = folderBrowseBox.Text

    GetFormImage(True).Save(fileLocation & "\" & RemoveWhitespace(filename) & "_" & RemoveWhitespace(collectionPeriod) & ".jpg", ImageFormat.Jpeg)

    ' Create new pdf document and page
    Dim doc As New PdfDocument()
    Dim oPage As New PdfPage()

    ' Add the page to the pdf document and add the captured image to it
    doc.Pages.Add(oPage)
    Dim img As XImage = XImage.FromFile(fileLocation & "\" & RemoveWhitespace(filename) & "_" & RemoveWhitespace(collectionPeriod) & ".jpg")

    'Create XImage object from file.
    Using xImg = PdfSharp.Drawing.XImage.FromFile(fileLocation & "\" & RemoveWhitespace(filename) & "_" & RemoveWhitespace(collectionPeriod) & ".jpg")
        'Resize page Width and Height to fit image size.
        oPage.Width = xImg.PixelWidth * 72 / xImg.HorizontalResolution
        oPage.Height = xImg.PixelHeight * 72 / xImg.HorizontalResolution

        'Draw current image file to page.
        Dim xgr = PdfSharp.Drawing.XGraphics.FromPdfPage(oPage)
        xgr.DrawImage(xImg, 0, 0, oPage.Width, oPage.Height)
    End Using

    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)

    doc.Save(fileLocation & "\" & RemoveWhitespace(filename) & "_" & RemoveWhitespace(collectionPeriod) & ".pdf")

    My.Computer.FileSystem.DeleteFile(fileLocation & "\" & RemoveWhitespace(filename) & "_" & RemoveWhitespace(collectionPeriod) & ".jpg")
    img.Dispose()

错误发生在您从上面看到的代码的第二行到最后一行(以 My.Computer.FileSystem... 开头)。再一次,任何帮助将不胜感激!

编辑:@jmcilhinney 这是我根据您的建议尝试添加的代码:

    Dim filePath As String
    filePath = fileLocation & "\" & RemoveWhitespace(filename) & "_" & RemoveWhitespace(collectionPeriod) & ".jpg"

    Using img As XImage = XImage.FromFile(filePath)
        img.Dispose()
    End Using

    My.Computer.FileSystem.DeleteFile(filePath)

我知道你说过不要在 Using 语句中加入 Dispose() 调用,但我很难确定在 Using 之间放置什么陈述。再次感谢您对我的耐心帮助。

看起来这两行应该反过来:

My.Computer.FileSystem.DeleteFile(fileLocation & "\" & RemoveWhitespace(filename) & "_" & RemoveWhitespace(collectionPeriod) & ".jpg")

img.Dispose()

如果 img 是从您尝试使用 Image.FromFileNew Bitmap 删除的文件创建的 Image 对象,则文件将被锁定,直到 Image 对象被释放。理想情况下,您可以使用 Using 语句创建 Image,然后删除块外的文件,例如

Dim filePath = "file path here"

Using img = Image.FromFile(filePath)
    'Use img here.
End Using

File.Delete(filePath)

所以这个问题的解决方案很简单。在与朋友讨论之后,我们所要做的就是在声明 filePath 变量时创建一个 TempPath

    Dim filePath As String
    filePath = System.IO.Path.GetTempPath & RemoveWhitespace(filename) & "_" & RemoveWhitespace(collectionPeriod) & ".jpg"

之前的问题是我们使用 fileLocation 变量中的文本保存我们的 Jpeg 文件,它不断出现“进程正在被另一个进程使用”的错误。

Using 块的使用被证明是不必要的。恰恰相反,它实际上弊大于利。这是经过改进的新代码:

    fileLocation = folderBrowseBox.Text

    Dim filePath As String
    filePath = System.IO.Path.GetTempPath & RemoveWhitespace(filename) & "_" & RemoveWhitespace(collectionPeriod) & ".jpg"

    GetFormImage(True).Save(filePath, ImageFormat.Jpeg)

    ' Create new pdf document and page
    Dim doc As New PdfDocument()
    Dim oPage As New PdfPage()

    ' Add the page to the pdf document and add the captured image to it
    doc.Pages.Add(oPage)

    'Create XImage object from file.
    Dim xgr = XGraphics.FromPdfPage(oPage)
    Dim xImg = XImage.FromFile(filePath)

    oPage.Width = xImg.PixelWidth * 72 / xImg.HorizontalResolution
    oPage.Height = xImg.PixelHeight * 72 / xImg.HorizontalResolution

    xgr.DrawImage(xImg, 0, 0, oPage.Width, oPage.Height)

    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)

    doc.Save(fileLocation & "\" & RemoveWhitespace(filename) & "_" & RemoveWhitespace(collectionPeriod) & ".pdf")

    doc.Close()

    xImg.Dispose()