liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
 
package os_test
 
import (
   "io/ioutil"
   "os"
   "strings"
   "syscall"
   "testing"
)
 
func TestFixLongPath(t *testing.T) {
   // 248 is long enough to trigger the longer-than-248 checks in
   // fixLongPath, but short enough not to make a path component
   // longer than 255, which is illegal on Windows. (which
   // doesn't really matter anyway, since this is purely a string
   // function we're testing, and it's not actually being used to
   // do a system call)
   veryLong := "l" + strings.Repeat("o", 248) + "ng"
   for _, test := range []struct{ in, want string }{
       // Short; unchanged:
       {`C:\short.txt`, `C:\short.txt`},
       {`C:\`, `C:\`},
       {`C:`, `C:`},
       // The "long" substring is replaced by a looooooong
       // string which triggers the rewriting. Except in the
       // cases below where it doesn't.
       {`C:\long\foo.txt`, `\\?\C:\long\foo.txt`},
       {`C:/long/foo.txt`, `\\?\C:\long\foo.txt`},
       {`C:\long\foo\\bar\.\baz\\`, `\\?\C:\long\foo\bar\baz`},
       {`\\unc\path`, `\\unc\path`},
       {`long.txt`, `long.txt`},
       {`C:long.txt`, `C:long.txt`},
       {`c:\long\..\bar\baz`, `c:\long\..\bar\baz`},
       {`\\?\c:\long\foo.txt`, `\\?\c:\long\foo.txt`},
       {`\\?\c:\long/foo.txt`, `\\?\c:\long/foo.txt`},
   } {
       in := strings.ReplaceAll(test.in, "long", veryLong)
       want := strings.ReplaceAll(test.want, "long", veryLong)
       if got := os.FixLongPath(in); got != want {
           got = strings.ReplaceAll(got, veryLong, "long")
           t.Errorf("fixLongPath(%q) = %q; want %q", test.in, got, test.want)
       }
   }
}
 
func TestMkdirAllExtendedLength(t *testing.T) {
   tmpDir, err := ioutil.TempDir("", "TestMkdirAllExtendedLength")
   if err != nil {
       t.Fatal(err)
   }
   defer os.RemoveAll(tmpDir)
 
   const prefix = `\\?\`
   if len(tmpDir) < 4 || tmpDir[:4] != prefix {
       fullPath, err := syscall.FullPath(tmpDir)
       if err != nil {
           t.Fatalf("FullPath(%q) fails: %v", tmpDir, err)
       }
       tmpDir = prefix + fullPath
   }
   path := tmpDir + `\dir\`
   err = os.MkdirAll(path, 0777)
   if err != nil {
       t.Fatalf("MkdirAll(%q) failed: %v", path, err)
   }
 
   path = path + `.\dir2`
   err = os.MkdirAll(path, 0777)
   if err == nil {
       t.Fatalf("MkdirAll(%q) should have failed, but did not", path)
   }
}