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.

Ralph
fuente

Respuestas:

163

C objetivo

NSString* theFileName = [string lastPathComponent]

Rápido

let theFileName = (string as NSString).lastPathComponent
Sujith Chandran
fuente
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
Trevor
fuente
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
Jose Ramirez
fuente
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!
Vingtoft
fuente
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.

Pradumna Patil
fuente
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
Ashu
fuente
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.

Robac
fuente
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.

Nishant Sharma
fuente
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

}

Pvlub
fuente
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
Taiwosam
fuente