英文:
How can I check if a file has a red tag label in Finder using Swift on MacOS?
问题
我正在为 MacOs 创建我的第一个项目。
我必须处理文件夹中的文件。我的目标是检查这些文件,并查看哪些元素通过 Finder 应用了红色标签。
我真的疯了,因为代码无法识别具有红色标签的图像。
这是我编写的函数。
这是 ViewController 中的代码。
英文:
I am creating my first project for MacOs.
I have to work on files in a folder. My goal is to check these files and see which elements have a red tag applied via Finder.
I am literally going crazy because the code cannot recognise the images with the red tag.
This is the function I have written.
 func isFileTaggedRed(at fileURL: URL) -> Bool {
        do {
            let resourceValues = try fileURL.resourceValues(forKeys: [.labelColorKey])
            if let labelColor = resourceValues.labelColor, labelColor == .red {
                return true
            }
        } catch {
            print("Error retrieving resource values for file: \(error)")
        }
        
        return false
    }
This is the code in the ViewController
for imageUrl in imageUrls {
            if isFileTaggedRed(at: imageUrl) {
                print("Skipping red tagged image: \(imageUrl.lastPathComponent)")
                continue
            }else{
                print("not tagged")
            }
        }
答案1
得分: 2
我不知道是否有更简单的方法来完成您所需的操作,但您可以获取文件的tagNames并检查是否包含"Red"。
extension URL {
    var isFileTaggedRed: Bool {
        tagNames.contains("Red")
    }
    var tagNames: [String] {
        (try? resourceValues(forKeys: [.tagNamesKey]))?.tagNames ?? []
    }
}
用法:
import Cocoa
class ViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let folderUrl = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first!
            .appendingPathComponent("untitled folder", isDirectory: true)
        let files = try! FileManager.default.contentsOfDirectory(at: folderUrl, includingPropertiesForKeys: nil)
        if let fileUrl = files.first {
            print("isTaggedRed:", fileUrl.isFileTaggedRed)
        }
    }
}
英文:
I don't know if there is an easier way to accomplish what you need but you can get the fileUrl tagNames and check if it contains "Red"
extension URL {
    var isFileTaggedRed: Bool {
        tagNames.contains("Red")
    }
    var tagNames: [String] {
        (try? resourceValues(forKeys: [.tagNamesKey]))?.tagNames ?? []
    }
}
Usage:
import Cocoa
class ViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let folderUrl = FileManager.default.urls(for: .desktopDirectory, in: .userDomainMask).first!
            .appendingPathComponent("untitled folder", isDirectory: true)
        let files = try! FileManager.default.contentsOfDirectory(at: folderUrl, includingPropertiesForKeys: nil)
        if let fileUrl = files.first {
            print("isTaggedRed:", fileUrl.isFileTaggedRed)
        }
    }
}
答案2
得分: 1
I haven't used labelColorKey before. It looks like the labelColor you get back is an NSColor. Colors are tricky in a color-managed system like MacOS. The color may be a shade of red but not the exact color you want. I would suggest logging the RGB values of your returned colors with NSColor.getRed(_:green:blue:alpha:). You're probably getting back a color that's close to, but not exactly equal to .red.
You might need to add code that checks to see if the RGB values are within a "wiggle room" range of .red (say each component is within .01 of the target color.)
Edit:
I just tried it, and when I added a red label to a file, I got back an NSColor that logs as NSCalibratedRGBColorSpace 0.980484 0.382818 0.347662 1
That will look red, but not fully saturated red.
Note that NSColor.red logs as sRGB IEC61966-2.1 colorspace 1 0 0 1 (100% red and no green or blue.)
Furthermore, when I look at a file with a red label, it does look like a slightly washed out red, not pure red.
Edit #2:
The code I used (in a command line tool) is as follows:
func fileColor(at fileURL: URL) -> NSColor? {
   do {
       let resourceValues = try fileURL.resourceValues(forKeys: [.labelColorKey])
       if let labelColor = resourceValues.labelColor {
           return labelColor
       }
   } catch {
       print("Error retrieving resource values for file: \(error)")
       return nil
   }
   
   return nil
}
let path = "~/Documents/RedFile.rtf"
let fixedPath = NSString(string: path).expandingTildeInPath
let fileURL = URL(filePath: fixedPath)
if let fileColor = fileColor(at: fileURL) {
    print("File color returned is \(fileColor)")
} else {
    print("Could not load file.")
}
(Note: I didn't translate the code, as requested.)
英文:
I haven't used labelColorKey before. It looks like the labelColor you get back is an NSColor. Colors are tricky in a color-managed system like MacOS. The color may be a shade of red but not the exact color you want. I would suggest logging the RGB values of your returned colors with NSColor.getRed(_:green:blue:alpha:). You're probably getting back a color that's close to, but not exactly equal to .red.
You might need to add code that checks to see if the RGB values are within a "wiggle room" range of .red (say each component is within .01 of the target color.)
Edit:
I just tried it, and when I added a red label to a file, I got back an NSColor that logs as NSCalibratedRGBColorSpace 0.980484 0.382818 0.347662 1
That will look red, but not fully saturated red.
Note that NSColor.red logs as sRGB IEC61966-2.1 colorspace 1 0 0 1 (100% red and no green or blue.)
Furthermore, when I look at a file with a red label, it does look like a slightly washed out red, not pure red.
Edit #2:
The code I used (in a command line tool) is as follows:
func fileColor(at fileURL: URL) -> NSColor? {
       do {
           let resourceValues = try fileURL.resourceValues(forKeys: [.labelColorKey])
           if let labelColor = resourceValues.labelColor {
               return labelColor
           }
       } catch {
           print("Error retrieving resource values for file: \(error)")
           return nil
       }
       
       return nil
   }
let path = "~/Documents/RedFile.rtf"
let fixedPath = NSString(string:path).expandingTildeInPath
let fileURL = URL(filePath: fixedPath)
if let fileColor = fileColor(at: fileURL) {
    print("File color returned is \(fileColor)")
} else {
    print("Could not load file.")
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论