如何在Windows中更改卷的“友好标签”?

时间:2016-12-21 15:23:19

标签: c# driveinfo

我想更改此标签:

that

在上图中,我手动更改了它,没有任何权限。

我在this线程中尝试了以下内容,但是它给出了一个System.UnauthorizedAccessException

public void setVolumeLabel(String oldName, string newLabel){
        DriveInfo[] allDrives = DriveInfo.GetDrives();
        foreach (DriveInfo d in allDrives){
            if (d.IsReady && d.Name.Equals(oldName)){
            d.VolumeLabel = newLabel;
        }
}

所以VolumeLabel属性不是我想要的。 然后我读了this帖子,但由于某些原因无法导入Shell32.dll,它说 找到Axlmp.exe。

还与SetVolumeName()一起尝试。它返回非零数字,但不会更改de VolumeName。

[DllImport("kernel32.dll", SetLastError=true)]  
public static  extern bool SetVolumeLabel(String letter, String label);

[DllImport("kernel32.dll")]
public static extern uint GetLastError();

2 个答案:

答案 0 :(得分:1)

当您(可能)以管理员权限登录时,您可以在资源管理器中对其进行编辑。但是,除非您通过以下方法之一明确说明,否则您的C#软件不会以管理员身份运行:

1)以管理员身份运行VS

2)以管理员身份在资源管理器中运行您的应用程序

3)将您的应用程序配置为通过其清单

以管理员身份运行

答案 1 :(得分:0)

由于DriveInfo.VolumeLabel property状态的文档非常清楚,因为以下原因之一,可能会抛出UnauthorizedAccessException

  
      
  • 卷标正在网络或CD-ROM驱动器上设置。
  •   
  • 拒绝访问驱动器信息。
  •   

第二个是一个很好的假设;它是LordWilmore made in his answer的那个。但是,你已经表明情况并非如此。

这留下了第一个,这是有意义的,考虑到你已经在评论中指出驱动器J:实际上是一个网络驱动器。您无法使用此机制更改网络驱动器的标签。

为此,您需要使用COM接口。您将查询shell以获取表示您希望操作的网络驱动器的Folder2 object。然后,您将使用此对象的Self property来检索文件夹的相应FolderItem object。最后,您可以直接为该对象设置Name property

Here is the solution in C++you already found the solution in C# and VB 6。但是,您声称您无法像Syberdoor建议的那样添加对“Microsoft Shell控件和自动化”库的引用。我不知道为什么不呢。你得到的错误信息没什么意义。 AxImp.exe是标准.NET Framework安装的一部分。你可能做错了。尝试:

  1. 在“解决方案资源管理器”中右键单击项目
  2. 选择“添加参考”
  3. 在“添加引用”对话框中,切换到“COM”选项卡
  4. 检查“Microsoft Shell控件和自动化”
  5. 我想如果你以某种方式没有安装Windows SDK,你可能会丢失AxImp.exe,而Visual Studio可能无法创建允许你使用typelib的存根组件。我无法想象这怎么可能发生。如果安装了Visual Studio,那么应该已经获得了SDK。