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.

Réponses:


163

Objectif c

NSString* theFileName = [string lastPathComponent]

Rapide

let theFileName = (string as NSString).lastPathComponent

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

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

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!

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.


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

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.


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.


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

}


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.