diff --git a/src/os/file.go b/src/os/file.go index e8d2de1b3cb5cf92ace4039922f3d8a98d92bb37..c46c9030b91b2195567f6f002a6bd92a08121aaa 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -625,6 +625,7 @@ func DirFS(dir string) fs.FS { return dirFS(dir) } +// containsAny reports whether any bytes in chars are within s. func containsAny(s, chars string) bool { for i := 0; i < len(s); i++ { for j := 0; j < len(chars); j++ { @@ -644,14 +645,12 @@ func (dir dirFS) Open(name string) (fs.File, error) { } f, err := Open(dir.join(name)) if err != nil { - if runtime.GOOS == "windows" { - // Undo the backslash conversion done by dir.join. - perr := err.(*PathError) - if containsAny(perr.Path, `\`) { - perr.Path = string(dir) + "/" + name - } - } - return nil, err // nil fs.File + // DirFS takes a string appropriate for GOOS, + // while the name argument here is always slash separated. + // dir.join will have mixed the two; undo that for + // error reporting. + err.(*PathError).Path = name + return nil, err } return f, nil } @@ -662,6 +661,8 @@ func (dir dirFS) Stat(name string) (fs.FileInfo, error) { } f, err := Stat(dir.join(name)) if err != nil { + // See comment in dirFS.Open. + err.(*PathError).Path = name return nil, err } return f, nil diff --git a/src/os/os_test.go b/src/os/os_test.go index 550b7db5a3327e4c8f5026ff23950fa4d48b7824..52fac4f63c452ab3282bb2945ee655d39c925758 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -2717,7 +2717,8 @@ func TestDirFS(t *testing.T) { t.Fatal(err) } - // Test that the error message does not contain a backslash. + // Test that the error message does not contain a backslash, + // and does not contain the DirFS argument. const nonesuch = "dir/nonesuch" _, err := fs.Open(nonesuch) if err == nil { @@ -2726,6 +2727,9 @@ func TestDirFS(t *testing.T) { if !strings.Contains(err.Error(), nonesuch) { t.Errorf("error %q does not contain %q", err, nonesuch) } + if strings.Contains(err.Error(), "testdata") { + t.Errorf("error %q contains %q", err, "testdata") + } } // Test that Open does not accept backslash as separator.