1 Câu hỏi: Làm cách nào tôi có thể truy cập nội dung văn bản (kMDItemTextContent) của NSMetadataItem trong Swift?

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đang cố gắng truy cập vào đại diện văn bản của kết quả NSMetadataQuery bằng Swift. Tuy nhiên, thuộc tính kMDItemTextContent chứa đại diện văn bản của tệp không tồn tại trên kết quả. Tôi có thể xác nhận rằng thuộc tính nên tồn tại vì tìm kiếm tệp bằng thuộc tính hoạt động hoàn hảo.

Đây là mã của tôi cho đến nay:

import Foundation
import Cocoa

class Indexer {
    public let spotlight = NSMetadataQuery()
    let backgroundQueue = OperationQueue()

    init() {
        let nc = NotificationCenter.default

        spotlight.searchScopes = []
        spotlight.predicate = NSPredicate(fromMetadataQueryString: "kMDItemKind == *")

        nc.addObserver(forName: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: nil, queue: self.backgroundQueue, using:{_ in
            self.spotlight.disableUpdates()
            for i in 0..<self.spotlight.resultCount {
                let result = self.spotlight.result(at: i) as! NSMetadataItem
                print("----- \(result.value(forAttribute: "kMDItemDisplayName") ?? "No title") -----")
                for attribute in result.attributes {
                    print("\(attribute):", result.value(forAttribute: attribute) ?? "No content")
                }
            }
            self.spotlight.enableUpdates()
        })

        spotlight.start()
    }
}

Kết quả hiện tại cho một tệp trông như thế này:

----- n26-csv-transactions.csv -----
kMDItemContentTypeTree: (
    "public.comma-separated-values-text",
    "public.data",
    "public.delimited-values-text",
    "public.plain-text",
    "public.item",
    "public.content",
    "public.text"
)
kMDItemContentType: public.comma-separated-values-text
kMDItemPhysicalSize: 16384
kMDItemDisplayName: n26-csv-transactions.csv
kMDItemKind: CSV Document
kMDItemContentCreationDate: 2019-04-25 17:09:08 +0000
kMDItemContentCreationDate_Ranking: 2019-04-25 00:00:00 +0000
kMDItemContentModificationDate: 2019-04-25 17:09:08 +0000
kMDItemInterestingDate_Ranking: 2019-05-08 00:00:00 +0000
kMDItemUsedDates: (
    "2019-05-07 22:00:00 +0000"
)
kMDItemLastUsedDate: 2019-05-08 10:00:33 +0000
kMDItemLastUsedDate_Ranking: 2019-05-08 00:00:00 +0000
kMDItemUseCount: 3
kMDItemLogicalSize: 591
kMDItemWhereFroms: (
    "https://app.n26.com/download-csv",
    "https://app.n26.com/downloads"
)
kMDItemFSName: n26-csv-transactions.csv
kMDItemFSSize: 591
kMDItemFSCreationDate: 2019-04-25 17:09:08 +0000
kMDItemFSContentChangeDate: 2019-04-25 17:09:08 +0000
kMDItemFSOwnerUserID: 99
kMDItemFSOwnerGroupID: 99
kMDItemFSNodeCount: No content
kMDItemFSInvisible: 0
kMDItemFSTypeCode: 0
kMDItemFSCreatorCode: 0
kMDItemFSFinderFlags: 0
kMDItemFSHasCustomIcon: No content
kMDItemFSIsExtensionHidden: 0
kMDItemFSIsStationery: No content
kMDItemFSLabel: 0

Thuộc tính kMDItemTextContent dường như bị thiếu ở đây.

Có cách nào để truy cập thuộc tính đó bằng cách sử dụng NSMetadataItem được Spotlight trả về không? Nếu không, có cách nào khác để truy cập vào bản trình bày văn bản của tệp không?

    
0
1 Câu trả lời                              1                         
  

Có cách nào để truy cập thuộc tính đó bằng NSMetadataItems được Spotlight trả về không? Nếu không, có cách nào khác để truy cập vào bản trình bày văn bản của tệp không?

Trong một từ: không. Đọc docs trên thuộc tính đó:

  

Chứa một văn bản đại diện cho nội dung của tài liệu. Dữ liệu trong nhiều trường nên được kết hợp bằng cách sử dụng ký tự khoảng trắng làm dấu phân cách. Trình nhập Spotlight của ứng dụng cung cấp nội dung của thuộc tính này.    Ứng dụng có thể tạo truy vấn bằng thuộc tính này, nhưng không thể đọc trực tiếp giá trị của thuộc tính này . [Nhấn mạnh của tôi.]

Thông tin nội dung văn bản đi vào chỉ mục Spotlight để, như bạn đã quan sát, bạn có thể tìm kiếm trên đó. Nhưng bạn không thể có được nó cho chính mình bằng mọi cách. Nó không tồn tại trong bất kỳ hình thức đối mặt với lập trình viên công cộng nào.

(Chỉ cần đưa ra một ví dụ, lệnh mdls hiện tại về cơ bản chỉ là những gì mã của bạn làm - bạn có thể tự giải quyết rắc rối bằng cách chạy mdls trong một Quá trình. Chà, nếu bạn đưa ra lệnh mdls trong Terminal, bạn sẽ thắng t thấy kMDItemTextContent được liệt kê trong số các thuộc tính, ngay cả khi nội dung của tệp này được lập chỉ mục.)

Để xem lý do tại sao, hãy nghĩ về quyền riêng tư. Nếu bạn có thể đọc bản trình bày văn bản của mọi tệp trên máy tính của người dùng chỉ vì bạn có quyền truy cập vào Spotlight, bạn sẽ biết tất cả dữ liệu trên máy tính của người dùng. Trừ khi bạn là một loại hacker xấu xa, bạn thậm chí không muốn điều đó. Để tìm hiểu những gì trong một tệp, mở tệp - nếu bạn có thể.

Vậy thuộc tính này là gì? Để bạn có thể cung cấp văn bản cho Spotlight trong loại tệp thuộc về bạn bằng cách nhập trình nhập Spotlight tùy chỉnh.

    
2
2019-05-08 21: 36: 21Z
  1. Cảm ơn! Tôi đã không nghĩ về khía cạnh riêng tư, điều đó có ý nghĩa.
    2019-05-08 22: 33: 01Z
nguồn đặt đây