diff --git a/memmap.go b/memmap.go index d06975e..5cfc0a6 100644 --- a/memmap.go +++ b/memmap.go @@ -319,6 +319,18 @@ func (m *MemMapFs) Rename(oldname, newname string) error { } else { return &os.PathError{Op: "rename", Path: oldname, Err: ErrFileNotFound} } + + for p, fileData := range m.getData() { + if strings.HasPrefix(p, oldname+FilePathSeparator) { + m.mu.RUnlock() + m.mu.Lock() + delete(m.getData(), p) + p := strings.Replace(p, oldname, newname, 1) + m.getData()[p] = fileData + m.mu.Unlock() + m.mu.RLock() + } + } return nil } diff --git a/memmap_test.go b/memmap_test.go index 4f2bbad..318e95f 100644 --- a/memmap_test.go +++ b/memmap_test.go @@ -776,3 +776,60 @@ func TestMemMapFsConfurrentMkdir(t *testing.T) { t.Errorf("found %d files, but expect %d", len(foundFiles), n) } } + +func TestMemFsRenameDir(t *testing.T) { + const srcPath = "/src" + const dstPath = "/dst" + const subDir = "dir" + const subFile = "file.txt" + + fs := NewMemMapFs() + + err := fs.MkdirAll(srcPath+FilePathSeparator+subDir, 0777) + if err != nil { + t.Fatalf("MkDirAll failed: %s", err) + } + + f, err := fs.Create(srcPath + FilePathSeparator + subFile) + if err != nil { + t.Fatalf("Create failed: %s", err) + } + if err = f.Close(); err != nil { + t.Fatalf("Close failed: %s", err) + } + + err = fs.Rename(srcPath, dstPath) + if err != nil { + t.Fatalf("Rename failed: %s", err) + } + + _, err = fs.Stat(srcPath + FilePathSeparator + subDir) + if err == nil { + t.Fatalf("SubDir still exists in the source dir") + } + + _, err = fs.Stat(srcPath + FilePathSeparator + subFile) + if err == nil { + t.Fatalf("SubFile still exists in the source dir") + } + + _, err = fs.Stat(dstPath + FilePathSeparator + subDir) + if err != nil { + t.Fatalf("SubDir stat in the destination dir: %s", err) + } + + _, err = fs.Stat(dstPath + FilePathSeparator + subFile) + if err != nil { + t.Fatalf("SubFile stat in the destination dir: %s", err) + } + + err = fs.Mkdir(srcPath, 0777) + if err != nil { + t.Fatalf("Cannot recreate the source dir: %s", err) + } + + err = fs.Mkdir(srcPath+FilePathSeparator+subDir, 0777) + if err != nil { + t.Errorf("Cannot recreate the subdir in the source dir: %s", err) + } +}