【问题标题】:How to get the filename from the filepath in swift如何快速从文件路径中获取文件名
【发布时间】:2015-08-03 06:10:36
【问题描述】:

如何从给定的文件路径字符串中获取文件名?

例如,如果我有一个文件路径字符串为

file:///Users/DeveloperTeam/Library/Developer/CoreSimulator/Devices/F33222DF-D8F0-448B-A127-C5B03C64D0DC/data/Containers/Data/Application/5D0A6264-6007-4E69-A63B-D77868EA1807/tmp/trim.D152E6EA-D19D-4E3F-8110-6EACB2833CE3.MOV

我想得到返回结果为

trim.D152E6EA-D19D-4E3F-8110-6EACB2833CE3.MOV

【问题讨论】:

    标签: ios iphone swift


    【解决方案1】:

    目标 C

    NSString* theFileName = [string lastPathComponent]
    

    斯威夫特

    let theFileName = (string as NSString).lastPathComponent
    

    【讨论】:

    • 也许你应该在 Swift 中强调这仅适用于 NSString,例如: var theFileName: NSString = string.lastPathComponent // 或 var theFileName: String = (string as NSString).lastPathComponent
    • 在 Swift 中,强烈建议将本地文件名管理为 URLs,而不是 Strings 或 NSStrings
    • 请注意,这需要导入Foundation。对于 iOS/Mac 应用程序来说没什么大不了的,但对于 Linux/Windows 应用程序来说却是个大问题。
    【解决方案2】:

    SWIFT 3.x 或 SWIFT 4: 执行此操作的最短和最干净的方法如下。在这个例子中,url 变量是URL 的类型,这样我们可以得到一个人类可读的String 完整文件名的结果,扩展名为My file name.txt,而不是My%20file%20name.txt

    // Result like: My file name.txt
    let fileName = url.lastPathComponent
    

    【讨论】:

    • 这总是为图片返回asset.JPG。
    • 查看包含 Swift 3 且更加连贯的 Swift 2 答案。
    • 我的也是 - @HarshNigam
    【解决方案3】:

    如果你想获取当前文件名,例如用于日志记录,我使用这个。

    斯威夫特 4

    URL(fileURLWithPath: #file).lastPathComponent
    

    【讨论】:

    • 温馨提示:使用init(fileURLWithPath path: __shared String, isDirectory: Bool) 避免额外的文件系统访问。来自文档:此函数避免了额外的文件系统访问以检查文件 URL 是否为目录。如果你已经知道答案,你应该使用它。
    【解决方案4】:

    斯威夫特 2:

    var file_name = NSURL(fileURLWithPath: path_to_file).lastPathComponent!
    

    【讨论】:

    • 如果您在 swift String 上调用 lastPathComponent(而不是转换为 NSString),这是编译器所说的方法。
    • 温馨提示:使用init(fileURLWithPath path: __shared String, isDirectory: Bool) 避免额外的文件系统访问。来自文档:此函数避免了额外的文件系统访问以检查文件 URL 是否为目录。如果你已经知道答案,你应该使用它。
    【解决方案5】:
    let theURL = URL(string: "yourURL/somePDF.pdf")  //use your URL
    let fileNameWithExt = theURL?.lastPathComponent //somePDF.pdf
    let fileNameLessExt = theURL?.deletingPathExtension().lastPathComponent //somePDF
    

    为了让这个工作,你的 url 必须是 URL 类型而不是字符串,所以不要事先将其转换为字符串。

    您可以将此代码直接复制并粘贴到 Playground 中以查看其工作原理。

    【讨论】:

    • 感谢您的回答:)
    • 不错。第三个有帮助,谢谢!
    【解决方案6】:

    试试这个

    let filename: String = "your file name"
    let pathExtention = filename.pathExtension
    let pathPrefix = filename.stringByDeletingPathExtension
    

    更新:

    extension String {
        var fileURL: URL {
            return URL(fileURLWithPath: self)
        }
        var pathExtension: String {
            return fileURL.pathExtension
        }
        var lastPathComponent: String {
            return fileURL.lastPathComponent
        }
    }
    

    希望对你有帮助。

    【讨论】:

      【解决方案7】:

      以下代码在 Swift 4.X 中为我工作

       let filename = (self.pdfURL as NSString).lastPathComponent  // pdfURL is your file url
       let fileExtention = (filename as NSString).pathExtension  // get your file extension
       let pathPrefix = (filename as NSString).deletingPathExtension   // File name without extension
       self.lblFileName.text = pathPrefix  // Print name on Label
      

      【讨论】:

        【解决方案8】:

        您可以在 fileUrl 中传递 url,如下所示:-

        let fileUrl: String = "https://www.himgs.com/imagenes/hello/social/hello-fb-logo.png" // Pass the URL 
        
        let lastPathComponent = URL.init(string: fileUrl)?.lastPathComponent ?? "" // With this you will get last path component
        
        let fileNameWithExtension = lastPathComponent
        

        //最后一个路径组件将为您提供带有扩展名的文件名。

        【讨论】:

        • 这是一个鲜为人知的纯代码答案。请添加一些解释。这将提高您获得支持的机会,还有助于消除您可以免费在此处完成编程工作的误解。
        【解决方案9】:

        Swift 5。这个比URLNSString 选项运行得更快:

        path.components(separatedBy: "/").last
        

        【讨论】:

          【解决方案10】:

          我做了一些性能测试(iOS 14,真实设备,发布配置):

          (#file as NSString).lastPathComponent // The fastest option.
          
          URL(string: #file)!.lastPathComponent // 2.5 times slower than NSString.
          
          #file.components(separatedBy: "/").last! // 7 times slower than NSString.
          

          奖金:

          URL(fileURLWithPath: #file, isDirectory: false).lastPathComponent // About the same as URL(string:).
          
          URL(fileURLWithPath: #file).lastPathComponent // 2.5 times slower than with explicit isDirectory.
          

          【讨论】:

            【解决方案11】:

            创建唯一的“文件名”表单 url,包括两个先前的文件夹

            func createFileNameFromURL (colorUrl: URL) -> String {
            
            var arrayFolders = colorUrl.pathComponents
            
            // -3 because last element from url is "file name" and 2 previous are folders on server
            let indx = arrayFolders.count - 3
            var fileName = ""
            
            switch indx{
            case 0...:
                fileName = arrayFolders[indx] + arrayFolders[indx+1] + arrayFolders[indx+2]
            case -1:
                fileName = arrayFolders[indx+1] + arrayFolders[indx+2]
            case -2:
                fileName = arrayFolders[indx+2]
            default:
                break
            }
            
            
            return fileName
            

            }

            【讨论】:

              【解决方案12】:

              在 Swift >= 4.2 中从 URL 检索不带扩展名的文件名:

              let urlWithoutFileExtension: URL =  originalFileUrl.deletingPathExtension()
              let fileNameWithoutExtension: String = urlWithoutFileExtension.lastPathComponent
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-03-26
                • 1970-01-01
                • 1970-01-01
                • 2014-12-21
                • 2012-01-21
                • 2012-10-25
                • 2015-03-19
                相关资源
                最近更新 更多