fix mem.DirMap and mem.Dir to only use *FileData and not *File handles
diff --git a/mem/dir.go b/mem/dir.go
index d7b7bdf..e104013 100644
--- a/mem/dir.go
+++ b/mem/dir.go
@@ -16,22 +16,22 @@
 type Dir interface {
 	Len() int
 	Names() []string
-	Files() []*File
-	Add(*File)
-	Remove(*File)
+	Files() []*FileData
+	Add(*FileData)
+	Remove(*FileData)
 }
 
-func RemoveFromMemDir(dir *File, f *File) {
-	dir.fileData.memDir.Remove(f)
+func RemoveFromMemDir(dir *FileData, f *FileData) {
+	dir.memDir.Remove(f)
 }
 
-func AddToMemDir(dir *File, f *File) {
-	dir.fileData.memDir.Add(f)
+func AddToMemDir(dir *FileData, f *FileData) {
+	dir.memDir.Add(f)
 }
 
-func InitializeDir(d *File) {
-	if d.fileData.memDir == nil {
-		d.fileData.dir = true
-		d.fileData.memDir = &DirMap{}
+func InitializeDir(d *FileData) {
+	if d.memDir == nil {
+		d.dir = true
+		d.memDir = &DirMap{}
 	}
 }
diff --git a/mem/dirmap.go b/mem/dirmap.go
index f18718c..03a57ee 100644
--- a/mem/dirmap.go
+++ b/mem/dirmap.go
@@ -17,23 +17,23 @@
 
 type DirMap map[string]*FileData
 
-func (m DirMap) Len() int       { return len(m) }
-func (m DirMap) Add(f *File)    { m[f.fileData.name] = f.fileData }
-func (m DirMap) Remove(f *File) { delete(m, f.fileData.name) }
-func (m DirMap) Files() (files []*File) {
+func (m DirMap) Len() int           { return len(m) }
+func (m DirMap) Add(f *FileData)    { m[f.name] = f }
+func (m DirMap) Remove(f *FileData) { delete(m, f.name) }
+func (m DirMap) Files() (files []*FileData) {
 	for _, f := range m {
-		files = append(files, NewFileHandle(f))
+		files = append(files, f)
 	}
 	sort.Sort(filesSorter(files))
 	return files
 }
 
-type filesSorter []*File
+// implement sort.Interface for []*FileData
+type filesSorter []*FileData
 
-// implement sort.Interface for []File
 func (s filesSorter) Len() int           { return len(s) }
 func (s filesSorter) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
-func (s filesSorter) Less(i, j int) bool { return s[i].fileData.name < s[j].fileData.name }
+func (s filesSorter) Less(i, j int) bool { return s[i].name < s[j].name }
 
 func (m DirMap) Names() (names []string) {
 	for x := range m {
diff --git a/mem/file.go b/mem/file.go
index 16f13a0..2ac9d3f 100644
--- a/mem/file.go
+++ b/mem/file.go
@@ -54,6 +54,10 @@
 	modtime time.Time
 }
 
+func (d FileData) Name() string {
+	return d.name
+}
+
 func CreateFile(name string) *FileData {
 	return &FileData{name: name, mode: os.ModeTemporary, modtime: time.Now()}
 }
@@ -128,7 +132,7 @@
 
 	res = make([]os.FileInfo, outLength)
 	for i := range res {
-		res[i] = &FileInfo{files[i].fileData}
+		res[i] = &FileInfo{files[i]}
 	}
 
 	return res, err
diff --git a/memmap.go b/memmap.go
index c8ab75a..7e5536d 100644
--- a/memmap.go
+++ b/memmap.go
@@ -50,11 +50,9 @@
 	m.mu.Lock()
 	file := mem.CreateFile(name)
 	m.getData()[name] = file
-
-	handle := mem.NewFileHandle(file)
-	m.registerWithParent(handle)
+	m.registerWithParent(file)
 	m.mu.Unlock()
-	return handle, nil
+	return mem.NewFileHandle(file), nil
 }
 
 func (m *MemMapFs) unRegisterWithParent(fileName string) error {
@@ -66,7 +64,7 @@
 	if parent == nil {
 		log.Fatal("parent of ", f.Name(), " is nil")
 	}
-	mem.RemoveFromMemDir(parent, f)
+	mem.RemoveFromMemDir(parent.Data(), f.Data())
 	return nil
 }
 
@@ -80,11 +78,11 @@
 	return pfile
 }
 
-func (m *MemMapFs) registerWithParent(f *mem.File) {
+func (m *MemMapFs) registerWithParent(f *mem.FileData) {
 	if f == nil {
 		return
 	}
-	parent := m.findParent(f)
+	parent := m.findParent(mem.NewFileHandle(f))
 	if parent == nil {
 		pdir := filepath.Dir(filepath.Clean(f.Name()))
 		err := m.lockfreeMkdir(pdir, 0777)
@@ -99,8 +97,8 @@
 		}
 	}
 
-	mem.InitializeDir(parent)
-	mem.AddToMemDir(parent, f)
+	mem.InitializeDir(parent.Data())
+	mem.AddToMemDir(parent.Data(), f)
 }
 
 func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error {
@@ -118,7 +116,7 @@
 	} else {
 		item := mem.CreateDir(name)
 		m.getData()[name] = item
-		m.registerWithParent(mem.NewFileHandle(item))
+		m.registerWithParent(item)
 	}
 	return nil
 }
@@ -135,7 +133,7 @@
 		m.mu.Lock()
 		item := mem.CreateDir(name)
 		m.getData()[name] = item
-		m.registerWithParent(mem.NewFileHandle(item))
+		m.registerWithParent(item)
 		m.mu.Unlock()
 	}
 	return nil
@@ -274,11 +272,10 @@
 			m.mu.Lock()
 			m.unRegisterWithParent(oldname)
 			fileData := m.getData()[oldname]
-			file := mem.NewFileHandle(fileData)
 			delete(m.getData(), oldname)
-			mem.ChangeFileName(file, newname)
+			mem.ChangeFileName(mem.NewFileHandle(fileData), newname)
 			m.getData()[newname] = fileData
-			m.registerWithParent(file)
+			m.registerWithParent(fileData)
 			m.mu.Unlock()
 			m.mu.RLock()
 		} else {