Найти - Пользователи
Полная версия: Необходимо отформатировать usb-флэш и стереть остаточные файлы
Начало » Python для экспертов » Необходимо отформатировать usb-флэш и стереть остаточные файлы
1 2
AleksandrTihomolov
Товарищи, гуру Phyton-а, у меня есть два задания, необходимо отформатировать usb-флэш и стереть остаточные файлы, не затирая имеющиеся, подскажите пожалуйста каким образом это делается, в phyton я не особо силен, писал только на си с плюсами, заранее благодарен за вашу непосильную помощь!)
PEHDOM
AleksandrTihomolov
необходимо отформатировать usb-флэш и стереть остаточные файлы, не затирая имеющиеся
Вам не кажеться что тут присутвуют взаимоисключающие параграфы? какие имеющиеся файлы могут быть после форматирования?
Что в вашем понимании “остаточные файлы”? вы имеете ввиду данные котороые остаются в ячейках памяти при форматировании или создании\удалении таблицы разделов?
Нужно ли это делать на чистом пайтоне или можно вызывать сторонние программы, например dd, fdisk или mkfs?
Какая ОС?
например такой код заполнит нулями весь диск под линуксами..
 import io
block = b'\0' * 4096
with io.FileIO('/dev/sdb', 'w') as f:
    while f.write(block):
        pass

AleksandrTihomolov
PEHDOM
Имеется ввиду два разных варианта, как две разные функции программы, одно - это форматирование, а другое - удаление мусора (ранее удаленных файлов) без затирания имеющихся файлов (скорее всего файлы должны копироваться в другую область на системе, после форматироваться диск (как это было указано Вами), а затем из области памяти, в которую были скопированы файлы, произвести запись файлов на диск (с этой процедурой я тоже пока не разобрался)). Что касается ОС, на данном этапе - это линукс, а в перспективе поддержка также виндоус. Спасибо за ответ!
py.user.next
AleksandrTihomolov
Что касается ОС, на данном этапе - это линукс, а в перспективе поддержка также виндоус.
У тебя должно быть реализовано два разных алгоритма. Можно, конечно, сделать одну программу с двумя реализациями, но лучше сделать отдельные версии программы для разных систем. При росте количества систем это имеет значение.

У меня была такая программа, которая старалась учитывать все системы, но в итоге чем дальше её пишешь, тем больше различий. Получается так, что у тебя в одной системе в программе хранится куча ненужного кода для другой системы. Она стала быстро превращаться в свалку и в итоге я её разделил на две версии. После этого каждая из них получилась чистая и одна вообще стала не нужна, потому что практически не используется.

PEHDOM
 block = b'\0' * 4096
  
>>> bytes(5)
b'\x00\x00\x00\x00\x00'
>>>
Rodegast
> скорее всего файлы должны копироваться в другую область на системе, после форматироваться диск (как это было указано Вами), а затем из области памяти, в которую были скопированы файлы, произвести запись файлов на диск

Всё намного проще. Создаёшь файл заполненный нулями, нули в него копируются пока не кончится место на флешки, после этого файл удаляется.

> block = b'\0' * 4096

А почему 4096? Размер блока зависит от ФС, по этому его надо смотреть через os.statvfs.
PEHDOM
AleksandrTihomolov
удаление мусора (ранее удаленных файлов) без затирания имеющихся файлов (скорее всего файлы должны копироваться в другую область на системе, после форматироваться диск (как это было указано Вами), а затем из области памяти, в которую были скопированы файлы, произвести запись файлов на диск (с этой процедурой я тоже пока не разобрался))
ну скопировать-очистить-отформатировать-скопироватьназад это самый простой способ, он годиться если вам нужно делать такие операции достаточно редко. Минус такого подхода, при сбоях в работе программы\компьютера все данные могут потеряться, нужно думать о защите а-ля транзакции при копировании туды-сюды.

Альтернативный вариант работа напрямую с “сырыми” данными на диске. У каждой ФС свои тараканы, но грубо говоря читаем байты прямо с диска, находим служебные области, анализируем их, понимаем где хранятся файлы-папки, а где “пустое место”, и пустое место забиваем нулями. Тоесть вам нужно понимать, как устроена та или иная ФС. Причем понимать на очень глубоком уровне, вплоть до того за что отвечает каждый байт. Наверняка существуют уже готовые модули для низкоуровневой работы с ФС. Возмите для начала fat32, она достаточно простая, про ее устройство написано чуть более чем дофига, и большинство флешек форматируются по умолчанию именно в эти ФС.
Есть уже готовая либа, котороая много чего умеет, можете использовать ее , или как минимум посмотреть как там все устроено https://github.com/maxpat78/FATtools

