programing

Swift에서 파일 확장자에서 파일 이름을 분할하는 방법은 무엇입니까?

javamemo 2023. 8. 23. 21:33
반응형

Swift에서 파일 확장자에서 파일 이름을 분할하는 방법은 무엇입니까?

번들에 있는 파일의 이름을 고려할 때, 저는 그 파일을 제 스위프트 앱에 로딩하고 싶습니다.그래서 저는 다음 방법을 사용해야 합니다.

let soundURL = NSBundle.mainBundle().URLForResource(fname, withExtension: ext)

어떤 이유로든 메소드는 파일 확장자와 파일 이름을 구분해야 합니다.좋아요, 대부분의 언어에서 둘을 분리하는 것은 충분히 쉽습니다.하지만 아직까지는 스위프트에서는 그렇지 않습니다.

제가 가진 것은 다음과 같습니다.

var rt: String.Index = fileName.rangeOfString(".", options:NSStringCompareOptions.BackwardsSearch)
var fname: String = fileName .substringToIndex(rt)
var ext = fileName.substringFromIndex(rt)

첫 번째 줄에 타이핑을 포함하지 않으면 두 번째 줄에 오류가 발생합니다.첫 번째 줄에 오류가 있습니다.

Cannot convert the expression's type '(UnicodeScalarLiteralConvertible, options: NSStringCompareOptions)' to type 'UnicodeScalarLiteralConvertible'

확장자에서 파일 이름을 분할하려면 어떻게 해야 합니까?이것을 할 수 있는 우아한 방법이 있습니까?

저는 스위프트가 오브젝티브 C보다 훨씬 더 우아한 언어인 것 같아서 모두 흥분했습니다.하지만 지금 저는 그것이 그 나름대로의 번거로움을 가지고 있다는 것을 알게 되었습니다.


두 번째 시도:나는 나만의 문자열 검색 방법을 만들기로 결정했습니다.

func rfind(haystack: String, needle: Character) -> Int {
    var a = Array(haystack)

    for var i = a.count - 1; i >= 0; i-- {
        println(a[i])
        if a[i] == needle {
            println(i)
            return i;
        }
    }
    return -1
}

하지만 지금은 라인에 오류가 발생합니다.var rt: String.Index = rfind(fileName, needle: "."):

'Int' is not convertible to 'String.Index'

캐스트가 없으면 두 개의 후속 라인에 오류가 발생합니다.

이 파일 이름과 확장자를 나누는 것을 도와줄 수 있는 사람이 있습니까?

신속한 5.0 업데이트:

댓글에 지적된 것처럼, 이것을 사용할 수 있습니다.

let filename: NSString = "bottom_bar.png"
let pathExtention = filename.pathExtension
let pathPrefix = filename.deletingPathExtension

이것은 Swift 2, Xcode 7: 확장자가 이미 있는 파일 이름을 가지고 있다면 첫 번째 매개 변수로 전체 파일 이름을 전달하고 두 번째 매개 변수로 공백 문자열을 전달할 수 있습니다.

let soundURL = NSBundle.mainBundle()
    .URLForResource("soundfile.ext", withExtension: "")

또는 확장 매개 변수로 0을 사용할 수도 마찬가지입니다.

URL이 있고 어떤 이유로 파일 이름을 가져오려는 경우 다음 작업을 수행할 수 있습니다.

soundURL.URLByDeletingPathExtension?.lastPathComponent

스위프트 4

let soundURL = NSBundle.mainBundle().URLForResource("soundfile.ext", withExtension: "")
soundURL.deletingPathExtension().lastPathComponent

Swift 5에서 작동합니다.이러한 동작 추가String클래스:

extension String {

    func fileName() -> String {
        return URL(fileURLWithPath: self).deletingPathExtension().lastPathComponent 
    }

    func fileExtension() -> String {
        return URL(fileURLWithPath: self).pathExtension
    }
}

예:

let file = "image.png"
let fileNameWithoutExtension = file.fileName()
let fileExtension = file.fileExtension()

솔루션 스위프트 4

이 솔루션은 모든 인스턴스에 대해 작동하며 문자열을 수동으로 구문 분석하지 않습니다.

let path = "/Some/Random/Path/To/This.Strange.File.txt"

let fileName = URL(fileURLWithPath: path).deletingPathExtension().lastPathComponent

Swift.print(fileName)

결과 출력은 다음과 같습니다.

This.Strange.File

Swift 2.1에서는 String.pathExtension을 더 이상 사용할 수 없습니다.대신 NSURL 변환을 통해 확인해야 합니다.

NSURL(fileURLWithPath: filePath).pathExtension

Swift에서 다음으로 변경할 수 있습니다.NSString더 빨리 확장하려면:

extension String {
    func getPathExtension() -> String {
        return (self as NSString).pathExtension
    }
}

최신 Swift 4.2는 다음과 같이 작동합니다.

extension String {
    func fileName() -> String {
        return URL(fileURLWithPath: self).deletingPathExtension().lastPathComponent
    }

    func fileExtension() -> String {
        return URL(fileURLWithPath: self).pathExtension
    }
}

Swift 2.1에서는 이를 위한 현재 방법이 다음과 같습니다.

let filename = fileURL.URLByDeletingPathExtension?.lastPathComponent
let extension = fileURL.pathExtension

코드 슈가가 들어간 스위프트 5

extension String {
    var fileName: String {
       URL(fileURLWithPath: self).deletingPathExtension().lastPathComponent
    }

