diff --git a/src/os/file_unix.go b/src/os/file_unix.go index ef7abcbac8..d8d086e8dc 100644 --- a/src/os/file_unix.go +++ b/src/os/file_unix.go @@ -55,6 +55,19 @@ func NewFile(fd uintptr, name string) *File { return &File{&file{handle: unixFileHandle(fd), name: name}} } +// Truncate changes the size of the named file. +// If the file is a symbolic link, it changes the size of the link's target. +// If there is an error, it will be of type *PathError. +func Truncate(name string, size int64) error { + e := ignoringEINTR(func() error { + return syscall.Truncate(name, size) + }) + if e != nil { + return &PathError{Op: "truncate", Path: name, Err: e} + } + return nil +} + func Pipe() (r *File, w *File, err error) { var p [2]int err = handleSyscallError(syscall.Pipe2(p[:], syscall.O_CLOEXEC)) @@ -134,14 +147,7 @@ func (f *File) Truncate(size int64) (err error) { return ErrClosed } - e := ignoringEINTR(func() error { - return syscall.Truncate(f.name, size) - }) - - if e != nil { - return &PathError{Op: "truncate", Path: f.name, Err: e} - } - return + return Truncate(f.name, size) } // ReadAt reads up to len(b) bytes from the File starting at the given absolute offset. diff --git a/src/os/file_windows.go b/src/os/file_windows.go index 5860c76b04..9588cac763 100644 --- a/src/os/file_windows.go +++ b/src/os/file_windows.go @@ -63,6 +63,12 @@ func (f *unixFileHandle) Truncate(size int64) error { return ErrNotImplemented } +// Truncate changes the size of the named file. +// If the file is a symbolic link, it changes the size of the link's target. +func Truncate(name string, size int64) error { + return &PathError{Op: "truncate", Path: name, Err: ErrNotImplemented} +} + func tempDir() string { n := uint32(syscall.MAX_PATH) for { @@ -110,14 +116,13 @@ func (f unixFileHandle) Sync() error { return ErrNotImplemented } +// Truncate changes the size of the named file. +// If the file is a symbolic link, it changes the size of the link's target. func (f *File) Truncate(size int64) error { - var err error if f.handle == nil { - err = ErrClosed - } else { - err = ErrNotImplemented + return &PathError{Op: "truncate", Path: f.name, Err: ErrClosed} } - return &PathError{Op: "truncate", Path: f.name, Err: err} + return Truncate(f.name, size) } // isWindowsNulName reports whether name is os.DevNull ('NUL') on Windows.