Я должен написать код для доступа к скрытым разделам диска / томам, используя c # или c ++.
Но не смог найти справочную справку по этому вопросу.
Как скрытый том, он не содержит буквы диска, поэтому вы не можете просто набрать «C: \» и получить к нему доступ.
Примером может служить «раздел восстановления», который поставляется с Windows. Вы не можете увидеть его на проводнике, но он есть.
Мое приложение будет записывать и считывать данные из разделов thoose, и мне нужно найти способ сделать что-то вроде «c: \» для thoose.
На изображении выше тома 5 и 6 являются скрытыми разделами.
Я нашел эту ссылку на stackoverflow, но это только «список» разделов:
https://msdn.microsoft.com/en-us/library/cc542456(v=VS.85).aspx
РЕДАКТИРОВАТЬ
Проблема в том, что даже при использовании WMI, как предполагалось, я не мог найти, как отфильтровать том при поиске файлов.
Пример, select * from win32_DataFile
перечислит все файлы в машине.
Я думаю, что должен быть способ фильтрации томов по их идентификатору (или имени).
Что-то вроде:
select * from win32_DataFile
where volumeId = '\\?\Volume{2d5f3a68-75f5-44c4-aa42-716b45811916}\'
Или более красивый способ, как:
var files = Directory.GetFiles(@"\\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\");
Кроме того, я нашел отличную новость о разделах и томах (это не одно и то же)
https://social.technet.microsoft.com/Forums/en-US/e7b2ddd6-f245-49ed-8fec-3b6e08e75369/how-do-i-find-the-partition-guid?forum=winservergen
EDIT2
По словам Гарри, использование «\. \ Volume ….» было хорошим способом восстановления файлов. Но я не смог найти способ написать (создать) новый файл, используя c #.
Наилучшим подходом на данный момент является использование pinvoke для метода / дескриптора c ++ CreateFile.
Любой совет?
API FindFirstVolume () возвращает путь к корню каждого тома в системе.
Например, этот код печатает путь к первому тому и имя первого файла в корневом каталоге этого тома:
HANDLE h1, h2;
wchar_t volpath[4096];
WIN32_FIND_DATA find_data;
h1 = FindFirstVolume(volpath, _countof(volpath));
printf("%ws\n", volpath);
wcscat_s(volpath, _countof(volpath), L"*.*");
h2 = FindFirstFile(volpath, &find_data);
printf("%ws\n", find_data.cFileName);
(В рабочем коде вам нужно добавить проверку ошибок и т. Д.)
добавление
FindFirstVolume возвращает путь следующим образом: \\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\
Если вы используете Win32 API (CreateFile и т. Д.) В C ++, вы можете использовать этот путь напрямую, но из-за ошибки или ограничения в .NET он не работает с классами управления файлами, такими как Directory.GetFiles (). (Конечно, вы можете использовать P / Invoke для Win32 API, но это неудобно.)
Вместо этого вы можете обойти проблему, заменив знак вопроса, который появляется в начале пути, точкой:
var files = Directory.GetFiles(@"\\.\Volume{6ff7748e-78db-4838-8896-254b074918f5}\");
Если ваша программа предназначена для Windows, вы можете работать с WMI. Я много работал с WMI, и это очень удобно — делать какие-либо манипуляции или получать данные о системах Windows.
Прежде всего вы можете скачать wmiexplorer, чтобы увидеть доступные данные и классы. соответствующее пространство имен для вас будет root\cimv
, Там вы можете найти различные интересные занятия для вас:
Затем вы можете реализовать желаемые запросы WMI в вашей программе на C # (или VB.NET). Например, этот напечатает все диски:
WqlObjectQuery wqlQuery = new WqlObjectQuery("SELECT * FROM Win32_LogicalDisk");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wqlQuery);
foreach (ManagementObject disk in searcher.Get())
{
Console.WriteLine(disk.ToString());
}
Как вы можете видеть, WMI поддерживает такие запросы, как SQL (хотя он не такой мощный …)
WMI также поддерживает методы для большинства классов ist. Например, вы можете проверить каждый диск на наличие ошибок:
foreach (ManagementObject disk in searcher.Get())
{
if(shouldCheckThisDisk)
disk.Chkdsk();
}