123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- package dara
- import (
- "os"
- )
- // File struct to represent the file
- type DaraFile struct {
- path string
- fileInfo os.FileInfo
- file *os.File
- position int64
- }
- // NewFile creates a new instance of File
- func NewDaraFile(path string) *DaraFile {
- return &DaraFile{
- path: path,
- position: 0,
- }
- }
- // Path returns the path of the file
- func (tf *DaraFile) Path() string {
- return tf.path
- }
- // CreateTime returns the creation time of the file
- func (tf *DaraFile) CreateTime() (*Date, error) {
- if tf.fileInfo == nil {
- var err error
- tf.fileInfo, err = os.Stat(tf.path)
- if err != nil {
- return nil, err
- }
- }
- return &Date{tf.fileInfo.ModTime()}, nil
- }
- // ModifyTime returns the modification time of the file
- func (tf *DaraFile) ModifyTime() (*Date, error) {
- if tf.fileInfo == nil {
- var err error
- tf.fileInfo, err = os.Stat(tf.path)
- if err != nil {
- return nil, err
- }
- }
- return &Date{tf.fileInfo.ModTime()}, nil
- }
- // Length returns the size of the file
- func (tf *DaraFile) Length() (int64, error) {
- if tf.fileInfo == nil {
- var err error
- tf.fileInfo, err = os.Stat(tf.path)
- if err != nil {
- return 0, err
- }
- }
- return tf.fileInfo.Size(), nil
- }
- // Read reads a specified number of bytes from the file
- func (tf *DaraFile) Read(size int) ([]byte, error) {
- if tf.file == nil {
- file, err := os.OpenFile(tf.path, os.O_RDWR|os.O_CREATE, 0755)
- if err != nil {
- return nil, err
- }
- tf.file = file
- }
- fileInfo, err := tf.file.Stat()
- if err != nil {
- return nil, err
- }
- // 获取文件大小
- fileSize := fileInfo.Size()
- // 计算可以读取的实际大小
- if tf.position >= fileSize {
- return nil, nil // End of file reached
- }
- // 确保 size 不超过剩余文件大小
- actualSize := size
- if tf.position+int64(size) > fileSize {
- actualSize = int(fileSize - tf.position)
- }
- buf := make([]byte, actualSize)
- bytesRead, err := tf.file.ReadAt(buf, tf.position)
- if err != nil {
- return nil, err
- }
- tf.position += int64(bytesRead)
- return buf[:bytesRead], nil
- }
- // Write writes data to the file
- func (tf *DaraFile) Write(data []byte) error {
- if tf.file == nil {
- file, err := os.OpenFile(tf.path, os.O_RDWR|os.O_CREATE, 0755)
- if err != nil {
- return err
- }
- tf.file = file
- }
- _, err := tf.file.Write(data)
- if err != nil {
- return err
- }
- tf.fileInfo, err = os.Stat(tf.path) // Update fileInfo after write
- return err
- }
- // Close closes the file
- func (tf *DaraFile) Close() error {
- if tf.file == nil {
- return nil
- }
- return tf.file.Close()
- }
- // Exists checks if the file exists
- func Exists(path string) (bool, error) {
- _, err := os.Stat(path)
- if os.IsNotExist(err) {
- return false, nil
- }
- return err == nil, err
- }
- // CreateReadStream would typically return an os.File or similar
- func CreateReadStream(path string) (*os.File, error) {
- return os.Open(path)
- }
- // CreateWriteStream would typically return an os.File or similar
- func CreateWriteStream(path string) (*os.File, error) {
- return os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755)
- }
|