我想更改此标签:
在上图中,我手动更改了它,没有任何权限。
我在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();
答案 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安装的一部分。你可能做错了。尝试:
我想如果你以某种方式没有安装Windows SDK,你可能会丢失AxImp.exe,而Visual Studio可能无法创建允许你使用typelib的存根组件。我无法想象这怎么可能发生。如果安装了Visual Studio,那么应该已经获得了SDK。