Получение буквы дисковода CD/DVD при использовании SaveFileDialog (запись с IMAPI2)
Я использую фреймворк vb.net 2.0 для создания приложения WinForms, которое будет использоваться собственными силами. Одной из особенностей этого приложения является возможность пользователям экспортировать свою работу в виде текстовых файлов. Все это прекрасно работает для дискет (да, некоторые из моих пользователей все еще используют их), USB и сетевых расположений, но меня недавно попросили разрешить сохранение файлов на CD/DVD. Поскольку это приложение используется только на компьютерах с Windows 7, я реализовал IMAPI2. Во время первоначального тестирования я использовал жестко заданный путь / имя файла и все заработало. Проблема возникла, когда я удалил жестко запрограммированную часть и запустил тест с использованием SaveFileDialog. Это привело к двум нежелательным результатам, которые я не могу найти способ обойти.
Если я выберу оптический дисковод, пока там находится пустой диск, я получаю всплывающее окно, генерирующее окна, спрашивающее, как я хочу использовать диск (USB [Live File System| или CD/DVD Player [Mastered]). Это запутает моих пользователей. Есть ли способ установить по умолчанию для Мастера и избежать этого всплывающего окна?
Путь, возвращаемый из 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