Переименуйте подключенный диск с помощью API оболочки

Как изменить понятное имя подключенного диска с помощью API оболочки Windows и C#? Моя реальная проблема заключается в том, что я имею дело с отключенным сетевым диском без пути UNC, поэтому единственный способ переименовать его - из проводника, но я хочу сделать это программно.


person apaka    schedule 16.08.2011    source источник
comment
возможный дубликат C# Как изменить букву диска компакт-диска с D: на Z:   -  person Arsen Mkrtchyan    schedule 16.08.2011
comment
Не дубликат; это другой вопрос. OP хочет знать, как переименовать понятное имя подключенного диска, а не изменить букву диска.   -  person James Johnston    schedule 16.08.2011
comment
comment
Это не дубликат, потому что я давно его тестировал, он не работает. Мне нужно что-то, что работает точно так же, как щелчок правой кнопкой мыши-> переименовать.   -  person apaka    schedule 16.08.2011
comment
Есть вероятность, что ShellExecute сработает, используя переименование в качестве операции и предоставив новое имя в lpParameters. Я понятия не имею, что вам нужно передать в lpFile: полное имя синтаксического анализа для меня мало что значит.   -  person Harry Johnston    schedule 17.08.2011
comment
Вопрос, на который я ссылался, делает именно это и работает.   -  person Luke    schedule 17.08.2011


Ответы (3)


У меня была аналогичная проблема, и я решил ее, используя следующий код:

Shell32.Shell shell = new Shell32.Shell();
((Shell32.Folder2)shell.NameSpace("X:")).Self.Name = "Friendly Label";

Со ссылкой на COM --> Microsoft Shell Controls and Automation. Это в основном представление С# старого кода VBS, которое у меня было.

Set oShell = CreateObject("Shell.Application")
oShell.NameSpace("X:").Self.Name = "Friendly Label"

Однако разница в том, что реализация NameSpace на C# по какой-то причине возвращает объект папки, в то время как все реализации VB возвращают объект папки2. Только папка2 имеет свойство «Я», поэтому требуется дополнительное приведение.

Кроме того, как было указано в одном из комментариев, это работает только в STA-квартире, поэтому метод Main() должен быть украшен [STAThread].

Я надеюсь, что отвечать на такие старые вопросы не является плохой практикой, но я был очень расстроен тем, что нигде не нашел решения для этого.

person Syberdoor    schedule 11.12.2014
comment
Давать ценные ответы на старые, оставшиеся без ответа вопросы ни в коей мере не является плохой практикой. :) - person Henrik Aasted Sørensen; 11.12.2014
comment
Обратите внимание, что это работает только в квартире STA, поэтому, чтобы использовать это, вы должны украсить метод Main() с помощью [STAThread] - person Matthew Watson; 28.08.2015
comment
Это работает очень хорошо для установки новой метки. К сожалению, похоже, что он не может сбросить сетевой диск до его исходной метки. По крайней мере, не с нулем или пустой строкой. В проводнике Windows его можно сбросить, переименовав в пустую строку. Любые идеи, как это сделать с этим кодом? - person CodeX; 31.01.2017
comment
@CodeX Я не смог это воспроизвести. В моих тестах он работает как в vbscript, так и в С#, предоставляя пустую строку - person Syberdoor; 31.01.2017
comment
Я получаю InvalidCastException с C#, есть идеи, почему я не могу преобразовать его в Shell32.Folder2? - person Matt; 08.01.2019

Вам следует использовать API SetVolumeLabel.

По сути, «имя» диска, на которое вы ссылаетесь, называется меткой тома. Вы можете P/Invoke API и изменить его таким образом.

Чтобы получить расширенную информацию об ошибке, вы можете использовать GetLastError.

person Daniel Walker    schedule 16.08.2011
comment
Это не работает. Устройство не позволяет мне изменить метку тома. - person apaka; 16.08.2011
comment
Не могли бы вы быть более конкретным? Я использовал API, поэтому знаю, что он работает. Вы получаете сообщение об ошибке? - person Daniel Walker; 16.08.2011
comment
Под именем я имел в виду имя, которое отображает проводник. Имя тома не проблема, и его нельзя изменить, оно жестко запрограммировано в драйвере устройства. Меня интересует переименование «Отключенный сетевой диск» во что-то другое. - person apaka; 16.08.2011

System.IO.DriveInfo имеет свойство VolumeLabel, который позволяет изменить метку томов. Ознакомьтесь с исключениями и примечаниями к VolumeLabel, чтобы увидеть требования к переименованию тома.

Похоже, вы не можете напрямую переименовать UNC, если не сопоставите его как сетевой диск. Вы также можете создать ярлык для UNC и переименовать его.

person The Moof    schedule 16.08.2011