2010-09-20 2 views
23

Как создать виртуальный жесткий диск (например, Z :), который хранит его файлы на физическом жестком диске (например, C: \ Files).создание виртуального жесткого диска

+1

При написании драйвера устройства. Что-то, что вы не можете сделать с C#. – dtb

+0

Не эксперт, но похоже, что вам нужно работать на уровне ядра с помощью DDK. – LatinSuD

+2

@dtv & LatinSuD, это определенно не требует создания виртуальной файловой системы, вы можете легко сопоставить диск с локальными путями. – mikerobi

ответ

42

Здесь C# код, чтобы сделать это непосредственно: использование

using System; 
using System.Text; 
using System.ComponentModel; 
using System.Runtime.InteropServices; 

static class Subst { 
    public static void MapDrive(char letter, string path) { 
     if (!DefineDosDevice(0, devName(letter), path)) 
      throw new Win32Exception(); 
    } 
    public static void UnmapDrive(char letter) { 
     if (!DefineDosDevice(2, devName(letter), null)) 
      throw new Win32Exception(); 
    } 
    public static string GetDriveMapping(char letter) { 
     var sb = new StringBuilder(259); 
     if (QueryDosDevice(devName(letter), sb, sb.Capacity) == 0) { 
      // Return empty string if the drive is not mapped 
      int err = Marshal.GetLastWin32Error(); 
      if (err == 2) return ""; 
      throw new Win32Exception(); 
     } 
     return sb.ToString().Substring(4); 
    } 


    private static string devName(char letter) { 
     return new string(char.ToUpper(letter), 1) + ":"; 
    } 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern bool DefineDosDevice(int flags, string devname, string path); 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern int QueryDosDevice(string devname, StringBuilder buffer, int bufSize); 
} 

Пример:

 Subst.MapDrive('z', @"c:\temp"); 
     Console.WriteLine(Subst.GetDriveMapping('z')); 
     Subst.UnmapDrive('z'); 
+0

работает в Windows 10? не может заставить его работать – Kubi

+0

Если пользователь передает букву диска на жестком диске, 'sb' будет содержать что-то вроде' \ Device \ HarddiskVolume2', а 'Substring (4)' будет в основном возвращать мусор. Я бы посоветовал убедиться, что 'sb' начинается с' @ "\ ?? \" 'перед возвратом' Substring (4) '. Если он начинается с чего-то другого, '' '' (то же самое, что вы возвращаете, если диск вообще не существует) кажется разумным значением для возврата - нет никакого диска SUBSTed, чтобы получить путь. –

+0

@Hans Passant: указанный выше код не будет отображаться при запуске приложения под правами администратора. то есть «Run As Admin» также попробовал его в Windows 8 и Windows 10, но без прав администратора он будет показывать ожидаемые результаты, вопрос, связанный с объектом здесь, оценивает, если вы посмотрите https: // stackoverflow .com/д/46663368/323339 –

10

Вы можете использовать команду subst. Используйте System.Diagnostic.Process для запуска subst.exe с требуемыми параметрами.

Вот синтаксис команды:

Синтаксис

Связывает путь с буквой диска.

SUBST [drive1: [drive2:]path] 
SUBST drive1: /D 

drive1: Определяет виртуальный диск к который вы хотите назначить путь.

[drive2:] path Указывает физический привод и путь , который вы хотите назначить виртуальному диску .

/D Удаляет замененный (виртуальный) диск.

Введите SUBST без параметров, чтобы отобразить список текущих виртуальных дисков.list текущих виртуальных дисков .

+1

Просто, чтобы вы знали, возможно, это самые простые методы. Однако перезагрузка компьютера вернет mount и удалит виртуальный диск и вернет все в норму. Если вы добавите запись в файл autoexec.bat, виртуальный диск можно сохранить во время перезапуска. –

+0

@ Ranhiru, вы правы, виртуальный диск будет возвращен при каждой загрузке. Легкое решение состоит в том, что программа будет вызывать команду subst при каждом запуске. –

+0

В Windows 7/64, что лучший способ сделать постоянный «суб», который будет отображаться всеми процессами? – supercat

1

Сделайте это точно так же, как и на карте сетевого диска, но укажите его в папку на текущей машине. Единственное, что вам нужно сделать, это использовать UNC-путь для локальной папки.

Вот helper class

-1

Не знаю, как сделать это в C#, но это должно помочь вам:

Ive просто проверил это и работает отлично

На моем компьютере есть один жесткий диск разработаны в 2, C: D:, переходя в D: У меня есть папка под названием «Резервное копирование», если вы щелкните правой кнопкой мыши по папке и щелкните вкладку Share, вы увидите Network Path .. На моем компьютере это выглядит как \\Robert-home\backup

Затем я приступил к CMD и выполнил следующую команду

NET USE Z: \\Robert-home\backup 

Witch успешно отображения содержимого D:\backup в Z:

Я уверен, что вы можете выполнить такую ​​задачу в C# ..

Обычно я использую этот метод для поддержки клиентов для передачи и резервного копирования файлов до того, как им выдадут новые консоли.

Смежные вопросы