Ios Cocoa Swift,在文件和目录上设置隐藏(可见/不可见)标志

Ios Cocoa Swift,在文件和目录上设置隐藏(可见/不可见)标志,ios,swift,macos,cocoa,Ios,Swift,Macos,Cocoa,我想测试文件系统上的文件或目录是否有某个标志,在本例中是“隐藏”标志,然后设置或删除它。我知道这可以通过命令行实现,但我想知道是否可以使用Cocoa/Swift来实现 我尝试使用NSFileManagerattributesFiteMatPath,但返回的对象不包含标志 例如: let fm = NSFileManager.defaultManager() do { let testLibrary = try fm.attributesOfItemAtPath(dataPath)

我想测试文件系统上的文件或目录是否有某个标志,在本例中是“隐藏”标志,然后设置或删除它。我知道这可以通过命令行实现,但我想知道是否可以使用Cocoa/Swift来实现

我尝试使用
NSFileManager
attributesFiteMatPath
,但返回的对象不包含标志

例如:

let fm = NSFileManager.defaultManager()

do {
    let testLibrary = try fm.attributesOfItemAtPath(dataPath)
    print (testLibrary)
} catch let error as NSError {
    print("JSON Error: \(error.localizedDescription)")
}
返回:

["NSFileCreationDate": 2013-08-16 21:37:57 +0000,
 "NSFileGroupOwnerAccountName": staff, 
 "NSFileType": NSFileTypeDirectory, 
 "NSFileSystemNumber": 16777220, 
 "NSFileOwnerAccountName": xjx, 
 "NSFileReferenceCount": 61, 
 "NSFileModificationDate": 2015-10-22 07:25:12 +0000, 
 "NSFileExtensionHidden": 0, 
 "NSFileSize": 2074,
 "NSFileGroupOwnerAccountID": 20, 
 "NSFileOwnerAccountID": 501, 
 "NSFilePosixPermissions": 448, 
 "NSFileSystemFileNumber": 603923]
为了进行比较,当我在我的主目录中执行
ls-lO
时,我会看到以下内容(注意“Library”上的隐藏标志):


您可以为此使用
NSURL
API;下面是一个例子:

// Create an NSURL object
let url = NSURL(fileURLWithPath: "/path/to/some/file.txt")!

// Catching errors
var error: NSError?

// Setting isHidden
let isHidden = NSNumber(bool: true)
if !url.setResourceValue(isHidden, forKey: NSURLIsHiddenKey, error: &error) {
    println(error?.localizedDescription)
}

// Getting isHidden
var value: AnyObject?
if !url.getResourceValue(&value, forKey: NSURLIsHiddenKey, error: &error) {
   println(error?.localizedDescription)
} else {
    var boolAsString = (value as! NSNumber).boolValue ? "TRUE" : "FALSE"
    println("\(url.path!) is hidden: \(boolAsString)")
}
关键的方法是
setResourceValue(uwy:forKey:error:)


getResourceValue(uu3;:forKey:error:)
。在每种情况下,
参数都是URL的资源属性之一-在页面底部提供了最常见的资源属性列表

Xcode 11•Swift 5Xcode 9•Swift 4Xcode 8•Swift 3

扩展URL{
///'true'隐藏(不可见)或'false'不隐藏(可见)
var isHidden:布尔{
得到{
返回(try?resourceValues(forKeys:[.isHiddenKey])?.isHidden==true
}
设置{
var resourceValues=URLResourceValues()
resourceValues.isHidden=newValue
做{
尝试设置resourceValues(resourceValues)
}抓住{
打印(“isHidden错误:,错误)
}
}
}
}

前面的答案并不完全有效,但它们让我走上了正确的道路,所以我设法找到了一个满足我需求的解决方案

获取:

let myUrl = NSURL(fileURLWithPath: "my/path")
var isHidden: AnyObject?

do {
    try myUrl.getResourceValue(&isHidden, forKey: NSURLIsHiddenKey)
    return (isHidden as? NSNumber)?.boolValue ?? false
} catch let error as NSError {
    print(error.debugDescription)
    return false
}
let myUrl = NSURL(fileURLWithPath: "my/path")

do {
    try libraryUrl.setResourceValue(true, forKey: NSURLIsHiddenKey)
} catch let error as NSError {
    print(error.localizedDescription)
    return
}
设置:

let myUrl = NSURL(fileURLWithPath: "my/path")
var isHidden: AnyObject?

do {
    try myUrl.getResourceValue(&isHidden, forKey: NSURLIsHiddenKey)
    return (isHidden as? NSNumber)?.boolValue ?? false
} catch let error as NSError {
    print(error.debugDescription)
    return false
}
let myUrl = NSURL(fileURLWithPath: "my/path")

do {
    try libraryUrl.setResourceValue(true, forKey: NSURLIsHiddenKey)
} catch let error as NSError {
    print(error.localizedDescription)
    return
}

现在我也学会了扩展。谢谢你的回答;-)