【问题标题】:Cocoa Swift, get/set hidden (visible/invisible) flag on files and directoriesCocoa Swift,在文件和目录上获取/设置隐藏(可见/不可见)标志
【发布时间】:2016-01-12 10:58:25
【问题描述】:

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

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

示例:

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 时,我看到以下内容(注意“库”上的隐藏标志):

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

【问题讨论】:

    标签: ios swift macos cocoa


    【解决方案1】:

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

    extension URL {
        /// `true` is hidden (invisible) or `false` is not hidden (visible)
        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)
                }
            }
        }
    }
    

    【讨论】:

    • 现在我也了解了扩展。感谢您的回答;-)
    【解决方案2】:

    您可以为此使用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(_:forKey:error:) getResourceValue(_:forKey:error:)。在每种情况下,key 参数都是 URL 的资源属性之一 - NSURL class reference 在页面底部提供了最常见的列表。

    【讨论】:

      【解决方案3】:

      以前的答案并不完全奏效,但它们让我走上了正确的道路,因此我设法找到了满足我需求的解决方案。

      得到:

      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
      }
      

      【讨论】:

        猜你喜欢
        • 2019-11-09
        • 2020-02-28
        • 1970-01-01
        • 2012-05-10
        • 2021-05-12
        • 1970-01-01
        • 2022-08-13
        • 2012-07-11
        • 2019-09-24
        相关资源
        最近更新 更多