使用SaveFileDialog获取CD / DVD驱动器号(使用IMAPI2刻录)

时间:2014-10-28 16:10:51

标签: vb.net savefiledialog cddvd

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

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

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

  3. * 发生这种情况的原因是因为我检查了从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
    

0 个答案:

没有答案