mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
fileutil: add ZeroToEnd for zeroing files
This commit is contained in:
parent
0d8d9a374c
commit
58a36cb651
@ -96,3 +96,26 @@ func Exist(name string) bool {
|
|||||||
_, err := os.Stat(name)
|
_, err := os.Stat(name)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ZeroToEnd zeros a file starting from SEEK_CUR to its SEEK_END. May temporarily
|
||||||
|
// shorten the length of the file.
|
||||||
|
func ZeroToEnd(f *os.File) error {
|
||||||
|
// TODO: support FALLOC_FL_ZERO_RANGE
|
||||||
|
off, err := f.Seek(0, os.SEEK_CUR)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
lenf, lerr := f.Seek(0, os.SEEK_END)
|
||||||
|
if lerr != nil {
|
||||||
|
return lerr
|
||||||
|
}
|
||||||
|
if err = f.Truncate(off); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// make sure blocks remain allocated
|
||||||
|
if err = Preallocate(f, lenf, true); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = f.Seek(off, os.SEEK_SET)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
@ -118,3 +118,42 @@ func TestExist(t *testing.T) {
|
|||||||
t.Errorf("exist = %v, want false", g)
|
t.Errorf("exist = %v, want false", g)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestZeroToEnd(t *testing.T) {
|
||||||
|
f, err := ioutil.TempFile(os.TempDir(), "fileutil")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
b := make([]byte, 1024)
|
||||||
|
for i := range b {
|
||||||
|
b[i] = 12
|
||||||
|
}
|
||||||
|
if _, err = f.Write(b); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if _, err = f.Seek(512, os.SEEK_SET); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err = ZeroToEnd(f); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
off, serr := f.Seek(0, os.SEEK_CUR)
|
||||||
|
if serr != nil {
|
||||||
|
t.Fatal(serr)
|
||||||
|
}
|
||||||
|
if off != 512 {
|
||||||
|
t.Fatalf("expected offset 512, got %d", off)
|
||||||
|
}
|
||||||
|
|
||||||
|
b = make([]byte, 512)
|
||||||
|
if _, err = f.Read(b); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
for i := range b {
|
||||||
|
if b[i] != 0 {
|
||||||
|
t.Errorf("expected b[%d] = 0, got %d", i, b[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user