Нужен совет по программе доступа к диску - PullRequest
2 голосов
/ 18 ноября 2011

Я представляю программу, которую мне нужно будет написать, и мне понадобятся советы по языку.Мне нужно будет получить доступ к сырому диску, чтобы я мог отображать шестнадцатеричные данные, прокручивать или прыгать по диску и выполнять вычисления на основе данных.Я больше всего использую Java, и его переносимость между операционными системами для других моих проектов, безусловно, является преимуществом, но доступ к сырым дискам либо невозможен, либо потребует JNI, либо возможен в * nix, когда вы можете обращаться к дискам как к «файлам».».Я продолжаю читать разные вещи.Кстати, я могу справиться с этим типом работы с помощью файлов в Java, но в этом проекте мне нужно иметь возможность доступа к диску, чтобы не требовалось заранее создавать образы дисков для файлов.

Было бы неплохосделайте его настолько портативным, насколько это возможно, поскольку использование различных ОС дает реальную выгоду, но оно может не стоить того, и я должен просто придерживаться Windows и родного языка компиляции.Есть ли какой-нибудь существующий код JNI, который может помочь?У меня есть опыт работы с другими языками, но я давно не пользовался C ++.Должен ли я забыть о Java и попробовать C #?Кто-то сказал мне, что в Python есть библиотеки, доступные для такого типа вещей, несмотря на то, что это интерпретируемый язык, так что насчет Python?Что будет лучше для проекта?Что мне было бы полезно узнать?

Поиск свободного доступа к диску, Java, Python, похоже, не дает никаких полезных результатов.Спасибо за любую помощь!

РЕДАКТИРОВАТЬ Кажется, что это будет довольно сложно, узнать то, что мне нужно знать, а затем узнать это.Жаль, что вместо этого я не смог бы использовать образы дисков, потому что тогда я мог бы сразу же начать работать над ним на Java, что мне удобно, и я знаю, что смогу сделать хороший продукт.Я получил большую пропускную способность в других проектах обработки необработанных данных на Java, так что меня это не беспокоит.Плюс это было бы действительно портативно.Хм, возможно, придется рассмотреть это больше.Возможно, мне понадобится большая система хранения azz для хранения всех изображений:)

ОБНОВЛЕНИЕ Просто примечание для любого, кто найдет этот вопрос ... Я понял, что это работает простоуказав диск для файла с помощью нотации PhysicalDrive (в Windows), как ответ ниже hunsricker.Однако есть некоторые проблемы.Во-первых, если вы делаете проверку «существует» File.exists (), он говорит, что файл не существует.Кроме того, размер файла равен нулю, и когда я получаю «java.io.IOException: накопитель не может найти запрошенный сектор», я понимаю, что нахожусь в конце файла.И самое худшее - я получал некоторые странные ошибки времени выполнения, когда читал несколько байтов и пропускал (64) байта в цикле.Я немного изменил свою программу, чтобы прочитать разные суммы, и это изменилось, где произошла ошибка.Я использовал BufferedInputStream вместо RandomAccessFile, как Hunsricker ниже, кстати, не уверен, если это имеет значение.Мой единственный ответ на этот вопрос заключается в том, что, поскольку я работаю с физическим диском, мне не нравится, что я не читаю даже 512-байтовые сектора или блоки по 1 КБ или около того.Действительно, когда я читаю даже 1 КБ, 2 КБ, 512 байт и т. Д. И ничего не пропускаю, все работает нормально и работает до конца.Ошибки, которые я видел, были java.io.ioexception «неправильная функция» и java.io.ioexception «параметр неверен».Там не было ни рифмы, ни причины для них.Затем я создал файлы изображений с теми же данными и запустил на них свою программу, и она без проблем выполняла бы любую комбинацию чтения и пропуска байтов.Мне кажется, доступ к физическому диску был более требователен.

Ответы [ 2 ]

4 голосов
/ 23 декабря 2011

Я сам искал возможность доступа к необработанным данным физического диска.И теперь, когда я заставил его работать, я просто хочу рассказать вам, как.Вы можете получить доступ к необработанным данным на диске непосредственно из Java ... просто запустите следующий код с привилегиями администратора:

    File diskRoot = new File ("\\\\.\\PhysicalDrive0");
    RandomAccessFile diskAccess = new RandomAccessFile (diskRoot, "r");
    byte[] content = new byte[1024];
    diskAccess.readFully (content);

Таким образом, вы получите первый КБ вашего первого физического диска в системе.Чтобы получить доступ к логическим дискам - как упомянуто выше - просто замените «PhysicalDrive0» на букву диска, например «D:»

о да ... Я пробовал с Java 1.7 в системе Win 7 ...

RageDs связывают меня с решением ... спасибо: -)

0 голосов
/ 18 ноября 2011

Доступ к диску будет зависеть от конкретных драйверов диска.И поскольку это задача низкого уровня, я сомневаюсь, что Java / Python будет иметь такую ​​поддержку (эти языки обычно используются для быстрой высокоуровневой разработки программного пакета).Поскольку вы, вероятно, не будете знать о конкретных аппаратных реализациях дисков, вам, вероятно, придется использовать API операционной системы (который, конечно, зависит от ОС).Я бы порекомендовал изучить C и / или конкретный язык ассемблера для архитектуры, над которой вы планируете выполнять эту работу.Затем я бы порекомендовал продолжить поиск, чтобы найти соответствующий API для вашей целевой ОС.

РЕДАКТИРОВАТЬ

Для Windows хорошее место для запуска - здесь.В частности, MSDN CreateFile () , вероятно, будет интересна вам.

...