From: Alex Brainman Date: Wed, 30 Dec 2015 01:13:21 +0000 (+1100) Subject: os: change Open(`C:`) to open current directory on C: X-Git-Tag: go1.6beta2~176 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ca471573958c12093b1e3b29bc17926105d80143;p=gostls13.git os: change Open(`C:`) to open current directory on C: Open(`C:`) currently opens root directory on C:. Change that to open current directory on C:. Just like cmd.exe's "dir C:" command does. Just like FindFirstFile("C:*") Windows API does. It is also consistent with what filepath.Join("C:", "a") currently does. Fixes #13763 Change-Id: I60b6e7d80215d110bbbb6265c9f32717401638c6 Reviewed-on: https://go-review.googlesource.com/18184 Reviewed-by: Ian Lance Taylor Run-TryBot: Alex Brainman --- diff --git a/src/os/file_windows.go b/src/os/file_windows.go index b74c8f0631..bda495ec8c 100644 --- a/src/os/file_windows.go +++ b/src/os/file_windows.go @@ -90,7 +90,13 @@ func openFile(name string, flag int, perm FileMode) (file *File, err error) { } func openDir(name string) (file *File, err error) { - maskp, e := syscall.UTF16PtrFromString(name + `\*`) + var mask string + if len(name) == 2 && name[1] == ':' { // it is a drive letter, like C: + mask = name + `*` + } else { + mask = name + `\*` + } + maskp, e := syscall.UTF16PtrFromString(mask) if e != nil { return nil, e } diff --git a/src/os/os_windows_test.go b/src/os/os_windows_test.go index 3f4a01e983..5c073da991 100644 --- a/src/os/os_windows_test.go +++ b/src/os/os_windows_test.go @@ -9,6 +9,7 @@ import ( "os" osexec "os/exec" "path/filepath" + "sort" "strings" "syscall" "testing" @@ -179,3 +180,46 @@ func TestStatDir(t *testing.T) { t.Fatal("race condition occured") } } + +func TestOpenVolumeName(t *testing.T) { + tmpdir, err := ioutil.TempDir("", "TestOpenVolumeName") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpdir) + + wd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + err = os.Chdir(tmpdir) + if err != nil { + t.Fatal(err) + } + defer os.Chdir(wd) + + want := []string{"file1", "file2", "file3", "gopher.txt"} + sort.Strings(want) + for _, name := range want { + err := ioutil.WriteFile(filepath.Join(tmpdir, name), nil, 0777) + if err != nil { + t.Fatal(err) + } + } + + f, err := os.Open(filepath.VolumeName(tmpdir)) + if err != nil { + t.Fatal(err) + } + defer f.Close() + + have, err := f.Readdirnames(-1) + if err != nil { + t.Fatal(err) + } + sort.Strings(have) + + if strings.Join(want, "/") != strings.Join(have, "/") { + t.Fatalf("unexpected file list %q, want %q", have, want) + } +}