Получение буквы дисковода CD/DVD при использовании SaveFileDialog (запись с IMAPI2)

Я использую фреймворк vb.net 2.0 для создания приложения WinForms, которое будет использоваться собственными силами. Одной из особенностей этого приложения является возможность пользователям экспортировать свою работу в виде текстовых файлов. Все это прекрасно работает для дискет (да, некоторые из моих пользователей все еще используют их), USB и сетевых расположений, но меня недавно попросили разрешить сохранение файлов на CD/DVD. Поскольку это приложение используется только на компьютерах с Windows 7, я реализовал IMAPI2. Во время первоначального тестирования я использовал жестко заданный путь / имя файла и все заработало. Проблема возникла, когда я удалил жестко запрограммированную часть и запустил тест с использованием SaveFileDialog. Это привело к двум нежелательным результатам, которые я не могу найти способ обойти.

  1. Если я выберу оптический дисковод, пока там находится пустой диск, я получаю всплывающее окно, генерирующее окна, спрашивающее, как я хочу использовать диск (USB [Live File System| или CD/DVD Player [Mastered]). Это запутает моих пользователей. Есть ли способ установить по умолчанию для Мастера и избежать этого всплывающего окна?

  2. Путь, возвращаемый из SaveFileDialog, - это не оптический привод, а временный путь записи компакт-диска -"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

0 ответов

Другие вопросы по тегам