2011-12-14 66 views
0

我目前以下列方式使用open() NSData的文件寫入的方法寫出來的文件寫出來的文件:使用open(),使得文件權限是保證相同使用

NSString *path = @"/Users/enchilada/Desktop/file.txt"; 
int fd = open([path fileSystemRepresentation], 
       O_EXCL | O_CREAT | O_WRONLY, 
       S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); 

我的問題是第三個參數。從某種意義上說,它是「正確的」,它在所有情況下都能保證獲得完全相同的許可,如NSData的常規writeToFile:方法?

我想在使用普通的open()而不是使用Cocoa的方法寫出文件時獲得相應的「默認」權限。

我已經找到了上述權限(RW-RW-RW-)工作,因爲的umask實際上帶來了下來到(RW-R - R--)。但我的問題是:這是否總是有保證?我的第三個參數應該是什麼?

+0

,我認爲通常你通過`0644`(如RW-R - R- - )作爲「open()」的權限,當你沒有特別需要不同的權限時。我只能猜測,但我會假設這就是'NSData`所做的。 – 2011-12-14 19:59:56

+0

是的,這不會是一個錯誤的猜測,但我想完全確定;) – Enchilada 2011-12-14 20:04:44

+0

要完全確定的唯一方法是以某種方式獲得對基金會的源訪問權,並且您永遠不會擁有該基金會。但是,如果您想要更低級別的方式來訪問文件,但仍然使用Cocoa,則可以使用[NSFileHandle](http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/ NSFileHandle_Class /),它提供了一個類方法,它將在一個路徑上創建一個文件並打開它進行寫入。人們可以認爲這與NSData的方法使用相同的默認權限。 – 2011-12-14 20:08:42

回答

2

我們可以找到使用dtruss。這裏是我的測試程序:

#import <Foundation/Foundation.h> 
int main (int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     [[NSData dataWithBytes:"hello\n" length:6] writeToFile:@"/tmp/data.out" atomically:NO]; 
    } 
    return 0; 
} 

這裏是我的運行日誌:

$ sudo dtruss ~/Library/Dev*/Xcode/De*/datatest-*/B*/P*/D*/datatest 2>&1 | fgrep data.out 
open("/tmp/data.out\0", 0x601, 0x1B6)  = 3 0 

六角0x1B6是八進制0666

2

是0666是正確的(至少在iOS 5中),但第二個參數是O_CREAT | O_TRUNC | O_WRONLY,如果你不寫原子(和O_CREAT | O_EXCL | O_RDWR上的臨時文件,如果寫的原子。)

其實你可以運行你的程序在調試器中,設置一箇中斷點open,然後檢查第三個參數(gdb中的p/o $r2 for ARM)以確保。

相關問題