summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extmod/vfs_fat.c6
-rw-r--r--tests/extmod/vfs_fat_fileio.py8
-rw-r--r--tests/extmod/vfs_fat_fileio.py.exp2
3 files changed, 16 insertions, 0 deletions
diff --git a/extmod/vfs_fat.c b/extmod/vfs_fat.c
index 6e827fc66..bd88bcf1b 100644
--- a/extmod/vfs_fat.c
+++ b/extmod/vfs_fat.c
@@ -121,6 +121,12 @@ STATIC mp_obj_t fat_vfs_rename(mp_obj_t vfs_in, mp_obj_t path_in, mp_obj_t path_
const char *old_path = mp_obj_str_get_str(path_in);
const char *new_path = mp_obj_str_get_str(path_out);
FRESULT res = f_rename(old_path, new_path);
+ if (res == FR_EXIST) {
+ // if new_path exists then try removing it (but only if it's a file)
+ fat_vfs_remove_internal(path_out, 0); // 0 == file attribute
+ // try to rename again
+ res = f_rename(old_path, new_path);
+ }
if (res == FR_OK) {
return mp_const_none;
} else {
diff --git a/tests/extmod/vfs_fat_fileio.py b/tests/extmod/vfs_fat_fileio.py
index de8d4953c..4e0dc6019 100644
--- a/tests/extmod/vfs_fat_fileio.py
+++ b/tests/extmod/vfs_fat_fileio.py
@@ -140,6 +140,14 @@ print(vfs.listdir("foo_dir"))
vfs.rename("foo_dir/file.txt", "moved-to-root.txt")
print(vfs.listdir())
+# check that renaming to existing file will overwrite it
+with vfs.open("temp", "w") as f:
+ f.write("new text")
+vfs.rename("temp", "moved-to-root.txt")
+print(vfs.listdir())
+with vfs.open("moved-to-root.txt") as f:
+ print(f.read())
+
# valid removes
vfs.remove("foo_dir/sub_file.txt")
vfs.remove("foo_file.txt")
diff --git a/tests/extmod/vfs_fat_fileio.py.exp b/tests/extmod/vfs_fat_fileio.py.exp
index c438bc850..4e34e83a8 100644
--- a/tests/extmod/vfs_fat_fileio.py.exp
+++ b/tests/extmod/vfs_fat_fileio.py.exp
@@ -18,5 +18,7 @@ b'data in file'
True
['sub_file.txt', 'file.txt']
['foo_file.txt', 'foo_dir', 'moved-to-root.txt']
+['foo_file.txt', 'foo_dir', 'moved-to-root.txt']
+new text
['moved-to-root.txt']
ENOSPC: True