2017-08-16 103 views
1

根據蘋果的文檔,我們可以設置很多屬性的文件斯威夫特設置一些字符串值文件屬性

含有作爲鍵的屬性爲路徑和設置字典的值對應的值屬性。您可以設置以下屬性:busy,creationDate,extensionHidden,groupOwnerAccountID,groupOwnerAccountName,hfsCreatorCode,hfsTypeCode,immutable,modificationDate,ownerAccountID,ownerAccountName,posixPermissions。您可以更改單個屬性或任何屬性組合;您無需爲所有屬性指定鍵。

我想爲文件設置一個額外的參數。該參數是一個字符串,我找不到任何可以設置String的屬性。 例如,我試圖

try FileManager.default.setAttributes([FileAttributeKey.ownerAccountName: NSString(string: "0B2TwsHM7lBpSMU1tNXVfSEp0RGs"), FileAttributeKey.creationDate: date], ofItemAtPath: filePath.path) 

但是當我打開鑰匙

let keys = try FileManager.default.attributesOfItem(atPath: filePath.path) 
print(keys) 

我只得到.creationDate改變

[__C.FileAttributeKey(_rawValue: NSFileType): NSFileTypeRegular, 
__C.FileAttributeKey(_rawValue: NSFilePosixPermissions): 420, 
__C.FileAttributeKey(_rawValue: NSFileSystemNumber): 16777220, 
__C.FileAttributeKey(_rawValue: NSFileReferenceCount): 1, 
__C.FileAttributeKey(_rawValue: NSFileGroupOwnerAccountName): staff, 
__C.FileAttributeKey(_rawValue: NSFileSystemFileNumber): 8423614, 
__C.FileAttributeKey(_rawValue: NSFileGroupOwnerAccountID): 20, 
__C.FileAttributeKey(_rawValue: NSFileModificationDate): 2017-08-16 06:03:57 +0000, 
__C.FileAttributeKey(_rawValue: NSFileCreationDate): 1970-01-01 00:33:20 +0000, 
__C.FileAttributeKey(_rawValue: NSFileSize): 9795, 
__C.FileAttributeKey(_rawValue: NSFileExtensionHidden): 0, 
__C.FileAttributeKey(_rawValue: NSFileOwnerAccountID): 501] 

有沒有我可以字符串值設置爲FileAttribute任何方式?

+0

或許權限問題?只有文件(和根)的所有者才能更改所有者屬性。 –

+0

不,但我試圖使用root用戶的帳戶名稱,並且也無法正常工作。 – Alex

回答

3

該文檔顯示「您可以設置下列屬性」。這意味着您只能通過這些API設置這些特定屬性。

你真正想要的是Extended Attributes,它們使用一組獨立的(C風格)API。

喜歡的東西:

let directory = NSTemporaryDirectory() 
let someExampleText = "some sample text goes here" 
do { 
    try someExampleText.write(toFile: "\(directory)/test.txt", atomically: true, encoding: .utf8) 
} catch let error { 
    print("error while writing is \(error.localizedDescription)") 
} 
let valueString = "setting some value here" 
let result = setxattr("\(directory)/test.txt", "com.stackoverflow.test", valueString, valueString.characters.count, 0, 0) 

print("result is \(result) ; errno is \(errno)") 
if errno != 0 
{ 
    perror("could not save") 
} 

let sizeOfRetrievedValue = getxattr("\(directory)/test.txt", "com.stackoverflow.test", nil, 0, 0, 0) 

var data = Data(count: sizeOfRetrievedValue) 

let newResult = data.withUnsafeMutableBytes({ 
    getxattr("\(directory)/test.txt", "com.stackoverflow.test", $0, data.count, 0, 0) 
}) 

if let resultString = String(data: data, encoding: .utf8) 
{ 
    print("retrieved string is \(resultString)") 
} 
+0

對不起,我刪除了我最後的評論。 - 是的,這可能是一個無效的所有者或權限問題。 –

+0

是的......我刪除了你的評論後刪除了我的評論。我在說爲'FileAttributeKey.ownerAccountName'傳入的古怪的userid字符串看起來不像一個有效的用戶id,所以我在考慮操作系統正在做一些驗證,並且不允許發生該屬性的更改。 –

+0

是的,我終於找到了一個解決方案。 https://stackoverflow.com/questions/38343186/write-extend-file-attributes-swift-example – Alex