1

我正在使用 vb.net 2.0 框架来创建将在内部使用的 WinForms 应用程序。此应用程序的一项功能是允许用户将他们的工作导出为文本文件。这一切都适用于软盘(是的,我的一些用户仍在使用这些)、USB 和网络位置,但我最近被要求允许将文件保存到 CD/DVD。由于这个应用程序只在 Windows 7 机器上使用,我实现了 IMAPI2。在我最初的测试中,我使用了一个硬编码的路径/文件名,并且一切正常。当我删除硬编码部分并使用 SaveFileDialog 运行测试时,问题就出现了。这产生了两个我找不到解决方法的不良结果。

  1. 如果我在其中有一张空白光盘时选择了光驱,我会弹出一个窗口,询问我想如何使用光盘(USB [Live File System| 或 CD/DVD Player [Mastered])。这会让我的用户感到困惑。有没有办法将其默认为 Mastered 并避免此弹出窗口?

  2. 从 SaveFileDialog 返回的路径不是光驱,而是临时 CD 刻录路径——在我的开发计算机的情况下为“c:\users[username]\AppData\Local\Microsoft\Windows\Burn\Burn\” (我有一种感觉,这是因为我在上面提到的弹出窗口中选择了 Mastered)。这会导致系统托盘中弹出“您有等待刻录到光盘的文件”气球*。有没有办法让 SaveFileDialog 返回光驱的实际驱动器号(以及用户可能在 CD/DVD 上创建的任何文件夹)?

*发生这种情况的原因是因为我检查了从 SaveFileDialog 返回的路径的驱动器类型。如果驱动器类型是 CDROM,那么我将启动一个用于刻录的功能。否则,我执行 File.Copy() 并且由于从 SaveFileDialog 返回的目标是刻录文件夹,这就是文本文件被复制到的位置——导致气球通知。

有没有更好的方法让我的用户保存到任何位置(包括光驱)?任何关于我如何完成这项工作的指示将不胜感激。

编辑: 已请求代码示例。正如评论中提到的,我的用户不想看到 Windows 生成的对话框,所以我构建了自己的“导出向导”。这是我正在使用的代码的简化版本(减去实际的 CD 刻录功能,我知道它确实有效)。

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' Function to get the drive type
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Public Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Int32
Public Enum DriveTypes
    Unknown = 0
    Invalid_or_Not_Mounted = 1
    Removable = 2
    Fixed = 3
    Remote = 4
    CDROM = 5
    RAMDisk = 6
End Enum

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' Choose Location
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Sub cmdBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdBrowse.Click
    With Me.SaveFileDialog1
        .Filter = "Export Files|*.txt"
        .FileName = "Export Files.txt"
        r = .ShowDialog(Me)
        If r = Windows.Forms.DialogResult.OK Then
            Me.lblFileLocation.Text = .FileName.Substring(0, .FileName.LastIndexOf("\") + 1)
            ' As per their request, I show the users the location they chose
            ' before they finish up the export wizard
        End If
    End With
End Sub

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' Export the data
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Sub Export(byval fSourcePath as String, byval fDestName as String)
    Dim iDriveType As Me.DriveTypes = Me.GetDriveType(Directory.GetDirectoryRoot(Me.lblFileLocation.Text))
    If iDriveType = DriveTypes.CDROM Then
        Me.BurnCD(fSource, fDestName) ' This works when I pass in a hard-coded string that contains the drive letter for the optical drive.
    Else
        File.Copy(fSource, Me.lblFileLocation.Text & fDestName, True)
    End If
End Sub
4

0 回答 0