Comment obtenir le nom de fichier à partir du chemin de fichier dans Swift

98

Comment obtenir le nom de fichier à partir de la chaîne de chemin de fichier donnée?

Par exemple, si j'ai une chaîne de chemin de fichier comme

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

et je voudrais obtenir le résultat de retour comme

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

Merci de votre aide.

Ralph
la source

Réponses:

163

Objectif c

NSString* theFileName = [string lastPathComponent]

Rapide

let theFileName = (string as NSString).lastPathComponent
Sujith Chandran
la source
1
peut-être devriez-vous souligner dans Swift que cela ne fonctionne que pour NSString, comme: var theFileName: NSString = string.lastPathComponent // ou var theFileName: String = (string as NSString) .lastPathComponent
Babac
3
dans Swift, les noms de fichiers locaux sont fortement suggérés pour être gérés en tant que URLs, pas en tant que Strings ou NSStrings
bshirley
32

SWIFT 3.x ou SWIFT 4: le moyen le plus court et le plus propre de le faire est ci-dessous. Dans cet exemple, la urlvariable est le type de URLde cette façon, nous pouvons avoir un Stringrésultat lisible par l'homme du nom complet du fichier avec l'extension comme My file name.txtet Pas commeMy%20file%20name.txt

// Result like: My file name.txt
let fileName = url.lastPathComponent
Trevor
la source
2
cela renvoie toujours asset.JPG pour les images.
Harsh Nigam
Voir la réponse Swift 2 qui inclut Swift 3 et est plus cohérente.
Tyler A.
le mien aussi - @HarshNigam
Daniel Pereira
29

Si vous souhaitez obtenir le nom du fichier actuel, par exemple à des fins de journalisation, j'utilise ceci.

Swift 4

URL(fileURLWithPath: #file).lastPathComponent
José Ramirez
la source
1
Bon à savoir: à utiliser init(fileURLWithPath path: __shared String, isDirectory: Bool)pour éviter un accès supplémentaire au système de fichiers. À partir de la documentation: Cette fonction évite un accès supplémentaire au système de fichiers pour vérifier si l'URL du fichier est un répertoire. Vous devriez l'utiliser si vous connaissez déjà la réponse.
Marquez le
24

Swift 2:

var file_name = NSURL(fileURLWithPath: path_to_file).lastPathComponent!
Vingtoft
la source
C'est la méthode que le compilateur dit d'utiliser si vous appelez lastPathComponentun swift String(par opposition à un cast vers NSString).
i_am_jorf
Bon à savoir: à utiliser init(fileURLWithPath path: __shared String, isDirectory: Bool)pour éviter un accès supplémentaire au système de fichiers. À partir de la documentation: Cette fonction évite un accès supplémentaire au système de fichiers pour vérifier si l'URL du fichier est un répertoire. Vous devriez l'utiliser si vous connaissez déjà la réponse.
Marquez le
14

Essaye ça

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

Actualisé :

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

J'espère que ça aide.

Pradumna Patil
la source
11

Le code ci-dessous fonctionne pour moi dans 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
la source
5
let theURL = URL(string: "yourURL/somePDF.pdf")  //use your URL
let fileNameWithExt = theURL?.lastPathComponent //somePDF.pdf
let fileNameLessExt = theURL?.deletingPathExtension().lastPathComponent //somePDF

Pour que cela fonctionne, votre URL doit être de type URL et non une chaîne, alors ne la convertissez pas en chaîne au préalable.

Vous pouvez copier et coller ce code directement dans l'aire de jeux pour voir comment cela fonctionne.

Robac
la source
4

Vous pouvez passer l'url dans fileUrl, comme je l'ai fait ci-dessous: -

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

// Ce dernier composant de chemin vous fournira le nom de fichier avec l'extension.

Nishant Sharma
la source
1
C'est une réponse de code seulement peu appréciée. Veuillez ajouter quelques explications. Cela améliorera vos chances d'obtenir des votes positifs et aidera également à combattre l'idée fausse selon laquelle vous pouvez faire du travail de programmation ici gratuitement.
Yunnosch
1

Crée une URL de formulaire "nom de fichier" unique comprenant deux dossiers précédents

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
la source
1

Pour récupérer le nom de fichier sans son extension à partir d'une URL dans Swift> = 4.2:

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