@@ -36,12 +36,11 @@ File::File (Adafruit_LittleFS &fs)
36
36
{
37
37
_fs = &fs;
38
38
_is_dir = false ;
39
- _opened = false ;
40
39
_name[0 ] = 0 ;
41
40
_dir_path = NULL ;
42
41
43
- varclr (& _dir) ;
44
- varclr (& _file) ;
42
+ _dir = NULL ;
43
+ _file = NULL ;
45
44
}
46
45
47
46
File::File (char const *filename, uint8_t mode, Adafruit_LittleFS &fs)
@@ -50,19 +49,17 @@ File::File (char const *filename, uint8_t mode, Adafruit_LittleFS &fs)
50
49
this ->open (filename, mode);
51
50
}
52
51
53
- File::~File ()
54
- {
55
- if ( _dir_path ) rtos_free (_dir_path);
56
- }
57
-
58
52
bool File::_open_file (char const *filepath, uint8_t mode)
59
53
{
60
54
int flags = (mode == FILE_READ) ? LFS_O_RDONLY :
61
55
(mode == FILE_WRITE) ? (LFS_O_RDWR | LFS_O_CREAT) : 0 ;
62
56
63
57
if ( flags )
64
58
{
65
- int rc = lfs_file_open (_fs->getFS (), &_file, filepath, flags);
59
+ _file = (lfs_file_t *) rtos_malloc (sizeof (lfs_file_t ));
60
+ if (!_file) return false ;
61
+
62
+ int rc = lfs_file_open (_fs->getFS (), _file, filepath, flags);
66
63
67
64
if ( rc )
68
65
{
@@ -72,9 +69,8 @@ bool File::_open_file (char const *filepath, uint8_t mode)
72
69
}
73
70
74
71
// move to end of file
75
- if ( mode == FILE_WRITE ) lfs_file_seek (_fs->getFS (), & _file, 0 , LFS_SEEK_END);
72
+ if ( mode == FILE_WRITE ) lfs_file_seek (_fs->getFS (), _file, 0 , LFS_SEEK_END);
76
73
77
- _opened = true ;
78
74
_is_dir = false ;
79
75
}
80
76
@@ -83,7 +79,10 @@ bool File::_open_file (char const *filepath, uint8_t mode)
83
79
84
80
bool File::_open_dir (char const *filepath)
85
81
{
86
- int rc = lfs_dir_open (_fs->getFS (), &_dir, filepath);
82
+ _dir = (lfs_dir_t *) rtos_malloc (sizeof (lfs_dir_t ));
83
+ if (!_dir) return false ;
84
+
85
+ int rc = lfs_dir_open (_fs->getFS (), _dir, filepath);
87
86
88
87
if ( rc )
89
88
{
@@ -92,7 +91,6 @@ bool File::_open_dir (char const *filepath)
92
91
return false ;
93
92
}
94
93
95
- _opened = true ;
96
94
_is_dir = true ;
97
95
98
96
_dir_path = (char *) rtos_malloc (strlen (filepath) + 1 );
@@ -106,7 +104,7 @@ bool File::open (char const *filepath, uint8_t mode)
106
104
bool ret = false ;
107
105
108
106
// close if currently opened
109
- if ( _opened ) close ();
107
+ if ( (* this ) ) close ();
110
108
111
109
struct lfs_info info;
112
110
int rc = lfs_stat (_fs->getFS (), filepath, &info);
@@ -146,7 +144,7 @@ size_t File::write (uint8_t const *buf, size_t size)
146
144
{
147
145
VERIFY (!_is_dir, 0 );
148
146
149
- lfs_ssize_t wrcount = lfs_file_write (_fs->getFS (), & _file, buf, size);
147
+ lfs_ssize_t wrcount = lfs_file_write (_fs->getFS (), _file, buf, size);
150
148
VERIFY (wrcount > 0 , 0 );
151
149
return wrcount;
152
150
}
@@ -161,7 +159,7 @@ int File::read (void)
161
159
int File::read (void *buf, uint16_t nbyte)
162
160
{
163
161
VERIFY (!_is_dir, 0 );
164
- return lfs_file_read (_fs->getFS (), & _file, buf, nbyte);
162
+ return lfs_file_read (_fs->getFS (), _file, buf, nbyte);
165
163
}
166
164
167
165
int File::peek (void )
@@ -182,50 +180,52 @@ int File::available (void)
182
180
bool File::seek (uint32_t pos)
183
181
{
184
182
VERIFY (!_is_dir, false );
185
- return lfs_file_seek (_fs->getFS (), & _file, pos, LFS_SEEK_SET) >= 0 ;
183
+ return lfs_file_seek (_fs->getFS (), _file, pos, LFS_SEEK_SET) >= 0 ;
186
184
}
187
185
188
186
uint32_t File::position (void )
189
187
{
190
188
VERIFY (!_is_dir, 0 );
191
- return lfs_file_tell (_fs->getFS (), & _file);
189
+ return lfs_file_tell (_fs->getFS (), _file);
192
190
}
193
191
194
192
uint32_t File::size (void )
195
193
{
196
194
VERIFY (!_is_dir, 0 );
197
- return lfs_file_size (_fs->getFS (), & _file);
195
+ return lfs_file_size (_fs->getFS (), _file);
198
196
}
199
197
200
198
void File::flush (void )
201
199
{
202
200
VERIFY (!_is_dir,);
203
- lfs_file_sync (_fs->getFS (), & _file);
201
+ lfs_file_sync (_fs->getFS (), _file);
204
202
}
205
203
206
204
void File::close (void )
207
205
{
208
- if ( _opened )
206
+ if ( (* this ) )
209
207
{
210
208
if ( _is_dir )
211
209
{
212
- lfs_dir_close (_fs->getFS (), &_dir);
210
+ lfs_dir_close (_fs->getFS (), _dir);
211
+ rtos_free (_dir);
212
+ _dir = NULL ;
213
+
214
+ if ( _dir_path ) rtos_free (_dir_path);
215
+ _dir_path = NULL ;
213
216
}
214
217
else
215
218
{
216
- lfs_file_close (_fs->getFS (), &_file);
219
+ lfs_file_close (_fs->getFS (), _file);
220
+ rtos_free (_file);
221
+ _file = NULL ;
217
222
}
218
223
}
219
-
220
- _opened = false ;
221
-
222
- if ( _dir_path ) rtos_free (_dir_path);
223
- _dir_path = NULL ;
224
224
}
225
225
226
226
File::operator bool (void )
227
227
{
228
- return _opened ;
228
+ return (_file != NULL ) || (_dir != NULL ) ;
229
229
}
230
230
231
231
char const * File::name (void )
@@ -252,7 +252,7 @@ File File::openNextFile (uint8_t mode)
252
252
// skip "." and ".." entries
253
253
do
254
254
{
255
- rc = lfs_dir_read (_fs->getFS (), & _dir, &info);
255
+ rc = lfs_dir_read (_fs->getFS (), _dir, &info);
256
256
} while ( rc == 1 && (!strcmp (" ." , info.name ) || !strcmp (" .." , info.name )) );
257
257
258
258
if ( rc == 1 )
@@ -276,5 +276,5 @@ File File::openNextFile (uint8_t mode)
276
276
277
277
void File::rewindDirectory (void )
278
278
{
279
- VERIFY_LFS (lfs_dir_rewind (_fs->getFS (), & _dir),);
279
+ VERIFY_LFS (lfs_dir_rewind (_fs->getFS (), _dir),);
280
280
}
0 commit comments