2015-03-10 14 views
11

Tôi đã thấy vô số ví dụ và hướng dẫn cho thấy cách tạo tệp và tất cả chúng đều "lừa" bằng cách chỉ cần đặt bit quyền của tệp. Tôi muốn biết/tìm hiểu làm thế nào để đúng cách os.FileMode để cung cấp cho một nhà văn trong quá trình tạo/cập nhật của một tập tin.Golang đúng cách khởi tạo os.FileMode

Một ví dụ thô này dưới đây:

func FileWrite(path string, r io.Reader, uid, gid int, perms string) (int64, error){ 
    w, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0664) 
    if err != nil { 
     if path == "" { 
      w = os.Stdout 
     } else { 
      return 0, err 
     } 
    } 
    defer w.Close() 

    size, err := io.Copy(w, r) 

    if err != nil { 
     return 0, err 
    } 
    return size, err 
} 

Trong các chức năng cơ bản trên bit quyền 0664 được thiết lập và mặc dù điều này có thể làm cho tinh thần đôi khi tôi muốn có một cách đúng đắn của thiết lập các chế độ File một cách chính xác. Như đã thấy ở trên một ví dụ phổ biến là UID/GID được biết đến và đã được cung cấp dưới dạng giá trị int và các perms là các chữ số bát phân đã được thu thập trước đó và chèn vào một db dưới dạng một chuỗi.

Trả lời

16

FileMode chỉ là một uint32. http://golang.org/pkg/os/#FileMode

Đặt qua hằng số không phải là "gian lận", bạn sử dụng nó như các giá trị số khác. Nếu bạn không sử dụng một hằng số, bạn có thể sử dụng một chuyển đổi trên giá trị số hợp lệ:

mode := int(0777) 
os.FileMode(mode) 
+0

Cảm ơn Jim, luôn hữu ích! –

+3

Trừ khi tôi bị nhầm lẫn nhiều, điều này không hữu ích nếu bạn đang cố gắng để có một số tập tin có thể ghi được và một số thì không. Có thể có hoặc trong (ví dụ) 0200 để bật người dùng có thể ghi, nhưng nó sẽ hỗ trợ khả năng đọc mã nếu có hằng số hệ điều hành để kiểm soát điều này. Vâng, tôi hy vọng mọi lập trình viên có giá trị muối của họ để biết sự cho phép octal unix nhưng nó vẫn là một chương trình xấu để sử dụng một giá trị phép thuật khi một tên mô tả có thể được sử dụng. Theo như tôi có thể nói các thư viện tiêu chuẩn đang thiếu điều này và chỉ mong đợi mọi người đã ghi nhớ các hằng số cho phép của tập tin Unix. –

7

sửa chữa của tôi đã được xác định hằng số của riêng tôi như tôi không thể tìm thấy bất kỳ trong os hoặc syscall:

const (
     OS_READ = 04 
     OS_WRITE = 02 
     OS_EX = 01 
     OS_USER_SHIFT = 6 
     OS_GROUP_SHIFT = 3 
     OS_OTH_SHIFT = 0 

     OS_USER_R = OS_READ<<OS_USER_SHIFT 
     OS_USER_W = OS_WRITE<<OS_USER_SHIFT 
     OS_USER_X = OS_EX<<OS_USER_SHIFT 
     OS_USER_RW = OS_USER_R | OS_USER_W 
     OS_USER_RWX = OS_USER_RW | OS_USER_X 

     OS_GROUP_R = OS_READ<<OS_GROUP_SHIFT 
     OS_GROUP_W = OS_WRITE<<OS_GROUP_SHIFT 
     OS_GROUP_X = OS_EX<<OS_GROUP_SHIFT 
     OS_GROUP_RW = OS_GROUP_R | OS_GROUP_W 
     OS_GROUP_RWX = OS_GROUP_RW | OS_GROUP_X 

     OS_OTH_R = OS_READ<<OS_OTH_SHIFT 
     OS_OTH_W = OS_WRITE<<OS_OTH_SHIFT 
     OS_OTH_X = OS_EX<<OS_OTH_SHIFT 
     OS_OTH_RW = OS_OTH_R | OS_OTH_W 
     OS_OTH_RWX = OS_OTH_RW | OS_OTH_X 

     OS_ALL_R = OS_USER_R | OS_GROUP_R | OS_OTH_R 
     OS_ALL_W = OS_USER_W | OS_GROUP_W | OS_OTH_W 
     OS_ALL_X = OS_USER_X | OS_GROUP_X | OS_OTH_X 
     OS_ALL_RW = OS_ALL_R | OS_ALL_W 
     OS_ALL_RWX = OS_ALL_RW | OS_GROUP_X 
) 

này sau đó cho phép tôi để xác định ý định của tôi trực tiếp:

 // Create any directories needed to put this file in them 
     var dir_file_mode os.FileMode 
     dir_file_mode = os.ModeDir | (OS_USER_RWX | OS_ALL_R) 
     os.MkdirAll(dir_str, dir_file_mode) 

tôi chắc chắn rằng điều này có thể được cải thiện bằng cách sử dụng các iota, và một số kết hợp nhiều điều khoản, nhưng nó làm việc cho tôi vào lúc này.

+1

Chris điều này thực sự hữu ích và thực tế là câu hỏi 2 năm + cũ này vẫn đang được theo dõi/cập nhật cho thấy nhu cầu về hằng số có sẵn trong stdlib. –

Các vấn đề liên quan