    var fileExtension: String{
       URL(fileURLWithPath: self).pathExtension
    }
}

SWIFT 3.x 최단 기본 솔루션

let fileName:NSString = "the_file_name.mp3"
let onlyName = fileName.deletingPathExtension
let onlyExt = fileName.pathExtension

확장이나 추가 사항 없음(테스트한 바 있음. Swift 2용 @gabbler 솔루션 기반)

스위프트 5

URL.deletingPathExtension().lastPathComponent

스위프트의 문자열은 분명 까다로울 수 있습니다.순수한 Swift 방법을 원한다면 다음과 같이 하겠습니다.

  1. 의 마지막 항목을 찾는 데 사용합니다."."현악기의 중앙에
  2. 올바른 인덱스를 가져오는 데 사용합니다."."
  3. 사용하다Stringsubscript을 취하는 IntervalType
  4. 이름과 확장자의 선택적 튜플을 반환하는 함수로 이 모든 것을 패키지화합니다.

이와 같은 것:

func splitFilename(str: String) -> (name: String, ext: String)? {
    if let rDotIdx = find(reverse(str), ".") {
        let dotIdx = advance(str.endIndex, -rDotIdx)
        let fname = str[str.startIndex..<advance(dotIdx, -1)]
        let ext = str[dotIdx..<str.endIndex]
        return (fname, ext)
    }
    return nil
}

다음과 같이 사용됩니다.

let str = "/Users/me/Documents/Something.something/text.txt"
if let split = splitFilename(str) {
    println(split.name)
    println(split.ext)
}

출력 대상:

/Users/me/Documents/Something.something/text
txt

또는 및 같은 이미 사용 가능한 방법을 사용합니다.

스위프트 5

 URL(string: filePath)?.pathExtension

간단한 Swift 4 솔루션을 사용해 보십시오.

extension String {
    func stripExtension(_ extensionSeperator: Character = ".") -> String {
        let selfReversed = self.reversed()
        guard let extensionPosition = selfReversed.index(of: extensionSeperator) else {  return self  }
        return String(self[..<self.index(before: (extensionPosition.base.samePosition(in: self)!))])
    }
}

print("hello.there.world".stripExtension())
// prints "hello.there"

스위프트 3.0

 let sourcePath = NSURL(string: fnName)?.pathExtension
 let pathPrefix = fnName.replacingOccurrences(of: "." + sourcePath!, with: "")

Swift 3.x 확장 솔루션:

extension String {
    func lastPathComponent(withExtension: Bool = true) -> String {
        let lpc = self.nsString.lastPathComponent
        return withExtension ? lpc : lpc.nsString.deletingPathExtension
    }

    var nsString: NSString {
         return NSString(string: self)
    }
}

let path = "/very/long/path/to/filename_v123.456.plist"
let filename = path.lastPathComponent(withExtension: false)

파일 이름 상수에 이제 "filename_v123.456"이 포함되어 있습니다.

더 나은 방법(또는 적어도 Swift 2.0의 대안)은 String pathComponents 속성을 사용하는 것입니다.이렇게 하면 경로 이름이 문자열 배열로 분할됩니다.

if let pathComponents = filePath.pathComponents {
    if let last = pathComponents.last {
        print(" The last component is \(last)") // This would be the extension
        // Getting the last but one component is a bit harder
        // Note the edge case of a string with no delimiters!
    }
}
// Otherwise you're out of luck, this wasn't a path name!

그들은 어떤 이유로든 pathExtension을 제거했습니다.

let str = "Hello/this/is/a/filepath/file.ext"
let l = str.componentsSeparatedByString("/")
let file = l.last?.componentsSeparatedByString(".")[0]
let ext = l.last?.componentsSeparatedByString(".")[1]

Swift 4의 에 대한 입니다.PHAsset:

import Photos

extension PHAsset {
    var originalFilename: String? {
        if #available(iOS 9.0, *),
            let resource = PHAssetResource.assetResources(for: self).first {
            return resource.originalFilename
        }

        return value(forKey: "filename") as? String
    }
}

XCode에 명시된 바와 같이 originalFilename은 생성되거나 가져온 시점의 자산 이름입니다.

너무 늦었을 수도 있지만 저에게 효과가 있었고 매우 단순하다고 생각하는 해결책은#file컴파일러 지시문. 제가 을 하는 .FixtureManager에정된에 정의되어 .FixtureManager.swift/Tests/MyProject / 내부directory. This works both in Xcode and with시험

import Foundation

final class FixtureManager {

    static let fixturesDirectory = URL(fileURLWithPath: #file).deletingLastPathComponent()

    func loadFixture(in fixturePath: String) throws -> Data {
        return try Data(contentsOf: fixtureUrl(for: fixturePath))
    }

    func fixtureUrl(for fixturePath: String) -> URL {
        return FixtureManager.fixturesDirectory.appendingPathComponent(fixturePath)
    }

    func save<T: Encodable>(object: T, in fixturePath: String) throws {
        let data = try JSONEncoder().encode(object)
        try data.write(to: fixtureUrl(for: fixturePath))
    }

    func loadFixture<T: Decodable>(in fixturePath: String, as decodableType: T.Type) throws -> T {
        let data = try loadFixture(in: fixturePath)
        return try JSONDecoder().decode(decodableType, from: data)
    }

}

두 개의 이전 폴더를 포함하는 고유한 "파일 이름" 양식 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
}

언급URL : https://stackoverflow.com/questions/26707352/how-to-split-filename-from-file-extension-in-swift

반응형