我正在使用vb.net 2.0框架来创建一个将在内部使用的WinForms应用程序。此应用程序的一个功能是允许用户将其工作导出为文本文件。这一切都适用于软盘(是的,我的一些用户仍然使用这些),USB和网络位置,但我最近被要求允许将文件保存到CD / DVD。由于此应用程序仅用于Windows 7计算机,因此我实现了IMAPI2。在我的初始测试期间,我使用了硬编码的路径/文件名,并使一切正常。当我删除硬编码部分并使用SaveFileDialog运行测试时出现问题。这产生了两个不可取的结果,我无法找到解决方法。
如果我在空白光盘中选择光驱,我会弹出一个窗口,询问我是如何使用光盘的(USB [Live File System |或CD / DVD播放器[Mastered]) 。这会让我的用户感到困惑。有没有办法将其默认为Mastered并避免弹出?
从SaveFileDialog返回的路径不是光驱,而是临时CD刻录路径 - “c:\ users [用户名] \ AppData \ Local \ Microsoft \ Windows \ Burn \ Burn \”in我的开发计算机的情况(我有一种感觉,这是由于我在上面提到的弹出窗口中选择了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