FATtools
v.1.0.39
使用pip install FATtools
(更简单)从 PyPI 安装或从此处下载源代码(或已发布的软件包)。
它的诞生是为了重新排序 FAT32 根表中的目录条目,以应对某些硬件 MP3 播放器的限制,现在在 Python 3(32 位和 64 位)中为 FAT12/16/32 和 exFAT 提供完整的读/写支持文件系统,用于黑客攻击和恢复目的。
而且:
实现了以下功能(主要是在 Python 中,通过一些 ctypes 调用来本地处理 Win32 磁盘;不定期测试与 Linux 的兼容性):
显然,由于文件系统是一个极其复杂和微妙的问题,并且可能存在大错误,因此您将完全自行承担使用它的风险!但现在看起来相当稳定且可用。
最脆弱的区域(因此容易出现错误)是缓存机制,它以不同的方式运行:
实际上,I/O 速度更接近系统的速度。
代码是 GPL 的(查看 GPL.TXT)。
[1] VHDX 日志支持实际上仅限于重放功能。
[2] 实际上,可以说,可以使用 GPT 对具有 4K 扇区的 8 TB VHDX 进行分区,并使用 FAT32 进行格式化,并在 Windows 11 下愉快地使用它。但是,Windows 11 CHKDSK 报告不超过 4 TB字节(虽然它正确计算簇) )。此外,FORMAT 本身无法将这种合法的 FAT32 格式应用于 8 TB 磁盘。
该软件包安装了一个fattools
脚本,您可以使用它来执行简单的命令行操作。
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
请注意,如果出现以下情况,生成的图像大小可能会减小: 1) 卷已进行碎片整理; 2)目录表被清理和收缩; 3) 可用空间之前已被擦除(清零)。
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)
请查看“samples”目录以获取更多使用示例。