使用 SaveFileDialog 将现有文件保存到用户计算机的正确方法是什么?

问题描述

我有一个创建 PDF 的 vb.net Windows 应用程序。创建后,我想提示用户他们想要保存文件的位置。认保存文件夹与创建的 PDF 的文件夹不同。我让 SaveDialog 框提供我想要的文件夹和文件名。如果我选择“保存”,我会收到一条消息,提示文件不存在,并且 ShowDialog 下方的代码均未执行(我确定我在这部分也做错了)。

Dim saveFileDialog1 As New SaveFileDialog
      saveFileDialog1.InitialDirectory = MyDocsFolder
      saveFileDialog1.FileName = "Report.pdf"
      saveFileDialog1.Title = "Save Report"
      saveFileDialog1.CheckFileExists = True
      saveFileDialog1.CheckPathExists = True
      saveFileDialog1.DefaultExt = "pdf"
      saveFileDialog1.Filter = "All files (*.*)|*.*|All files (*.*)|*.*"
      saveFileDialog1.FilterIndex = 2
      saveFileDialog1.RestoreDirectory = True
      saveFileDialog1.ShowDialog()
      If saveFileDialog1.ShowDialog = DialogResult.OK Then
          If saveFileDialog1.FileName() <> "" Then
              Dim newStream As FileStream = File.Open(newFile,FileMode.Open)
              Dim pdfStream As New FileStream(saveFileDialog1.FileName,FileMode.Create)
              newStream.copyTo(fs,FileMode.Append)
              newStream.Close()
              fs.Close()
          End If
      End If

解决方法

你可以这样做:

Imports Microsoft.WindowsAPICodePack.Dialogs
Public NotInheritable Class Form1
    Private Sub ButtonSave_Click(sender As Object,e As EventArgs) Handles ButtonSave.Click
        Dim Path As String
        Using SFD1 As New CommonSaveFileDialog
            SFD1.Title = "Where should the file be saved?"
            SFD1.Filters.Add(New CommonFileDialogFilter("PDF",".pdf"))
            SFD1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
            If SFD1.ShowDialog() = CommonFileDialogResult.Ok Then
                Path = SFD1.FileName
            Else
                Return
            End If
        End Using

        Dim dest As IO.FileInfo
        Using fs As IO.FileStream = IO.File.Create(Path & ".pdf")
            dest = My.Computer.FileSystem.GetFileInfo(fs.Name)
        End Using
    End Sub
End Class

请注意,我使用的是从 Visual Studios 自己的 Nuget 包管理器下载的 FileDialog。见图片。您不必这样做,但我更喜欢这个 FileDialog,因为它提供的选项比已包含的选项更多。

于是用户输入文件名;因此路径结果。在我的代码示例中,这会创建一个空白的 PDF。还不能像这样打开。 为了将某些内容写在 PDF 中,您可以下载 itext7(也可以通过 NuGet)。

然后,你写Imports iText.Kernel.PdfImports iText.Kernel.Utils 并在您的子 Dim pdfwriter As New PdfWriter(dest) 中使用上面的“dest”。 NuGet,download FileDialog

,

我又瞎又蠢...

saveFileDialog1.CheckFileExists = True

抱歉浪费了大家的时间。