FatFS 文件操作实现
More...
#include <fatfs.hpp>
FatFS 文件操作实现
Definition at line 185 of file fatfs.hpp.
◆ FatFsFileOps()
◆ Close()
| auto fatfs::FatFsFileSystem::FatFsFileOps::Close |
( |
vfs::File * |
file | ) |
-> Expected<void> |
|
overridevirtual |
关闭文件,释放底层 FIL 对象
- Parameters
-
- Returns
- Expected<void> 成功或错误
Implements vfs::FileOps.
Definition at line 458 of file fatfs.cpp.
458 {
460
461
462 if (fi->dir != nullptr) {
463 (void)f_closedir(fi->dir);
465 fi->dir = nullptr;
466 }
467
468
469 if (fi->fil == nullptr) {
470 return {};
471 }
472 FRESULT fr = f_close(fi->fil);
474 fi->fil = nullptr;
475 return FresultToExpected(fr);
476}
auto FreeFil(FIL *fil) -> void
归还 FIL 对象到池中
auto FreeDir(DIR *dir) -> void
归还 DIR 对象到池中
void * fs_private
文件系统私有数据指针
◆ 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 {
399 if (fi->fil == nullptr) {
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 级别记录日志
◆ ReadDir()
读取目录条目
- Parameters
-
| file | 目录文件对象 |
| dirent | 输出缓冲区 |
| count | 最多读取的条目数 |
- Returns
- Expected<size_t> 实际读取条目数或错误
Implements vfs::FileOps.
Definition at line 478 of file fatfs.cpp.
480 {
482
483
484 if (fi->dir == nullptr) {
486 if (dir == nullptr) {
488 }
489 FRESULT fr = f_opendir(dir, fi->path.data());
490 if (fr != FR_OK) {
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 }
505 dirent[i].
type =
static_cast<uint8_t
>((fi_info.fattrib & AM_DIR) != 0
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 对象
◆ Seek()
移动文件读写位置
- Parameters
-
| file | 文件对象 |
| offset | 偏移量 |
| whence | 定位基准(kSet / kCur / kEnd) |
- Returns
- Expected<uint64_t> 新的文件偏移量或错误
Implements vfs::FileOps.
Definition at line 429 of file fatfs.cpp.
431 {
433 if (fi->fil == nullptr) {
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}
◆ 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 {
415 if (fi->fil == nullptr) {
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}
◆ fs_
The documentation for this class was generated from the following files:
- /workspaces/SimpleKernel/src/filesystem/fatfs/include/fatfs.hpp
- /workspaces/SimpleKernel/src/filesystem/fatfs/fatfs.cpp