SimpleKernel 1.17.0
Loading...
Searching...
No Matches
ramfs::RamFs::RamFsFileOps Class Reference

File 操作实现类 More...

#include <ramfs.hpp>

Inheritance diagram for ramfs::RamFs::RamFsFileOps:
Inheritance graph
Collaboration diagram for ramfs::RamFs::RamFsFileOps:
Collaboration graph

Public Member Functions

 RamFsFileOps (RamFs *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
 关闭文件
 
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

RamFsfs_
 

Detailed Description

File 操作实现类

Definition at line 108 of file ramfs.hpp.

Constructor & Destructor Documentation

◆ RamFsFileOps()

ramfs::RamFs::RamFsFileOps::RamFsFileOps ( RamFs fs)
inlineexplicit

Definition at line 110 of file ramfs.hpp.

110: fs_(fs) {}

Member Function Documentation

◆ Close()

auto ramfs::RamFs::RamFsFileOps::Close ( vfs::File file) -> Expected< void >
overridevirtual

关闭文件

Parameters
file文件对象
Returns
Expected<void> 成功或错误
Precondition
file != nullptr
Postcondition
file 对象将被释放

Implements vfs::FileOps.

Definition at line 415 of file ramfs.cpp.

415 {
416 if (file == nullptr) {
417 return std::unexpected(Error(ErrorCode::kInvalidArgument));
418 }
419
420 // ramfs 没有特殊的关闭操作
421 // File 对象由调用者释放
422 return {};
423}
@ kInvalidArgument
错误类型,用于 std::expected
Definition expected.hpp:343

◆ Read()

auto ramfs::RamFs::RamFsFileOps::Read ( vfs::File file,
void *  buf,
size_t  count 
) -> Expected< size_t >
overridevirtual

从文件读取数据

Parameters
file文件对象
buf输出缓冲区
count最大读取字节数
Returns
Expected<size_t> 实际读取的字节数或错误
Precondition
file != nullptr && buf != nullptr
Postcondition
返回值 <= count

Implements vfs::FileOps.

Definition at line 299 of file ramfs.cpp.

300 {
301 if (file == nullptr || buf == nullptr) {
302 return std::unexpected(Error(ErrorCode::kInvalidArgument));
303 }
304
305 if (file->inode == nullptr) {
306 return std::unexpected(Error(ErrorCode::kFsCorrupted));
307 }
308
309 if (file->inode->type != FileType::kRegular) {
310 return std::unexpected(Error(ErrorCode::kFsIsADirectory));
311 }
312
313 RamInode* ram_inode = static_cast<RamInode*>(file->inode->fs_private);
314
315 // 计算可读字节数
316 if (file->offset >= file->inode->size) {
317 return 0; // EOF
318 }
319
320 size_t available = file->inode->size - file->offset;
321 size_t to_read = (count < available) ? count : available;
322
323 if (to_read == 0) {
324 return 0;
325 }
326
327 // 复制数据
328 memcpy(buf, static_cast<uint8_t*>(ram_inode->data) + file->offset, to_read);
329
330 file->offset += to_read;
331 return to_read;
332}
#define memcpy
Inode * inode
关联的 inode
Definition vfs.hpp:67
uint64_t offset
当前读写偏移量
Definition vfs.hpp:71
uint64_t size
文件大小(字节)
Definition vfs.hpp:22
FileType type
文件类型
Definition vfs.hpp:20
void * fs_private
文件系统私有数据指针
Definition vfs.hpp:28

◆ ReadDir()

auto ramfs::RamFs::RamFsFileOps::ReadDir ( vfs::File file,
vfs::DirEntry dirent,
size_t  count 
) -> Expected< size_t >
overridevirtual

读取目录项

Parameters
file目录文件对象
dirent输出目录项数组
count最多读取的条目数
Returns
Expected<size_t> 实际读取的条目数或错误
Precondition
file != nullptr && file->inode->type == FileType::kDirectory
dirent != nullptr

Implements vfs::FileOps.

Definition at line 425 of file ramfs.cpp.

426 {
427 if (file == nullptr || dirent == nullptr) {
428 return std::unexpected(Error(ErrorCode::kInvalidArgument));
429 }
430
431 if (file->inode == nullptr || file->inode->type != FileType::kDirectory) {
432 return std::unexpected(Error(ErrorCode::kFsNotADirectory));
433 }
434
435 RamInode* ram_dir = static_cast<RamInode*>(file->inode->fs_private);
436
437 RamDirEntry* entries = static_cast<RamDirEntry*>(ram_dir->data);
438
439 size_t read_count = 0;
440 size_t offset = file->offset;
441
442 // 添加 . 和 .. 条目
443 if (offset == 0 && read_count < count) {
444 dirent[read_count].ino = file->inode->ino;
445 dirent[read_count].type = static_cast<uint8_t>(FileType::kDirectory);
446 strncpy(dirent[read_count].name, ".", sizeof(dirent[read_count].name));
447 ++read_count;
448 ++offset;
449 }
450
451 if (offset == 1 && read_count < count) {
452 Inode* parent_inode =
453 (file->dentry != nullptr && file->dentry->parent != nullptr)
454 ? file->dentry->parent->inode
455 : file->inode;
456 dirent[read_count].ino = parent_inode->ino;
457 dirent[read_count].type = static_cast<uint8_t>(FileType::kDirectory);
458 strncpy(dirent[read_count].name, "..", sizeof(dirent[read_count].name));
459 ++read_count;
460 ++offset;
461 }
462
463 // 读取实际目录项(跳过 . 和 .. 的偏移)
464 size_t entry_idx = (offset > 2) ? offset - 2 : 0;
465 while (read_count < count && entry_idx < ram_dir->child_count) {
466 dirent[read_count].ino = entries[entry_idx].inode->ino;
467 dirent[read_count].type =
468 static_cast<uint8_t>(entries[entry_idx].inode->type);
469 strncpy(dirent[read_count].name, entries[entry_idx].name,
470 sizeof(dirent[read_count].name));
471 ++read_count;
472 ++entry_idx;
473 }
474
475 file->offset = offset + read_count;
476 return read_count;
477}
@ kFsNotADirectory
#define strncpy
Dentry * parent
父目录项
Definition vfs.hpp:47
Inode * inode
关联的 inode
Definition vfs.hpp:45
uint64_t ino
inode 编号
uint8_t type
文件类型
Dentry * dentry
关联的 dentry
Definition vfs.hpp:69
uint64_t ino
inode 编号(文件系统内唯一)
Definition vfs.hpp:18

◆ Seek()

auto ramfs::RamFs::RamFsFileOps::Seek ( vfs::File file,
int64_t  offset,
vfs::SeekWhence  whence 
) -> Expected< uint64_t >
overridevirtual

调整文件偏移量

Parameters
file文件对象
offset偏移量
whence基准位置
Returns
Expected<uint64_t> 新的偏移量或错误
Precondition
file != nullptr

Implements vfs::FileOps.

Definition at line 372 of file ramfs.cpp.

373 {
374 if (file == nullptr) {
375 return std::unexpected(Error(ErrorCode::kInvalidArgument));
376 }
377
378 uint64_t new_offset = 0;
379
380 switch (whence) {
381 case SeekWhence::kSet:
382 if (offset < 0) {
383 return std::unexpected(Error(ErrorCode::kInvalidArgument));
384 }
385 new_offset = static_cast<uint64_t>(offset);
386 break;
387
388 case SeekWhence::kCur:
389 if (offset < 0 && static_cast<uint64_t>(-offset) > file->offset) {
390 return std::unexpected(Error(ErrorCode::kInvalidArgument));
391 }
392 new_offset =
393 static_cast<uint64_t>(static_cast<int64_t>(file->offset) + offset);
394 break;
395
396 case SeekWhence::kEnd:
397 if (file->inode == nullptr) {
398 return std::unexpected(Error(ErrorCode::kFsCorrupted));
399 }
400 if (offset < 0 && static_cast<uint64_t>(-offset) > file->inode->size) {
401 return std::unexpected(Error(ErrorCode::kInvalidArgument));
402 }
403 new_offset = static_cast<uint64_t>(
404 static_cast<int64_t>(file->inode->size) + offset);
405 break;
406
407 default:
408 return std::unexpected(Error(ErrorCode::kInvalidArgument));
409 }
410
411 file->offset = new_offset;
412 return new_offset;
413}

◆ Write()

auto ramfs::RamFs::RamFsFileOps::Write ( vfs::File file,
const void *  buf,
size_t  count 
) -> Expected< size_t >
overridevirtual

向文件写入数据

Parameters
file文件对象
buf输入缓冲区
count要写入的字节数
Returns
Expected<size_t> 实际写入的字节数或错误
Precondition
file != nullptr && buf != nullptr
Postcondition
返回值 <= count

Implements vfs::FileOps.

Definition at line 334 of file ramfs.cpp.

335 {
336 if (file == nullptr || buf == nullptr) {
337 return std::unexpected(Error(ErrorCode::kInvalidArgument));
338 }
339
340 if (file->inode == nullptr) {
341 return std::unexpected(Error(ErrorCode::kFsCorrupted));
342 }
343
344 if (file->inode->type != FileType::kRegular) {
345 return std::unexpected(Error(ErrorCode::kFsIsADirectory));
346 }
347
348 RamInode* ram_inode = static_cast<RamInode*>(file->inode->fs_private);
349
350 // 检查是否需要扩展文件
351 size_t new_size = file->offset + count;
352 if (new_size > ram_inode->capacity) {
353 auto expand_result = fs_->ExpandFile(ram_inode, new_size);
354 if (!expand_result.has_value()) {
355 return std::unexpected(expand_result.error());
356 }
357 }
358
359 // 写入数据
360 memcpy(static_cast<uint8_t*>(ram_inode->data) + file->offset, buf, count);
361
362 file->offset += count;
363
364 // 更新文件大小
365 if (file->offset > file->inode->size) {
366 file->inode->size = file->offset;
367 }
368
369 return count;
370}
auto ExpandFile(RamInode *inode, size_t new_size) -> Expected< void >
Definition ramfs.cpp:580

Member Data Documentation

◆ fs_

RamFs* ramfs::RamFs::RamFsFileOps::fs_
private

Definition at line 122 of file ramfs.hpp.


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