Instale a partir do PyPI usando pip install FATtools
(mais fácil) ou baixando o código-fonte (ou os pacotes lançados) aqui.
Criado para reordenar entradas de diretório em uma tabela raiz FAT32 para lidar com os limites de alguns reprodutores de MP3 de hardware, ele agora fornece suporte completo de leitura/gravação em Python 3 (32 e 64 bits) para FAT12/16/32 e exFAT sistemas de arquivos, para fins de hacking e recuperação.
Além disso:
Os seguintes recursos são implementados (principalmente em Python, com algumas chamadas ctypes para lidar nativamente com discos Win32; a compatibilidade com Linux não é testada regularmente):
Obviamente, como um sistema de arquivos é um assunto extremamente complexo e delicado, e grandes bugs podem estar presentes, você o usará TOTALMENTE POR SUA PRÓPRIA CONTA E RISCO! Mas parece bastante estável e utilizável agora.
A área mais frágil (e, portanto, sujeita a bugs) foi o mecanismo de cache, que opera de diferentes maneiras:
Na verdade, a velocidade de E/S está mais próxima da do sistema.
O código é GPL (veja GPL.TXT).
[1] O suporte ao log VHDX é, na verdade, limitado à capacidade de reprodução.
[2] Na verdade, para dizer, pode-se particionar com GPT um VHDX de 8 TB com setores 4K e formatar com FAT32 e usá-lo com prazer no Windows 11. No entanto, o CHKDSK do Windows 11 relata não mais do que 4 TB bytes (embora conte clusters corretamente ). Além disso, o próprio FORMAT não pode aplicar esse formato FAT32 legítimo a um disco de 8 TB.
O pacote instala um script fattools
, você pode usá-lo para executar operações simples de linha de comando.
fattools mkvdisk -s 8T --large-sectors image.vhdx
fattools mkfat -t exfat -p gpt image.vhdx
fattools mkvdisk -b image.vdi delta.vdi
fattools wipe image.vhd
fattools imgclone image.raw image.vhd
Observe que o tamanho da imagem resultante pode ser reduzido se: 1) o(s) volume(s) estiver(em) desfragmentado(s); 2) as tabelas de diretórios são limpas e reduzidas; 3) o espaço livre foi apagado (zerado) antes.
fattools imgclone \.PhysicalDrive2 image.vhd
fattools ls image1.vhd/py* image2.vdi/py*
fattools cp C:Python39Libsite-packages image.vhd/Python39/Lib
fattools cp image.vhd/Python39 C:ProgramData
fattools cat image.vhd/readme.txt
fattools rm image.vhd/Python39
# -*- coding: cp1252 -*-
from FATtools.Volume import *
disk = vopen('MyDiskImage.img', 'r+b', 'disk')
from FATtools import partutils
gpt = partutils.partition(disk)
from FATtools import mkfat, Volume
part = Volume.vopen('MyDiskImage.img', 'r+b', 'partition0')
mkfat.exfat_mkfs(part, part.size)
fattools reordergui
# -*- coding: cp1252 -*-
from FATtools.Volume import *
# Assuming we have DirA, DirB, DirC in this disk order into X:
root = vopen('X:', 'r+b')
new_order = '''DirB
DirC
DirA'''
root._sortby.fix = new_order.split('n') # uses built-in directory sort algorithm
root.sort(root._sortby) # user-defined order, in _sortby.fix list
root.sort() # default ordering (alphabetical)
# -*- coding: cp1252 -*-
from FATtools.Volume import vopen, vclose
from FATtools.mkfat import exfat_mkfs
from os.path import join
import os
real_fat_fs = 'F:' # replace with mount point of your file system
# Open and format with FATtools
fs = vopen(real_fat_fs, 'r+b',what='disk')
exfat_mkfs(fs, fs.size)
vclose(fs)
# Write some files with Python and list them
T = ('c','a','b','d')
for t in T:
open(join(real_fat_fs, t+'.txt'), 'w').write('This is a sample "%s.txt" file.'%t)
print(os.listdir(real_fat_fs+'/'))
# Open again, and sort root with FATtools
fs = vopen(real_fat_fs, 'r+b')
fs.sort()
vclose(fs)
# Check new table order with Python
print(os.listdir(real_fat_fs+'/'))
# -*- coding: cp1252 -*-
from FATtools.Volume import vopen, vclose
from FATtools.mkfat import exfat_mkfs
from FATtools.partutils import partition
# Open & create GPT partition
o = vopen('\\.\PhysicalDrive1', 'r+b',what='disk')
print('Partitioning...')
partition(o, 'mbr')
vclose(o)
# Reopen and format with EXFAT
o = vopen('\\.\PhysicalDrive1', 'r+b',what='partition0')
print('Formatting...')
exfat_mkfs(o, o.size)
vclose(o) # auto-close partition AND disk
# Reopen FS and write
print('Writing...')
o = vopen('\\.\PhysicalDrive1', 'r+b')
# Write some files with FATtools and sort them
T = ('c','a','b','d')
for t in T:
f = o.create(t+'.txt')
f.write(b'This is a sample "%s.txt" file.'%bytes(t,'ascii'))
f.close()
o.sort()
vclose(o)
Por favor, procure dentro do diretório 'samples' para mais exemplos de uso.