mirror of
https://github.com/golang/go
synced 2024-11-17 00:04:40 -07:00
os: avoid creating a new file in Truncate on Windows
Truncate() a non existent file on Windows currently creates a new blank file. This behavior is not consistent with other OSes where a file not found error would instead be returned. This change makes Truncate on Windows return a file-not-found error when the specified file doesn't exist, bringing the behavior consistent. New test cases have been added to prevent a regression. Fixes 58977
This commit is contained in:
parent
3360be4a11
commit
636b6c37c1
@ -160,7 +160,7 @@ func (f *File) seek(offset int64, whence int) (ret int64, err error) {
|
||||
// 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 {
|
||||
f, e := OpenFile(name, O_WRONLY|O_CREATE, 0666)
|
||||
f, e := OpenFile(name, O_WRONLY, 0666)
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
|
@ -1335,6 +1335,26 @@ func TestTruncate(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestTruncateNonexistentFile(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
assertPathError := func(t testing.TB, path string, err error) {
|
||||
t.Helper()
|
||||
if pe, ok := err.(*os.PathError); !ok || !os.IsNotExist(err) || pe.Path != path {
|
||||
t.Errorf("got error: %v\nwant an ErrNotExist PathError with path %q", err, path)
|
||||
}
|
||||
}
|
||||
|
||||
path := filepath.Join(t.TempDir(), "nonexistent")
|
||||
|
||||
err := os.Truncate(path, 1)
|
||||
assertPathError(t, path, err)
|
||||
|
||||
// Truncate shouldn't create any new file.
|
||||
_, err = os.Stat(path)
|
||||
assertPathError(t, path, err)
|
||||
}
|
||||
|
||||
// Use TempDir (via newFile) to make sure we're on a local file system,
|
||||
// so that timings are not distorted by latency and caching.
|
||||
// On NFS, timings can be off due to caching of meta-data on
|
||||
|
Loading…
Reference in New Issue
Block a user