如何将CDROM的驱动器号从D:更改为Z:的C#方法

9

我正在尝试编写一个方法,将CDROM驱动器从字母D更改为字母Z,但使用WMI没有成功。请问是否有其他方法可以在C#中实现这一点?

public void setVolCDROM()
{
    SelectQuery queryCDROM = 
        new SelectQuery("SELECT * FROM Win32_cdromdrive");
    ManagementObjectSearcher searcherCDROM = 
        new ManagementObjectSearcher(queryCDROM);
    foreach(ManagementObject cdromLetter in searcherCDROM.Get())
    {
        MessageBox.Show(cdromLetter["Drive"].ToString() + "\n"
            + cdromLetter["Manufacturer"].ToString());
        if (cdromLetter["Drive"].ToString() == "D:")
        {
            cdromLetter["Drive"] = "Z:";                        
            cdromLetter.Put();
        }
    }
}
6个回答

10

我不了解WMI,但是你可以使用winapi来更改驱动器的字母,这里有一个我转移到C#的示例(只包括你需要的部分)。

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetVolumeNameForVolumeMountPoint(string
    lpszVolumeMountPoint, [Out] StringBuilder lpszVolumeName,
    uint cchBufferLength);

[DllImport("kernel32.dll")]
static extern bool DeleteVolumeMountPoint(string lpszVolumeMountPoint);

[DllImport("kernel32.dll")]
static extern bool SetVolumeMountPoint(string lpszVolumeMountPoint,
    string lpszVolumeName);

const int MAX_PATH = 260;

private void ChangeDriveLetter()
{
    StringBuilder volume = new StringBuilder(MAX_PATH);
    if (!GetVolumeNameForVolumeMountPoint(@"D:\", volume, (uint)MAX_PATH))
        Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());

    if (!DeleteVolumeMountPoint(@"D:\"))
        Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());

    if (!SetVolumeMountPoint(@"Z:\", volume.ToString()))
        Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}

运行这段代码时要小心,您必须在将驱动器挂载点分配给新的盘符之前删除它,否则可能会导致问题,以下是原始代码:

/*****************************************************************
WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING  

   This program will change drive letter assignments, and the    
   changes persist through reboots. Do not remove drive letters  
   of your hard disks if you do not have this program on floppy  
   disk or you might not be able to access your hard disks again!
*****************************************************************/

7
我也觉得警示通知中提到“软盘”很有趣。 - rodrigoq
起初我还以为你在评论海报的帖子……后来才发现你就是那个发帖人。哈哈,点赞加一。 - user541686
当 WMI 不可用时,这是一个很好的替代方案。 - codewario

5

jason,您可以使用Win32_Volume类。

尝试以下代码:

    ManagementObjectSearcher disks = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Volume WHERE DriveLetter = 'D:'");
    foreach (ManagementObject disk in disks.Get())
    {
        disk.Get();
        disk["DriveLetter"] = "Z:";
        disk.Put();
    }

我尝试着用普通驱动器实现这个,它确实有效,但是出现了两个驱动器盘符!原来的是 F:/,结果我得到了 F:/ 和 Z:/ 两个盘符。 - tofutim

1

谢谢 Rodrigo!那正是我正在寻找的。我只是在它前面加了一些WMI代码,以便我可以确保我捕获了CDROM驱动器。

public void setCDROM(){
                SelectQuery queryCDROM =
                        new SelectQuery("SELECT * FROM Win32_cdromdrive");
                ManagementObjectSearcher searcherCDROM =
                        new ManagementObjectSearcher(queryCDROM);
                int i = 0;
                foreach(ManagementObject cdromLetter in searcherCDROM.Get())
                {
                    // if stement in place to handle if there is more than one cdrom drive
                    // this will only handle the first cdrom drive encountered 
                    i = i + 1;
                    if (i == 1)
                    {
                        // run the ChangeDriveLetter method passing the drive letter string
                        ChangeDriveLetter(cdromLetter["Drive"].ToString());
                    }
                }
}

请确保您传递的驱动器末尾带有反斜杠 D:\\,并且我认为它必须是大写字母。 - rodrigoq

0

我认为WMI的SelectQueries只能读取/查询信息,而不能执行任何更新操作。我可能错了,但我认为要更改驱动器字母,您应该在某些Win32 Api中进行更低级别的操作...


嗨Davide,是的,我可以使用这段代码更改标签信息,但无法更改实际驱动器号。正在寻找如何执行此操作的示例。我是C#新手 :) - jason
1
WMI 可以更改数据,但并非所有数据都可以更改。 - Dustin Davis
-1 Davide,使用WMI,您可以根据类和命名空间查询、更新和插入(创建)数据。 - RRUZ

0

0
我想在rodrigoq的解决方案中添加一条注释,在Vista及以上版本中,您需要以提升的权限运行应用程序,否则您将无法删除挂载点并分配新的驱动器字母,这将导致抛出异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接