SimpleKernel 1.17.0
Loading...
Searching...
No Matches
fatfs::FatFsFileSystem::FatFsFileOps Class Reference

FatFS 文件操作实现 More...

#include <fatfs.hpp>

Inheritance diagram for fatfs::FatFsFileSystem::FatFsFileOps:
Inheritance graph
Collaboration diagram for fatfs::FatFsFileSystem::FatFsFileOps:
Collaboration graph

Public Member Functions

 FatFsFileOps (FatFsFileSystem *fs)
 
auto Read (vfs::File *file, void *buf, size_t count) -> Expected< size_t > override
 从文件读取数据
 
auto Write (vfs::File *file, const void *buf, size_t count) -> Expected< size_t > override
 向文件写入数据
 
auto Seek (vfs::File *file, int64_t offset, vfs::SeekWhence whence) -> Expected< uint64_t > override
 移动文件读写位置
 
auto Close (vfs::File *file) -> Expected< void > override
 关闭文件,释放底层 FIL 对象
 
auto ReadDir (vfs::File *file, vfs::DirEntry *dirent, size_t count) -> Expected< size_t > override
 读取目录条目
 
- Public Member Functions inherited from vfs::FileOps
 FileOps ()=default
 
 FileOps (const FileOps &)=delete
 
 FileOps (FileOps &&)=delete
 
auto operator= (const FileOps &) -> FileOps &=delete
 
auto operator= (FileOps &&) -> FileOps &=delete
 
virtual ~FileOps ()=default
 

Private Attributes

FatFsFileSystemfs_
 

Detailed Description

FatFS 文件操作实现

Definition at line 185 of file fatfs.hpp.

Constructor & Destructor Documentation

◆ FatFsFileOps()

fatfs::FatFsFileSystem::FatFsFileOps::FatFsFileOps ( FatFsFileSystem fs)
inlineexplicit

Definition at line 187 of file fatfs.hpp.

187: fs_(fs) {}

Member Function Documentation

◆ Close()

auto fatfs::FatFsFileSystem::FatFsFileOps::Close ( vfs::File file) -> Expected<void>
overridevirtual

关闭文件,释放底层 FIL 对象

Parameters
file文件对象
Returns
Expected<void> 成功或错误

Implements vfs::FileOps.

Definition at line 458 of file fatfs.cpp.

458 {
459 auto* fi = static_cast<FatInode*>(file->inode->fs_private);
460
461 // 如果有打开的 DIR,关闭并释放
462 if (fi->dir != nullptr) {
463 (void)f_closedir(fi->dir);
464 fs_->FreeDir(fi->dir);
465 fi->dir = nullptr;
466 }
467
468 // 关闭文件句柄(如果有)
469 if (fi->fil == nullptr) {
470 return {};
471 }
472 FRESULT fr = f_close(fi->fil);
473 fs_->FreeFil(fi->fil);
474 fi->fil = nullptr;
475 return FresultToExpected(fr);
476}
auto FreeFil(FIL *fil) -> void
归还 FIL 对象到池中
Definition fatfs.cpp:235
auto FreeDir(DIR *dir) -> void
归还 DIR 对象到池中
Definition fatfs.cpp:255
Inode * inode
关联的 inode
Definition vfs.hpp:67
void * fs_private
文件系统私有数据指针
Definition vfs.hpp:28

◆ Read()

auto fatfs::FatFsFileSystem::FatFsFileOps::Read ( vfs::File file,
void *  buf,
size_t  count 
) -> Expected<size_t>
overridevirtual

从文件读取数据

Parameters
file文件对象
buf读取缓冲区
count请求读取的字节数
Returns
Expected<size_t> 实际读取字节数或错误

Implements vfs::FileOps.

Definition at line 396 of file fatfs.cpp.

397 {
398 auto* fi = static_cast<FatInode*>(file->inode->fs_private);
399 if (fi->fil == nullptr) {
400 return std::unexpected(Error{ErrorCode::kFsInvalidFd});
401 }
402 UINT bytes_read = 0;
403 FRESULT fr = f_read(fi->fil, buf, static_cast<UINT>(count), &bytes_read);
404 if (fr != FR_OK) {
405 klog::Err("FatFsFileOps::Read: f_read failed ({})", static_cast<int>(fr));
406 return std::unexpected(Error{FresultToErrorCode(fr)});
407 }
408 file->offset += bytes_read;
409 return static_cast<size_t>(bytes_read);
410}
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
错误类型,用于 std::expected
Definition expected.hpp:343
uint64_t offset
当前读写偏移量
Definition vfs.hpp:71
Here is the call graph for this function:

◆ ReadDir()

auto fatfs::FatFsFileSystem::FatFsFileOps::ReadDir ( vfs::File file,
vfs::DirEntry dirent,
size_t  count 
) -> Expected<size_t>
overridevirtual

读取目录条目

Parameters
file目录文件对象
dirent输出缓冲区
count最多读取的条目数
Returns
Expected<size_t> 实际读取条目数或错误

