swiftUI 之FileManager的操作

//1)首先我们获取用户文档目录路径
       
        let manager = FileManager.default
        let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)
        let url = urlForDocument[0] as URL
        print(url)
        
        
//2)对指定路径执行浅搜索,返回指定目录路径下的文件、子目录及符号链接的列表
       
        let contentsOfPath = try? manager.contentsOfDirectory(atPath: url.path)
        print("contentsOfPath: \(contentsOfPath)")
        
        
//3)类似上面的,对指定路径执行浅搜索,返回指定目录路径下的文件、子目录及符号链接的列表
       
        let contentsOfURL = try? manager.contentsOfDirectory(at: url,
                                                             includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
        print("contentsOfURL: \(contentsOfURL)")
       
        
//4)深度遍历,会递归遍历子文件夹(但不会递归符号链接)
      
        let enumeratorAtPath = manager.enumerator(atPath: url.path)
        print("enumeratorAtPath: \(enumeratorAtPath?.allObjects)")
    
        
//5)类似上面的,深度遍历,会递归遍历子文件夹(但不会递归符号链接)
      
        let enumeratorAtURL = manager.enumerator(at: url, includingPropertiesForKeys: nil,
                                                 options: .skipsHiddenFiles, errorHandler:nil)
        print("enumeratorAtURL: \(enumeratorAtURL?.allObjects)")
       
        
//6)深度遍历,会递归遍历子文件夹(包括符号链接,所以要求性能的话用enumeratorAtPath)
        
        let subPaths = manager.subpaths(atPath: url.path)
        print("subPaths: \(subPaths)")
       
        
//        2,判断文件或文件夹是否存在
        
        let fileManager = FileManager.default
        let filePath:String = NSHomeDirectory() + "/Documents/hangge.txt"
        let exist = fileManager.fileExists(atPath: filePath)
        
//        3,创建文件夹
//        方式1:
       
        let myDirectory:String = NSHomeDirectory() + "/Documents/myFolder/Files"
        let fileManager = FileManager.default
        
        //withIntermediateDirectories为ture表示路径中间如果有不存在的文件夹都会创建
        try! fileManager.createDirectory(atPath: myDirectory,
                                         withIntermediateDirectories: true, attributes: nil)
//        方式2:
       
      
        func createFolder(name:String,baseUrl:NSURL){
            let manager = FileManager.default
            let folder = baseUrl.appendingPathComponent(name, isDirectory: true)
            print("文件夹: \(folder)")
            let exist = manager.fileExists(atPath: folder!.path)
            if !exist {
                try! manager.createDirectory(at: folder!, withIntermediateDirectories: true,
                                             attributes: nil)
            }
        }
        
        //在文档目录下新建folder目录
        let manager = FileManager.default
        let urlForDocument = manager.urls(for: .documentDirectory, in: .userDomainMask)
        let url = urlForDocument[0] as NSURL
        createFolder(name: "folder", baseUrl: url)
        
//        4,将对象写入文件
//        可以通过write(to:)方法,可以创建文件并将对象写入,对象包括String,NSString,UIImage,NSArray,NSDictionary等。
//        (1)把String保存到文件
//
        let filePath:String = NSHomeDirectory() + "/Documents/hangge.txt"
        let info = "欢迎来到hange.com"
        try! info.write(toFile: filePath, atomically: true, encoding: String.Encoding.utf8)
        
//        (2)把图片保存到文件路径下
        
        let filePath = NSHomeDirectory() + "/Documents/hangge.png"
        let image = UIImage(named: "apple.png")
        let data:Data = UIImagePNGRepresentation(image!)!
        try? data.write(to: URL(fileURLWithPath: filePath))
        
//        (3)把NSArray保存到文件路径下
       
        let array = NSArray(objects: "aaa","bbb","ccc")
        let filePath:String = NSHomeDirectory() + "/Documents/array.plist"
        array.write(toFile: filePath, atomically: true)
        
//        (4)把NSDictionary保存到文件路径下
        
        let dictionary:NSDictionary = ["Gold": "1st Place", "Silver": "2nd Place"]
        let filePath:String = NSHomeDirectory() + "/Documents/dictionary.plist"
        dictionary.write(toFile: filePath, atomically: true)
        
//        5,创建文件
        
      
        func createFile(name:String, fileBaseUrl:URL){
            let manager = FileManager.default
            
            let file = fileBaseUrl.appendingPathComponent(name)
            print("文件: \(file)")
            let exist = manager.fileExists(atPath: file.path)
            if !exist {
                let data = Data(base64Encoded:"aGVsbG8gd29ybGQ=" ,options:.ignoreUnknownCharacters)
                let createSuccess = manager.createFile(atPath: file.path,contents:data,attributes:nil)
                print("文件创建结果: \(createSuccess)")
            }
        }
        
        //在文档目录下新建test.txt文件
        let manager = FileManager.default
        let urlForDocument = manager.urls( for: .documentDirectory,
                                           in:.userDomainMask)
        let url = urlForDocument[0]
        createFile(name:"test.txt", fileBaseUrl: url)
        //createFile(name: "folder/new.txt", fileBaseUrl: url)
        
//        6,复制文件
//        (1)方法1
      
        let fileManager = FileManager.default
        let homeDirectory = NSHomeDirectory()
        let srcUrl = homeDirectory + "/Documents/hangge.txt"
        let toUrl = homeDirectory + "/Documents/copyed.txt"
        try! fileManager.copyItem(atPath: srcUrl, toPath: toUrl)
        
//        (2)方法2
       
        // 定位到用户文档目录
        let manager = FileManager.default
        let urlForDocument = manager.urls( for:.documentDirectory, in:.userDomainMask)
        let url = urlForDocument[0]
        
        // 将test.txt文件拷贝到文档目录根目录下的copyed.txt文件
        let srcUrl = url.appendingPathComponent("test.txt")
        let toUrl = url.appendingPathComponent("copyed.txt")
        
        try! manager.copyItem(at: srcUrl, to: toUrl)
        
//        7,移动文件
//        (1)方法1
       
        let fileManager = FileManager.default
        let homeDirectory = NSHomeDirectory()
        let srcUrl = homeDirectory + "/Documents/hangge.txt"
        let toUrl = homeDirectory + "/Documents/moved/hangge.txt"
        try! fileManager.moveItem(atPath: srcUrl, toPath: toUrl)
        
//        (2)方法2
        
        // 定位到用户文档目录
        let manager = FileManager.default
        let urlForDocument = manager.urls( for: .documentDirectory, in:.userDomainMask)
        let url = urlForDocument[0]
        
        let srcUrl = url.appendingPathComponent("test.txt")
        let toUrl = url.appendingPathComponent("copyed.txt")
        // 移动srcUrl中的文件(test.txt)到toUrl中(copyed.txt)
        try! manager.moveItem(at: srcUrl, to: toUrl)
        
       // 8,删除文件1)方法1
       
        let fileManager = FileManager.default
        let homeDirectory = NSHomeDirectory()
        let srcUrl = homeDirectory + "/Documents/hangge.txt"
        try! fileManager.removeItem(atPath: srcUrl)
        
       // (2)方法2
       
        // 定位到用户文档目录
        let manager = FileManager.default
        let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)
        let url = urlForDocument[0]
        
        let toUrl = url.appendingPathComponent("copyed.txt")
        // 删除文档根目录下的toUrl路径的文件(copyed.txt文件)
        try! manager.removeItem(at: toUrl)
        
       // 9,删除目录下所有的文件
        //(1)方法1:获取所有文件,然后遍历删除
        
        let fileManager = FileManager.default
        let myDirectory = NSHomeDirectory() + "/Documents/Files"
        let fileArray = fileManager.subpaths(atPath: myDirectory)
        for fn in fileArray!{
            try! fileManager.removeItem(atPath: myDirectory + "/\(fn)")
        }
        
        //(2)方法2:删除目录后重新创建该目录
        
        let fileManager = FileManager.default
        let myDirectory = NSHomeDirectory() + "/Documents/Files"
        try! fileManager.removeItem(atPath: myDirectory)
        try! fileManager.createDirectory(atPath: myDirectory, withIntermediateDirectories: true,
                                         attributes: nil)
      //  10,读取文件
   
        let manager = FileManager.default
        let urlsForDocDirectory = manager.urls(for: .documentDirectory, in:.userDomainMask)
        let docPath = urlsForDocDirectory[0]
        let file = docPath.appendingPathComponent("test.txt")
        
        //方法1
        let readHandler = try! FileHandle(forReadingFrom:file)
        let data = readHandler.readDataToEndOfFile()
        let readString = String(data: data, encoding: String.Encoding.utf8)
        print("文件内容: \(readString)")
        
        //方法2
        let data2 = manager.contents(atPath: file.path)
        let readString2 = String(data: data2!, encoding: String.Encoding.utf8)
        print("文件内容: \(readString2)")
        
      //  11,在任意位置写入数据
      
        let manager = FileManager.default
        let urlsForDocDirectory = manager.urls(for:.documentDirectory, in:.userDomainMask)
        let docPath = urlsForDocDirectory[0]
        let file = docPath.appendingPathComponent("test.txt")
        
        let string = "添加一些文字到文件末尾"
        let appendedData = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
        let writeHandler = try? FileHandle(forWritingTo:file)
        writeHandler!.seekToEndOfFile()
        writeHandler!.write(appendedData!)
        
       // 12,文件权限判断
       
        let manager = FileManager.default
        let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)
        let docPath = urlForDocument[0]
        let file = docPath.appendingPathComponent("test.txt")
        
        let readable = manager.isReadableFile(atPath: file.path)
        print("可读: \(readable)")
        let writeable = manager.isWritableFile(atPath: file.path)
        print("可写: \(writeable)")
        let executable = manager.isExecutableFile(atPath: file.path)
        print("可执行: \(executable)")
        let deleteable = manager.isDeletableFile(atPath: file.path)
        print("可删除: \(deleteable)")
        
       //13,获取文件属性(创建时间,修改时间,文件大小,文件类型等信息)
      
        let manager = FileManager.default
        let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)
        let docPath = urlForDocument[0]
        let file = docPath.appendingPathComponent("test.txt")
        
        let attributes = try? manager.attributesOfItem(atPath: file.path) //结果为Dictionary类型
        print("attributes: \(attributes!)")
       
        
        //从 attributes 中获取具体的属性:
        
        print("创建时间:\(attributes![FileAttributeKey.creationDate]!)")
        print("修改时间:\(attributes![FileAttributeKey.modificationDate]!)")
        print("文件大小:\(attributes![FileAttributeKey.size]!)")
        
        
       // 14,文件/文件夹比较
       
        let manager = FileManager.default
        let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)
        let docPath = urlForDocument[0]
        let contents = try! manager.contentsOfDirectory(atPath: docPath.path)
        
        //下面比较用户文档中前面两个文件是否内容相同(该方法也可以用来比较目录)
        let count = contents.count
        if count > 1 {
            let path1 = docPath.path + "/" + (contents[0] as String)
            let path2 = docPath.path + "/" + (contents[1] as String)
            let equal = manager.contentsEqual(atPath: path1,andPath:path2)
            print("path1:\(path1)")
            print("path2:\(path2)")
            print("比较结果: \(equal)")
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
In SwiftUI, you can use the `AVCaptureSession` and `AVCaptureVideoPreviewLayer` classes from the AVFoundation framework to record videos. Here's an example of how you can do it: ```swift import SwiftUI import AV struct ContentView: View { @State private var isRecording = false let captureSession = AVCaptureSession() let movieOutput = AVCaptureMovieFileOutput() var body: some View { VStack { if !isRecording { Button("Record") { startRecording() } } else { Button("Stop") { stopRecording() } } } .onAppear { setupCamera() } } func setupCamera() { let captureDevice = AVCaptureDevice.default(for: .video) guard let input = try? AVCaptureDeviceInput(device: captureDevice!) else { return } guard captureSession.canAddInput(input) else { return } captureSession.addInput(input) guard captureSession.canAddOutput(movieOutput) else { return } captureSession.sessionPreset = .high captureSession.addOutput(movieOutput) let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) previewLayer.videoGravity = .resizeAspectFill let rootLayer = NSView(frame: NSRect(x: 0, y: 0, width: 300, height: 300)) rootLayer.wantsLayer = true rootLayer.layer?.backgroundColor = NSColor.black.cgColor rootLayer.layer?.addSublayer(previewLayer) previewLayer.frame = rootLayer.bounds let uiView = NSHostingView(rootView: rootLayer) uiView.frame = CGRect(x: 0, y: 0, width: 300, height: 300) let viewController = NSViewController() viewController.view = uiView let window = NSWindow(contentViewController: viewController) window.makeKeyAndOrderFront(nil) captureSession.startRunning() } func startRecording() { let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) let fileUrl = paths[0].appendingPathComponent("output.mov") movieOutput.startRecording(to: fileUrl, recordingDelegate: self) isRecording = true } func stopRecording() { movieOutput.stopRecording() isRecording = false } } extension ContentView: AVCaptureFileOutputRecordingDelegate { func fileOutput(_ output: AVCaptureFileOutput, didStartRecordingTo fileURL: URL, from connections: [AVCaptureConnection]) { print("Started recording to \(fileURL)") } func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) { print("Finished recording to \(outputFileURL)") } } ``` This example sets up a camera preview using `AVCaptureVideoPreviewLayer` and records a video when the "Record" button is tapped. The recorded video is saved to the document directory with the name "output.mov". The recording can be stopped by tapping the "Stop" button. Please note that this code is for macOS development using SwiftUI. If you want to record videos in SwiftUI for iOS, you will need to make some modifications.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值