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)
Xcode 9•Swift 4或Xcode 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)
您可以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 类参考在页面底部提供了最常见的列表。
以前的答案并没有完全起作用,但它们让我走上了正确的道路,所以我设法找到了满足我的需求的解决方案。
得到:
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)