Когда я использую System.IO.DriveInfo.GetDrives()
и посмотрите на .VolumeLabel
свойство одного из дисков, я вижу "PATRIOT XT", который является действительно меткой тома диска.
Если я открываю "My Computer", вместо этого я вижу "Диск Путешественника TrueCrypt", и я, может казаться, не нахожу способа программно получить то значение как ни один из DriveInfo
свойства содержат то значение. Я также пытался запросить информацию через WMI Win32_LogicalDisk
, но никакие свойства не содержали то значение там также.
Таким образом, какую-либо идею, что использует маркировать My Computer, называют, и что еще более важно, как программно получить его?
Править: Чтобы быть ясным, вот, код, который я использую, сопровождаемый тем, что он производит, сопровождаемый тем, что я вижу в Своем Компьютере (который является тем, что я хочу копировать):
foreach (DriveInfo DI in DriveInfo.GetDrives())
richTextBox1.AppendText(
(
DI.IsReady ?
(DI.VolumeLabel.Length == 0 ? DI.DriveType.ToString() : DI.VolumeLabel) :
DI.DriveType.ToString()
)
+
" (" + DI.Name.Replace("\\", "") + ")"
+ Environment.NewLine
);
Removable (A:) Fixed (C:) CDRom (D:) PATRIOT XT (E:) Backup (Y:) Data (Z:)
Мой Компьютер детализирует дисплеи представления:
Floppy Disk Drive (A:) Local Disk (C:) DVD RW Drive (D:) TrueCrypt Traveler Disk (E:) Backup (Y:) Data (Z:)
Похоже, Мой компьютер просматривает autorun.inf и использует значение label = из раздела [autorun].
До сих пор не совсем уверен, откуда берутся ярлыки «DVD RW Drive» и «Floppy Disk Drive», но я предполагаю, что они могут быть жестко закодированы в зависимости от типа привода.
Надеюсь, вам поможет следующее:
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
static extern bool GetVolumeInformation(string Volume,
StringBuilder VolumeName, uint VolumeNameSize,
out uint SerialNumber, out uint SerialNumberLength, out uint flags,
StringBuilder fs, uint fs_size);
private void Form1_Load(object sender, EventArgs e)
{
uint serialNum, serialNumLength, flags;
StringBuilder volumename = new StringBuilder(256);
StringBuilder fstype = new StringBuilder(256);
bool ok = false;
Cursor.Current = Cursors.WaitCursor;
foreach (string drives in Environment.GetLogicalDrives())
{
ok = GetVolumeInformation(drives, volumename, (uint)volumename.Capacity - 1, out serialNum,
out serialNumLength, out flags, fstype, (uint)fstype.Capacity - 1);
if (ok)
{
lblVolume.Text = lblVolume.Text + "\n Volume Information of " + drives + "\n";
lblVolume.Text = lblVolume.Text + "\nSerialNumber of is..... " + serialNum.ToString() + " \n";
if (volumename != null)
{
lblVolume.Text = lblVolume.Text + "VolumeName is..... " + volumename.ToString() + " \n";
}
if (fstype != null)
{
lblVolume.Text = lblVolume.Text + "FileType is..... " + fstype.ToString() + " \n";
}
}
ok = false;
}
Cursor.Current = Cursors.Default;
}
Я сам не пробовал это , но в реестре найдите
HKLM/Software/Microsoft/Windows/CurrentVersion/Explorer/DriveIcons/[Drive-Letter]/
, затем прочтите ключ
DefaultLabel
. Также ВНИМАНИЕ! запись неверных ключей / значений в реестр может серьезно повредить вашу систему! Прежде чем продолжить, убедитесь, что вы уверены в том, что делаете. Это ресурс, который поможет вам получить программный доступ к реестру.
Он находится в папке autorun.inf. Моя метка тома для моей флешки просто 16 ГБ, но поместив файл autorun.inf со следующим текстом [автозапуск] label = Мой 16-гигабайтный флеш-накопитель
, а затем используя attrib для + s + h + r файла, он не отображается, если у меня нет показать скрытые файлы И показать системные файлы в параметрах папки / просмотр включен.
Чтобы найти это программно через C #, я, честно говоря, не пытался открыть autorun.inf, но это должно быть прямо, проверьте, игнорирует ли File.Exists (Drive: \ autorun.inf) тот факт, что это + s + h + r (на всякий случай, если кто-то его установил), то откройте его только для чтения и проанализируйте строку label =. Если на самом деле файл присутствует, используйте метку автозапуска вместо Этикетка тома.
Я все еще могу изменить использование тега autorun.inf label = даже в Windows 7 для изменения метки.