Cocoa Swift,在文件和目录上获取/设置隐藏标志

ngs*_*chr 1 macos cocoa ios swift

我想测试文件系统上的文件或目录是否有某个标志,在这种情况下是"隐藏"标志,然后设置或删除它.我知道这可以通过命令行,但我想知道我是否可以用Cocoa/Swift做到这一点?

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

例:

let fm = NSFileManager.defaultManager()

do {
    let testLibrary = try fm.attributesOfItemAtPath(dataPath)
    print (testLibrary)
} catch let error as NSError {
    print("JSON Error: \(error.localizedDescription)")
}
Run Code Online (Sandbox Code Playgroud)

收益:

["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]
Run Code Online (Sandbox Code Playgroud)

为了比较,当我ls -lO在我的主目录中,我看到以下(注意'库'上的隐藏标志):

drwx------+ 49 xjx  staff  -        1666 Jan 11 19:43 Downloads
drwx------@ 28 xjx  staff  -         952 Jan 11 08:40 Dropbox
drwx------@ 61 xjx  staff  hidden   2074 Oct 22 09:25 Library
drwx------+  7 xjx  staff  -         238 Apr 30  2015 Movies
drwx------+  5 xjx  staff  -         170 Jun 14  2015 Music
Run Code Online (Sandbox Code Playgroud)

Leo*_*bus 8

Xcode 9•Swift 4Xcode 8•Swift 3

extension URL {
    var isHidden: Bool {
        get {
            return (try? resourceValues(forKeys: [.isHiddenKey]))?.isHidden == true
        }
        set {
            var resourceValues = URLResourceValues()
            resourceValues.isHidden = newValue
            do {
                try setResourceValues(resourceValues)
            } catch {
                print("isHidden error:", error)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 现在我也学会了扩展.谢谢你的回答 ;-) (2认同)

Pau*_*son 5

您可以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)")
}
Run Code Online (Sandbox Code Playgroud)

关键方法是setResourceValue(_:forKey:error:) getResourceValue(_:forKey:error:)。在每种情况下,key参数都是 URL 的资源属性之一 - NSURL 类参考在页面底部提供了最常见的列表。


ngs*_*chr 2

以前的答案并没有完全起作用,但它们让我走上了正确的道路,所以我设法找到了满足我的需求的解决方案。

得到:

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
}
Run Code Online (Sandbox Code Playgroud)

环境:

let myUrl = NSURL(fileURLWithPath: "my/path")

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