|
5 | 5 | package sshlib
|
6 | 6 |
|
7 | 7 | import (
|
| 8 | + "fmt" |
8 | 9 | "os"
|
9 | 10 | "path/filepath"
|
10 | 11 | "strconv"
|
@@ -47,30 +48,25 @@ type SFTPFS struct {
|
47 | 48 |
|
48 | 49 | // Create
|
49 | 50 | func (fs *SFTPFS) Create(filename string) (billy.File, error) {
|
50 |
| - _, err := fs.Stat(filename) |
51 |
| - if err == nil { |
52 |
| - return nil, os.ErrExist |
53 |
| - } |
54 |
| - |
55 |
| - dir := filepath.Dir(filename) |
56 |
| - err = fs.MkdirAll(dir, os.ModeDir) |
57 |
| - if err != nil { |
58 |
| - return nil, err |
59 |
| - } |
60 |
| - |
61 |
| - f, err := fs.Client.Create(filename) |
62 |
| - if err != nil { |
63 |
| - return nil, err |
64 |
| - } |
65 |
| - return &sftpFile{File: f}, nil |
| 51 | + return fs.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) |
66 | 52 | }
|
67 | 53 |
|
68 | 54 | // OpenFile
|
69 | 55 | func (fs *SFTPFS) OpenFile(filename string, flag int, perm os.FileMode) (billy.File, error) {
|
70 |
| - // TODO: create dirをする |
71 |
| - // https://github.com/src-d/go-billy/blob/master/osfs/os.go#L31-L54 |
| 56 | + return fs.openFile(filename, flag, perm, fs.createDir) |
| 57 | +} |
| 58 | + |
| 59 | +func (fs *SFTPFS) openFile(fn string, flag int, perm os.FileMode, createDir func(string) error) (billy.File, error) { |
| 60 | + if flag&os.O_CREATE != 0 { |
| 61 | + if createDir == nil { |
| 62 | + return nil, fmt.Errorf("createDir func cannot be nil if file needs to be opened in create mode") |
| 63 | + } |
| 64 | + if err := createDir(fn); err != nil { |
| 65 | + return nil, err |
| 66 | + } |
| 67 | + } |
72 | 68 |
|
73 |
| - f, err := fs.Client.OpenFile(filename, flag) |
| 69 | + f, err := fs.Client.OpenFile(fn, flag) |
74 | 70 | if err != nil {
|
75 | 71 | return nil, err
|
76 | 72 | }
|
|
0 commit comments