iOS通过文件后缀识别文件类型

2,310 阅读2分钟

在做的macCatalyst项目中有一个新需求,要求能够对正在播放的视频进行打点输出记录当前帧数及相应动作记录并输出。这个需求涉及到视频文件和记录文本文件的读取,这就涉及到两种格式文件-视频格式文件和文本格式文件。有两种方案:

1.对当前操作进行标记以区分对应文件

//设置tag
var selectTag = 0 //0-视频,1-文本
//记录操作,改变tag
 @objc func didTapActionBtn(sender:UIButton){
    self.selectTag  = sender.tag == 3000 ? 0 : 1
 }
//在delegate内做对应操作
 func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
    ...
   if self.selectTag == 0{//视频格式文件操作
    ...
   }else self.selectTag == 1{//文本格式文件操作
    ...
   }
    ...
}

2.通过所选择文件的后缀名进行格式识别

第一种方法虽然简单粗暴,但不适用于多种文本格式,不能全部都打上tag来进行区分。通过后缀名进行时识别相对会更清晰一些,文件名是唯一的,文件后缀名一般也都对应正确的文件格式。通过后缀名来解析对应格式也做到了职能单一化,将功能剥离更清晰。话不多少,show me code

1.导入MobileCoreServices库
  import MobileCoreServices
2.选择文件后进行文件格式解析
 func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
    ...
            let fileExt = url.pathExtension //url为所选文件路径
            let uttype = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,fileExt as CFString,nil)
            switch uttype?.takeRetainedValue(){
            case kUTTypeMovie:
                print("这是一个视频文件")
            case kUTTypeText:
                print("这是一个文本文件")
            default:
                break
            }
            }
    ...
}

ps:常见格式枚举类型(uniform type)

文本格式:
public let kUTTypeText: CFString
public let kUTTypePlainText: CFString
public let kUTTypeHTML: CFString
图片格式:
public let kUTTypeImage: CFString
public let kUTTypeJPEG: CFString
public let kUTTypeGIF: CFString
public let kUTTypePNG: CFString
视频格式:
public let kUTTypeMovie: CFString
public let kUTTypeVideo: CFString
public let kUTTypeQuickTimeMovie: CFString
public let kUTTypeMPEG: CFString
public let kUTTypeMPEG4: CFString