From ca471573958c12093b1e3b29bc17926105d80143 Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Wed, 30 Dec 2015 12:13:21 +1100 Subject: [PATCH] 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 --- src/os/file_windows.go | 8 ++++++- src/os/os_windows_test.go | 44 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) 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) + } +} -- 2.50.0