Implements vfs::FileOps.

Definition at line 478 of file fatfs.cpp.

480 {
481 auto* fi = static_cast<FatInode*>(file->inode->fs_private);
482
483 // 首次调用时惰性初始化 DIR(保持迭代状态)
484 if (fi->dir == nullptr) {
485 DIR* dir = fs_->AllocateDir();
486 if (dir == nullptr) {
487 return std::unexpected(Error{ErrorCode::kFsFdTableFull});
488 }
489 FRESULT fr = f_opendir(dir, fi->path.data());
490 if (fr != FR_OK) {
491 fs_->FreeDir(dir);
492 return std::unexpected(Error{FresultToErrorCode(fr)});
493 }
494 fi->dir = dir;
495 }
496
497 size_t read_count = 0;
498 for (size_t i = 0; i < count; ++i) {
499 FILINFO fi_info;
500 FRESULT fr = f_readdir(fi->dir, &fi_info);
501 if (fr != FR_OK || fi_info.fname[0] == '\0') {
502 break;
503 }
504 dirent[i].ino = 0;
505 dirent[i].type = static_cast<uint8_t>((fi_info.fattrib & AM_DIR) != 0
507 : vfs::FileType::kRegular);
508 strncpy(dirent[i].name, fi_info.fname, sizeof(dirent[i].name) - 1);
509 dirent[i].name[sizeof(dirent[i].name) - 1] = '\0';
510 ++read_count;
511 }
512 file->offset += static_cast<uint64_t>(read_count);
513 return read_count;
514}
auto AllocateDir() -> DIR *
从 DIR 池中分配一个空闲 DIR 对象
Definition fatfs.cpp:244
FileType
文件类型
Definition vfs_types.hpp:22
@ kRegular
普通文件
@ kDirectory
目录
#define strncpy
uint64_t ino
inode 编号
char name[256]
文件名
uint8_t type
文件类型

◆ Seek()

auto fatfs::FatFsFileSystem::FatFsFileOps::Seek ( vfs::File file,
int64_t  offset,
vfs::SeekWhence  whence 
) -> Expected<uint64_t>
overridevirtual

移动文件读写位置

Parameters
file文件对象
offset偏移量
whence定位基准(kSet / kCur / kEnd)
Returns
Expected<uint64_t> 新的文件偏移量或错误

Implements vfs::FileOps.

Definition at line 429 of file fatfs.cpp.

431 {
432 auto* fi = static_cast<FatInode*>(file->inode->fs_private);
433 if (fi->fil == nullptr) {
434 return std::unexpected(Error{ErrorCode::kFsInvalidFd});
435 }
436 FSIZE_t new_pos = 0;
437 switch (whence) {
439 new_pos = static_cast<FSIZE_t>(offset);
440 break;
442 new_pos =
443 static_cast<FSIZE_t>(static_cast<int64_t>(f_tell(fi->fil)) + offset);
444 break;
446 new_pos =
447 static_cast<FSIZE_t>(static_cast<int64_t>(f_size(fi->fil)) + offset);
448 break;
449 }
450 FRESULT fr = f_lseek(fi->fil, new_pos);
451 if (fr != FR_OK) {
452 return std::unexpected(Error{FresultToErrorCode(fr)});
453 }
454 file->offset = static_cast<uint64_t>(new_pos);
455 return static_cast<uint64_t>(new_pos);
456}
@ kSet
从文件开头
@ kCur
从当前位置
@ kEnd
从文件末尾

◆ Write()

auto fatfs::FatFsFileSystem::FatFsFileOps::Write ( vfs::File file,
const void *  buf,
size_t  count 
) -> Expected<size_t>
overridevirtual

向文件写入数据

Parameters
file文件对象
buf写入数据缓冲区
count请求写入的字节数
Returns
Expected<size_t> 实际写入字节数或错误

Implements vfs::FileOps.

Definition at line 412 of file fatfs.cpp.

413 {
414 auto* fi = static_cast<FatInode*>(file->inode->fs_private);
415 if (fi->fil == nullptr) {
416 return std::unexpected(Error{ErrorCode::kFsInvalidFd});
417 }
418 UINT bytes_written = 0;
419 FRESULT fr = f_write(fi->fil, buf, static_cast<UINT>(count), &bytes_written);
420 if (fr != FR_OK) {
421 klog::Err("FatFsFileOps::Write: f_write failed ({})", static_cast<int>(fr));
422 return std::unexpected(Error{FresultToErrorCode(fr)});
423 }
424 file->offset += bytes_written;
425 file->inode->size = static_cast<uint64_t>(f_size(fi->fil));
426 return static_cast<size_t>(bytes_written);
427}
uint64_t size
文件大小(字节)
Definition vfs.hpp:22
Here is the call graph for this function:

Member Data Documentation

◆ fs_

FatFsFileSystem* fatfs::FatFsFileSystem::FatFsFileOps::fs_
private

Definition at line 237 of file fatfs.hpp.


The documentation for this class was generated from the following files: