【问题标题】:How to access file info programmatically on Mac?如何在 Mac 上以编程方式访问文件信息?
【发布时间】:2015-10-16 22:58:53
【问题描述】:

设置:

我的新 Mac (Yosemite) 上有一堆音频文件。当我右键单击任何文件并执行“获取信息”时,它会在“更多信息”标签下为我提供有关该歌曲的详细信息,例如

目标:

我需要编写一个程序来列出目录中的所有歌曲,如下所示:

Album, Title, Year Recorded
.
.
.

问题:

我不知道该怎么做。我是 Mac 的新手,Objective-C/SwiftObjective-CSwift 是我想写这个程序所必须使用的??)

是否有 API 可以让我以编程方式访问此文件信息?还有其他语言可以用来编写这种程序吗?我已经知道的东西,比如JavaPython 等?

到目前为止,我没有任何代码可以显示“到目前为止我已经尝试过什么”,因为我仍在寻找起点。任何指针将不胜感激。

【问题讨论】:

  • 您不必在Objective-C 中编写您的应用程序,您也可以使用Swift 来编写应用程序:)
  • 感谢您的信息,不幸的是我也从未使用过Swift。相应地更新了问题。

标签: objective-c macos swift


【解决方案1】:

如您所见,mdls 命令可以提供此元数据。您不应该尝试解析它。相反,您可以使用构建它的相同 API。

您需要为感兴趣的文件获取NSURL。然后,您可以获得其元数据属性的字典,如下所示:

MDItemRef item = MDItemCreateWithURL(NULL, (__bridge CFURLRef)url);
NSArray* names = @[ (__bridge NSString*)kMDItemAlbum, /* ... */ ];
NSDictionary* dictionary = CFBridgingRelease(MDItemCopyAttributes(item, (__bridge CFArrayRef)names));
CFRelease(item);

现在,dictionary 包含所需的属性。

【讨论】:

    【解决方案2】:

    所以,我找到了一种方法。

    Mac 确实提供了一个名为mdls 的实用程序,它列出了文件元数据。因此,如果我在 about 示例文件上执行 mdls,我会得到:

    myuser00m:Hindi myuser$ mdls Pani\ Da\ Rang.mp3 
    kMDItemAlbum                    = "Vicky Donor"
    kMDItemAlternateNames           = (
        "/Users/myuser/Documents/My Stuff/Music/Hindi/Pani Da Rang.mp3"
    )
    kMDItemAudioBitRate             = 165000
    kMDItemAudioChannelCount        = 2
    kMDItemAudioEncodingApplication = "Eac * Lame"
    kMDItemAudioSampleRate          = 44100
    kMDItemAuthors                  = (
        "Ayushmann Khurrana"
    )
    kMDItemComposer                 = "Music: Abhishek - Akshay"
    kMDItemContentCreationDate      = 2015-06-16 04:42:30 +0000
    kMDItemContentModificationDate  = 2015-06-16 04:42:30 +0000
    kMDItemContentType              = "public.mp3"
    kMDItemContentTypeTree          = (
        "public.mp3",
        "public.audio",
        "public.audiovisual-content",
        "public.data",
        "public.item",
        "public.content"
    )
    kMDItemCopyright                = "www.Songs.PK"
    kMDItemDateAdded                = 2015-07-26 19:52:49 +0000
    kMDItemDisplayName              = "Pani Da Rang"
    kMDItemDurationSeconds          = 240.8489795918368
    kMDItemFSContentChangeDate      = 2015-06-16 04:42:30 +0000
    kMDItemFSCreationDate           = 2015-06-16 04:42:30 +0000
    kMDItemFSCreatorCode            = ""
    kMDItemFSFinderFlags            = 0
    kMDItemFSHasCustomIcon          = (null)
    kMDItemFSInvisible              = 0
    kMDItemFSIsExtensionHidden      = 0
    kMDItemFSIsStationery           = (null)
    kMDItemFSLabel                  = 0
    kMDItemFSName                   = "Pani Da Rang.mp3"
    kMDItemFSNodeCount              = (null)
    kMDItemFSOwnerGroupID           = 784317889
    kMDItemFSOwnerUserID            = 376797083
    kMDItemFSSize                   = 5826388
    kMDItemFSTypeCode               = ""
    kMDItemKind                     = "MP3 audio"
    kMDItemLogicalSize              = 5826388
    kMDItemLyricist                 = "www.Songs.PK"
    kMDItemMediaTypes               = (
        Sound
    )
    kMDItemMusicalGenre             = "Bollywood"
    kMDItemPhysicalSize             = 5828608
    kMDItemRecordingYear            = 2012
    kMDItemTitle                    = "Pani Da Rang"
    kMDItemTotalBitRate             = 165000
    myuser00m:Hindi myuser$ 
    

    现在我需要编写一些代码来解析它并提取感兴趣的字段。

    显然,这不是很酷的解决方案,但在我找到更好的解决方案之前,这将是可行的。一旦我发现更好的东西,我会更新我的答案。

    【讨论】:

      猜你喜欢
      • 2015-02-03
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      相关资源
      最近更新 更多