AleksandrTihomolov
а затем из области памяти, в которую были скопированы файлы, произвести запись файлов на диск (с этой процедурой я тоже пока не разобрался))
ну с этим все просто, гуглите shutil
py.user.next
У тебя должно быть реализовано два разных алгоритма. Можно, конечно, сделать одну программу с двумя реализациями, но лучше сделать отдельные версии программы для разных систем. При росте количества систем это имеет значение.
ИМХО для этого пишутся отдельные модули с идентичными интерфейсами которые подгружаються в зависимости от ОС. И все чисто и понятно.

Rodegast
А почему 4096? Размер блока зависит от ФС, по этому его надо смотреть через os.statvfs
да пофиг,в данном случае мы не ФС чистим а весь диск перед форматированием, 4096 даже мало, уж очень медленно идет запись такими блоками, в идеале нужно выставлять от 4M до 16М а то и 32М.А при работе с ФС, таки да, нужно таки смотреть на размер блока в самой ФС.
Rodegast
> в данном случае мы не ФС чистим а весь диск перед форматированием

Ты его не форматируешь, а именно забиваешь нулями.Вот забьёшь ты его и что дальше? Откуда ФС возьмётся?
PEHDOM
Rodegast
Ты его не форматируешь, а именно забиваешь нулями.Вот забьёшь ты его и что дальше? Откуда ФС возьмётся?
естествено, после этого на диске нету ничего , от слова совсем, потом создаем раздел и форматируем его. можно забить нулями раздел а не весь физический диск, но вобщем на рамер блока это никак не влияет, поскольку оно всеравно потрет все служебные данные, както таблицу FAT\суперблок\MFT и пр.
Rodegast
> после этого на диске нету ничего , от слова совсем, потом создаем раздел и форматируем его.

А тогда какой смысл в данный программе? Проще в терминале вызвать mkfs.vfat и оно отформатирует всё что надо.
py.user.next
PEHDOM
ИМХО для этого пишутся отдельные модули с идентичными интерфейсами которые подгружаються в зависимости от ОС. И все чисто и понятно.
Это теоретически. На практике же всё различается, вплоть до установки в систему, вплоть до хранения конфигурации программы, способов загрузки этой конфигурации в программу. А вывод результатов в какой-нибудь системе может требовать дополнительного специфичного форматирования, переводов. Ну вот пример различия - открытие файла на запись. В винде, например, в текстовом режиме будет ставиться \r\n в конце каждой строки, тогда как такой файл, рассматриваемый потом в лине, будет всё так же содержать эти \r, которых в лине быть не должно. То есть для унификации самого файла между системами в винде файл нужно уже по-другому открывать, чтобы там ничего лишнего не было в итоге. Если будешь всё в одной программе писать, то фактически это будут две отдельные программы, подгружаемые по своим условиям. Вроде так будет всё нормально, но стоит тебе внести изменение в одну программу (добавить фичу или исправить баг), специфичное для её операционной системы, как тут же это изменение запросто зацепит другую программу, потому что у них есть общие части. Общие части живут хорошо, пока не появится такой сюрприз в виде неожиданного бага, который в одной системе глючит вот так, а в другой системе глючит совсем по-другому. Получится, что в одной системе тебе надо эту общую часть одним образом отредактировать, а в другой системе - совсем другим.
Я с этим сталкивался на деле. Очень печально потом сидеть и разделять сначала всё, чтобы просто баг исправить один.

Бывало и так, что баг был только в одной из систем, а код, в котором он был обнаружен, был общим для обеих систем. В итоге и баг исправить надо было, и исправление бага ломало исправный код для другой системы. Как только стало повторяться это несколько раз, пришло понимание, что надо разделить коды. После этого стало всё нормально и разрабатывать стало можно по отдельности для разных систем. Потом просто фичу добавляешь и в одной системе её гоняешь, а для другой системы ничего не надо писать. Когда же коды для двух систем пишутся сразу, то и каждую фичу нужно обязательно для обеих систем подгонять. Это очень затратно по силам: одну фичу добавишь и устанешь, а потом делать уже ничего не хочется. Другое дело, когда можно по отдельности всё делать. Для винды вообще делать ничего не хочется, потому что куча времени уходит на борьбу с глюками винды.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB