Cómo obtener el nombre de archivo de la ruta de archivo en Swift


98

¿Cómo obtener el nombre de archivo de la cadena de ruta de archivo dada?

Por ejemplo, si tengo una cadena de ruta de archivo como

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

y me gustaría obtener el resultado de la devolución como

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

Gracias por tu ayuda.

Respuestas:


163

C objetivo

NSString* theFileName = [string lastPathComponent]

Rápido

let theFileName = (string as NSString).lastPathComponent

1
tal vez debería resaltar en Swift que esto funciona solo para NSString, como: var theFileName: NSString = string.lastPathComponent // o var theFileName: String = (string as NSString) .lastPathComponent
Babac

3
en Swift, nombres de archivos locales están altamente sugirió a ser administrado como URLs, no como Strings o NSStrings
bshirley

32

SWIFT 3.xo SWIFT 4: la forma más corta y limpia de hacer esto es a continuación. En este ejemplo, la urlvariable es tipo de, URLde esta manera podemos tener un Stringresultado legible por humanos del nombre completo del archivo con la extensión como My file name.txty No comoMy%20file%20name.txt

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

2
esto siempre devuelve asset.JPG para imágenes.
Harsh Nigam

Vea la respuesta de Swift 2 que incluye Swift 3 y es más coherente.
Tyler A.

el mío también - @HarshNigam
Daniel Pereira

28

Si desea obtener el nombre del archivo actual, por ejemplo, para fines de registro, uso esto.

Rápido 4

URL(fileURLWithPath: #file).lastPathComponent

1
Es bueno saberlo: utilícelo init(fileURLWithPath path: __shared String, isDirectory: Bool)para evitar un acceso adicional al sistema de archivos. De los documentos: esta función evita un acceso adicional al sistema de archivos para verificar si la URL del archivo es un directorio. Debería usarlo si ya conoce la respuesta.
Mark

24

Rápido 2:

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

Este es el método que el compilador dice que use si llama lastPathComponenta un swift String(en lugar de enviar a NSString).
i_am_jorf

Es bueno saberlo: utilícelo init(fileURLWithPath path: __shared String, isDirectory: Bool)para evitar un acceso adicional al sistema de archivos. De los documentos: esta función evita un acceso adicional al sistema de archivos para verificar si la URL del archivo es un directorio. Debería usarlo si ya conoce la respuesta.
Mark

14

Prueba esto

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

Actualizado :

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

Espero eso ayude.


11

El siguiente código me funciona en 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

5
let theURL = URL(string: "yourURL/somePDF.pdf")  //use your URL
let fileNameWithExt = theURL?.lastPathComponent //somePDF.pdf
let fileNameLessExt = theURL?.deletingPathExtension().lastPathComponent //somePDF

Para que esto funcione, su URL debe ser de tipo URL, no una cadena, así que no la convierta a una cadena de antemano.

Puede copiar y pegar este código directamente en la zona de juegos para ver cómo funciona.


4

Puede pasar la URL en fileUrl, como hice a continuación: -

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

// Este último componente de ruta le proporcionará el nombre de archivo con extensión.


1
Esta es una respuesta de solo código poco apreciada. Por favor agregue alguna explicación. Eso mejorará sus posibilidades de obtener votos positivos y también ayudará a combatir la idea errónea de que puede hacer el trabajo de programación aquí de forma gratuita.
Yunnosch

1

Crea una URL de formulario de "nombre de archivo" única que incluye dos carpetas anteriores

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

}


1

Para recuperar el nombre de archivo sin su extensión de una URL en Swift> = 4.2:

let urlWithoutFileExtension: URL =  originalFileUrl.deletingPathExtension()
let fileNameWithoutExtension: String = urlWithoutFileExtension.lastPathComponent
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.