| // Package longpath introduces some constants and helper functions for handling | |
| // long paths in Windows. | |
| // | |
| // Long paths are expected to be prepended with "\\?\" and followed by either a | |
| // drive letter, a UNC server\share, or a volume identifier. | |
| package longpath // import "github.com/docker/docker/pkg/longpath" | |
| import ( | |
| "os" | |
| "runtime" | |
| "strings" | |
| ) | |
| // Prefix is the longpath prefix for Windows file paths. | |
| const Prefix = `\\?\` | |
| // AddPrefix adds the Windows long path prefix to the path provided if | |
| // it does not already have it. | |
| func AddPrefix(path string) string { | |
| if !strings.HasPrefix(path, Prefix) { | |
| if strings.HasPrefix(path, `\\`) { | |
| // This is a UNC path, so we need to add 'UNC' to the path as well. | |
| path = Prefix + `UNC` + path[1:] | |
| } else { | |
| path = Prefix + path | |
| } | |
| } | |
| return path | |
| } | |
| // MkdirTemp is the equivalent of [os.MkdirTemp], except that on Windows | |
| // the result is in Windows longpath format. On Unix systems it is | |
| // equivalent to [os.MkdirTemp]. | |
| func MkdirTemp(dir, prefix string) (string, error) { | |
| tempDir, err := os.MkdirTemp(dir, prefix) | |
| if err != nil { | |
| return "", err | |
| } | |
| if runtime.GOOS != "windows" { | |
| return tempDir, nil | |
| } | |
| return AddPrefix(tempDir), nil | |
| } |