238 lines
8.5 KiB
Python
238 lines
8.5 KiB
Python
from stdint import *
|
|
import fat32 as fs
|
|
import fat32_types as types
|
|
import fat32_part as part
|
|
import fat32_mkfs as mkfs_mod
|
|
import t, c
|
|
|
|
|
|
def print_fresult(res: types.FRESULT, msg: t.CConst) -> t.CInt:
|
|
if res == types.FRESULT.FR_OK:
|
|
print(f"[成功] {msg}")
|
|
return 0
|
|
else:
|
|
print(f"[失败] {msg}: {res}")
|
|
return -1
|
|
|
|
|
|
def print_fresult_void(res: types.FRESULT, msg: t.CConst):
|
|
print_fresult(res, msg)
|
|
|
|
|
|
def example_main() -> t.CInt:
|
|
print("=== FAT32 文件系统完整示例 ===")
|
|
print()
|
|
|
|
# 1. 扫描可用驱动器
|
|
print("--- 1. 扫描可用驱动器 ---")
|
|
res: types.FRESULT = fs.scan_drives()
|
|
print_fresult_void(res, "扫描驱动器")
|
|
|
|
drive_count: t.CInt = fs.get_drive_count()
|
|
print(f"找到 {drive_count} 个驱动器")
|
|
i: t.CInt
|
|
for i in range(drive_count):
|
|
letter: t.CChar = fs.get_drive_letter(i)
|
|
part_count: t.CInt = fs.get_partition_count(letter)
|
|
print(f" 驱动器 {i}: {letter}")
|
|
for j in range(part_count):
|
|
is_fat32: t.CInt = fs.is_partition_fat32(letter, j)
|
|
print(f" 分区 {j}: FAT32={is_fat32}")
|
|
print()
|
|
|
|
# 2. 挂载文件系统
|
|
print("--- 2. 挂载文件系统 ---")
|
|
res = fs.mount()
|
|
if print_fresult(res, "挂载文件系统") != 0:
|
|
print("提示: 可能需要先格式化磁盘")
|
|
print()
|
|
|
|
# 3. 文件系统信息
|
|
print("--- 3. 文件系统信息 ---")
|
|
mounted: t.CInt = fs.is_mounted()
|
|
print(f"已挂载: {mounted}")
|
|
if mounted:
|
|
total_clusters: t.CUInt32T = fs.get_total()
|
|
free_clusters: t.CUInt32T = fs.get_free()
|
|
cluster_size: t.CUInt32T = fs.get_cluster_size()
|
|
total_bytes: t.CUInt64T = t.CUInt64T(total_clusters) * t.CUInt64T(cluster_size)
|
|
free_bytes: t.CUInt64T = t.CUInt64T(free_clusters) * t.CUInt64T(cluster_size)
|
|
print(f"总簇数: {total_clusters}")
|
|
print(f"空闲簇数: {free_clusters}")
|
|
print(f"簇大小: {cluster_size} 字节")
|
|
print(f"总大小: {total_bytes} 字节")
|
|
print(f"空闲大小: {free_bytes} 字节")
|
|
print()
|
|
|
|
# 4. 元数据操作
|
|
print("--- 4. 元数据操作 ---")
|
|
fs.set_metadata(0x12345678)
|
|
metadata: t.CUInt32T = fs.get_metadata()
|
|
print(f"设置的元数据: 0x{metadata:08X}")
|
|
print()
|
|
|
|
# 5. 获取 FAT 时间
|
|
print("--- 5. 获取 FAT 时间 ---")
|
|
fattime: t.CUInt32T = fs.get_fattime()
|
|
print(f"当前 FAT 时间: 0x{fattime:08X}")
|
|
print()
|
|
|
|
# 6. 目录操作
|
|
if fs.is_mounted():
|
|
print("--- 6. 目录操作 ---")
|
|
|
|
# 创建目录
|
|
res = fs.mkdir("/test_dir_1")
|
|
print_fresult_void(res, "创建目录 /test_dir_1")
|
|
|
|
res = fs.mkdir("/test_dir_1/subdir")
|
|
print_fresult_void(res, "创建子目录 /test_dir_1/subdir")
|
|
|
|
res = fs.mkdir("/test_dir_2")
|
|
print_fresult_void(res, "创建目录 /test_dir_2")
|
|
print()
|
|
|
|
# 7. 文件操作
|
|
print("--- 7. 文件操作 ---")
|
|
|
|
# 创建并写入文件
|
|
fp1: types.fileobj | t.CPtr = fs.open("/test_dir_1/file1.txt", types.FA_CREATE_ALWAYS | types.FA_WRITE)
|
|
if fp1 is not None:
|
|
test_data1: t.CConst = "Hello, World!"
|
|
written: t.CUInt32T = fs.write(fp1, test_data1, 13)
|
|
print(f"写入文件 /test_dir_1/file1.txt: {written} 字节")
|
|
fs.close(fp1)
|
|
|
|
# 打开追加
|
|
fp2: types.fileobj | t.CPtr = fs.open("/test_dir_1/file1.txt", types.FA_OPEN_ALWAYS | types.FA_WRITE | types.FA_OPEN_APPEND)
|
|
if fp2 is not None:
|
|
test_data2: t.CConst = " Append data!"
|
|
written2: t.CUInt32T = fs.write(fp2, test_data2, 13)
|
|
print(f"追加写入: {written2} 字节")
|
|
fs.close(fp2)
|
|
|
|
# 读取文件
|
|
fp3: types.fileobj | t.CPtr = fs.open("/test_dir_1/file1.txt", types.FA_OPEN_EXISTING | types.FA_READ)
|
|
if fp3 is not None:
|
|
buf: t.CArray[t.CUInt8T, 256]
|
|
read_bytes: t.CUInt32T = fs.read(fp3, t.CVoid(c.Addr(buf[0]), t.CPtr), 256)
|
|
print(f"读取字节数: {read_bytes}")
|
|
print(f"文件内容: {t.CChar(c.Addr(buf[0]), t.CPtr)}")
|
|
|
|
# seek 和 tell
|
|
fs.seek(fp3, 5)
|
|
pos: t.CUInt32T = fs.tell(fp3)
|
|
print(f"seek 到位置 5, 当前位置: {pos}")
|
|
|
|
read_bytes2: t.CUInt32T = fs.read(fp3, t.CVoid(c.Addr(buf[0]), t.CPtr), 256)
|
|
print(f"从位置 5 读取: {t.CChar(c.Addr(buf[0]), t.CPtr)}")
|
|
|
|
# 获取文件大小
|
|
fsize: t.CUInt32T = fs.size(fp3)
|
|
print(f"文件大小: {fsize} 字节")
|
|
|
|
fs.close(fp3)
|
|
|
|
# 创建另一个文件
|
|
fp4: types.fileobj | t.CPtr = fs.open("/test_dir_1/large_file.txt", types.FA_CREATE_ALWAYS | types.FA_WRITE)
|
|
if fp4 is not None:
|
|
large_data: t.CArray[t.CUInt8T, 1024]
|
|
k: t.CInt
|
|
for k in range(1024):
|
|
large_data[k] = t.CUInt8T(ord('A') + (k % 26))
|
|
written3: t.CUInt32T = fs.write(fp4, t.CVoid(c.Addr(large_data[0]), t.CPtr), 1024)
|
|
print(f"创建大文件, 写入: {written3} 字节")
|
|
fs.close(fp4)
|
|
print()
|
|
|
|
# 8. 文件状态和属性
|
|
print("--- 8. 文件状态和属性 ---")
|
|
|
|
info: types.fileinfo
|
|
res = fs.stat("/test_dir_1/file1.txt", info)
|
|
print_fresult_void(res, "获取文件信息")
|
|
if res == types.FRESULT.FR_OK:
|
|
print(f" 文件名: {info.fname}")
|
|
print(f" 大小: {info.file_size} 字节")
|
|
print(f" 属性: 0x{info.attr:02X}")
|
|
print(f" 创建时间: 0x{info.ctime:04X}")
|
|
print(f" 创建日期: 0x{info.cdate:04X}")
|
|
print(f" 修改时间: 0x{info.mtime:04X}")
|
|
print(f" 修改日期: 0x{info.mdate:04X}")
|
|
print(f" 访问日期: 0x{info.adate:04X}")
|
|
|
|
# 修改属性
|
|
res = fs.chmod("/test_dir_1/file1.txt", types.AM_RDO, types.AM_RDO)
|
|
print_fresult_void(res, "设置文件为只读")
|
|
print()
|
|
|
|
# 9. 重命名和移动
|
|
print("--- 9. 重命名和移动 ---")
|
|
|
|
res = fs.rename("/test_dir_1/file1.txt", "/test_dir_1/renamed.txt")
|
|
print_fresult_void(res, "重命名文件")
|
|
|
|
res = fs.move("/test_dir_1/renamed.txt", "/test_dir_2/moved.txt")
|
|
print_fresult_void(res, "移动文件")
|
|
|
|
res = fs.rename("/test_dir_2", "/test_dir_renamed")
|
|
print_fresult_void(res, "重命名目录")
|
|
print()
|
|
|
|
# 10. 列出目录
|
|
print("--- 10. 列出目录 ---")
|
|
|
|
dp: types.dirobj
|
|
res = fs.opendir("/", dp)
|
|
if res == types.FRESULT.FR_OK:
|
|
print("根目录内容:")
|
|
dir_info: types.fileinfo
|
|
while True:
|
|
res = fs.readdir(dp, dir_info)
|
|
if res != types.FRESULT.FR_OK:
|
|
break
|
|
attr_str: t.CConst = ""
|
|
if dir_info.attr & types.AM_DIR:
|
|
attr_str = attr_str + "D"
|
|
else:
|
|
attr_str = attr_str + "F"
|
|
if dir_info.attr & types.AM_RDO:
|
|
attr_str = attr_str + "R"
|
|
if dir_info.attr & types.AM_HID:
|
|
attr_str = attr_str + "H"
|
|
if dir_info.attr & types.AM_SYS:
|
|
attr_str = attr_str + "S"
|
|
if dir_info.attr & types.AM_ARC:
|
|
attr_str = attr_str + "A"
|
|
print(f" [{attr_str}] {dir_info.fname} ({dir_info.file_size} 字节)")
|
|
fs.closedir(dp)
|
|
print()
|
|
|
|
# 11. 删除文件和目录
|
|
print("--- 11. 删除文件和目录 ---")
|
|
|
|
res = fs.remove("/test_dir_renamed/moved.txt")
|
|
print_fresult_void(res, "删除文件")
|
|
|
|
res = fs.remove("/test_dir_1/large_file.txt")
|
|
print_fresult_void(res, "删除大文件")
|
|
|
|
res = fs.rmdir("/test_dir_1/subdir")
|
|
print_fresult_void(res, "删除子目录")
|
|
|
|
res = fs.rmdir("/test_dir_1")
|
|
print_fresult_void(res, "删除目录 /test_dir_1")
|
|
|
|
res = fs.rmdir("/test_dir_renamed")
|
|
print_fresult_void(res, "删除目录 /test_dir_renamed")
|
|
print()
|
|
|
|
# 12. 卸载文件系统
|
|
print("--- 12. 卸载文件系统 ---")
|
|
res = fs.unmount()
|
|
print_fresult_void(res, "卸载文件系统")
|
|
print()
|
|
|
|
print("=== 示例完成 ===")
|
|
return 0
|