set modtime on any write
diff --git a/mem/file.go b/mem/file.go
index 7d43a52..be3673e 100644
--- a/mem/file.go
+++ b/mem/file.go
@@ -99,6 +99,9 @@
func (f *File) Close() error {
f.fileData.Lock()
f.closed = true
+ if !f.readOnly {
+ SetModTime(f.fileData, time.Now())
+ }
f.fileData.Unlock()
return nil
}
@@ -180,6 +183,9 @@
if f.closed == true {
return ErrFileClosed
}
+ if f.readOnly {
+ return &os.PathError{"truncate", f.fileData.name, errors.New("file handle is read only")}
+ }
if size < 0 {
return ErrOutOfRange
}
@@ -189,6 +195,7 @@
} else {
f.fileData.data = f.fileData.data[0:size]
}
+ SetModTime(f.fileData, time.Now())
return nil
}
@@ -227,6 +234,7 @@
f.fileData.data = append(f.fileData.data[:cur], b...)
f.fileData.data = append(f.fileData.data, tail...)
}
+ SetModTime(f.fileData, time.Now())
atomic.StoreInt64(&f.at, int64(len(f.fileData.data)))
return
diff --git a/memmap_test.go b/memmap_test.go
index c0e6825..f090df7 100644
--- a/memmap_test.go
+++ b/memmap_test.go
@@ -208,3 +208,45 @@
f.Close()
}
}
+
+func TestWriteCloseTime(t *testing.T) {
+ defer removeAllTestFiles(t)
+ const fileName = "afero-demo.txt"
+
+ for _, fs := range Fss {
+ dir := testDir(fs)
+ path := filepath.Join(dir, fileName)
+
+ f, err := fs.Create(path)
+ if err != nil {
+ t.Error(fs.Name()+":", "fs.Create failed: "+err.Error())
+ }
+ f.Close()
+
+ f, err = fs.Create(path)
+ if err != nil {
+ t.Error(fs.Name()+":", "fs.Create failed: "+err.Error())
+ }
+ fi, err := f.Stat()
+ if err != nil {
+ t.Error(fs.Name()+":", "Stat failed: "+err.Error())
+ }
+ timeBefore := fi.ModTime()
+ // sorry for the delay, but we have to make sure time advances, also
+ // on non Un*x systems...
+ time.Sleep(2 * time.Second)
+
+ _, err = f.Write([]byte("test"))
+ if err != nil {
+ t.Error(fs.Name()+":", "Write failed: "+err.Error())
+ }
+ f.Close()
+ fi, err = fs.Stat(path)
+ if err != nil {
+ t.Error(fs.Name()+":", "fs.Stat failed: "+err.Error())
+ }
+ if fi.ModTime().Equal(timeBefore) {
+ t.Error(fs.Name()+":", "ModTime was not set on Close()")
+ }
+ }
+}