Bundle.main.path (forResource: ofType: inDirectory :) trả về nil


82

Cố gắng không cười hoặc không khóc - Tôi chỉ mới quay trở lại viết mã sau 20 năm ...

Tôi đã dành hơn 4 giờ để xem các tài liệu tham khảo và thử các đoạn mã để có được Bundle.main.path để mở tệp văn bản của tôi để tôi có thể đọc dữ liệu cho ứng dụng của mình (bước tiếp theo của tôi là phân tích cú pháp thích hợp).

if let filepath = Bundle.main.path(forResource: "newTest", ofType: "txt")
{
    do
    {
        let contents = try String(contentsOfFile: filepath)
        print(contents)

    }
    catch
    {
        print("Contents could not be loaded.")
    }
}
else
{
    print("newTest.txt not found.")
}

Kết quả là: "newTest.txt not found." bất kể tôi cố gắng kéo và thả tệp vào dự án bằng cách nào, tạo tệp bên trong Xcode hoặc sử dụng mục menu Tệp -> Thêm Tệp vào ....


let path: String = Bundle.main.path (forResource: "charlie", ofType: "txt")! hãy url: URL = URL (fileURLWithPath: đường dẫn)
Himanshu Moradiya

Có thể trùng lặp của stackoverflow.com/questions/34548771/...
Leo Dabus

@LeoDabus vấn đề của tôi tương tự với [link] stackoverflow.com/questions/40822170/… (mà bạn cũng đã nhận xét) và cũng cho tôi lỗi tương tự.
Zakarius Jay Poggenpohl

Brother vấn đề của bạn giải quyết hay không?
Himanshu Moradiya

Không, cùng một lỗi. :. (...
Zakarius Jay Poggenpohl

Câu trả lời:


193

Vấn đề là tệp không được sao chép vào gói ứng dụng của bạn. Để sửa chữa nó:

  • Nhấp vào dự án của bạn
  • Nhấp vào mục tiêu của bạn
  • Chọn các giai đoạn xây dựng
  • Mở rộng tài nguyên gói bản sao
  • Nhấp vào '+' và chọn tệp của bạn.

1
Tôi đã thêm tệp vào "Tài nguyên gói sao chép" tuy nhiên, tôi cũng tìm thấy tệp này trong danh sách "Nguồn biên dịch" của mình, vì ban đầu nó là một tệp nhanh cho đến khi tôi thay đổi phần mở rộng. Nhưng việc thay đổi tiện ích mở rộng không xóa nó khỏi "Nguồn biên dịch". Vì vậy, tôi đã rút nó ra, chạy nó và hoạt động như một cái duyên.
Christopher Wade Cantley,

9
Điều này làm việc cho tôi khi không có gì khác hoạt động. Tại sao một tệp tôi thả vào Xcode không tự động hiển thị trong "Sao chép tài nguyên gói" ???
Trev 14

@ Trev14 không có ý nghĩa gì khi điều này không tự động xảy ra
andrewcar

Thật điên rồ, đã mất vài giờ về việc này khi tôi quên "mẹo" kiểm tra những gì đang được thêm vào gói ứng dụng. Vấn đề là tôi đã sử dụng một IDE mà tôi thêm vào các tập tin và IDE không chỉnh sửa .pbxproj, vì vậy tôi không có nguồn lực của tôi trong gói ứng dụng
jpcarreira

34

Kiểm tra kỹ Optionstrong add filesmenu khi thêm tệp. Mục tiêu trong Add to targetsphải được đánh dấu để thêm nó vào gói:

Trong trường hợp bạn thực sự đang ở trong một gói khác (ví dụ: thử nghiệm), hãy sử dụng:

guard let fileURL = Bundle(for: type(of: self)).url(forResource: fileName withExtension:"txt") else {
        fatalError("File not found")
}

23

Nhấp vào tệp của bạn trên bảng điều hướng và mở Bảng điều khiển bên phải / Người kiểm tra thuộc tính.

nhập mô tả hình ảnh ở đây

Đảm bảo rằng bạn thêm thành viên mục tiêu


1
Đối với bất kỳ ai khác thấy điều này và đây là giải pháp cho bạn cũng như đối với tôi, bạn phải thực hiện việc này bất cứ lúc nào tệp được thay thế bằng một phiên bản mới.
Micah Montoya

5

Swift 3.0

let fileNmae = "demo"

let path = Bundle.main.path(forResource: fileNmae, ofType: "txt")
    do {
        let content = try String(contentsOfFile:path!, encoding: String.Encoding.utf8)
        print(content)
    } catch {
        print("nil")
    }

SWift 2.0

do{
      if let path = NSBundle.mainBundle().pathForResource("YOURTXTFILENAME", ofType: "txt"){
             let data = try String(contentsOfFile:path, encoding: NSUTF8StringEncoding)
             let myStrings = data.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet())
              print(myStrings)
       }
  } catch let err as NSError {
            //do sth with Error
            print(err)
  }

Đầu ra:

Hello Hems
Good Morning
I m here for you dude.
Happy Coding.

@LeoDabus chờ tôi chỉ cần chuyển đổi mã này trong nhanh chóng 3,0
Himanshu Moradiya

1
Tôi thực sự đánh giá cao cố gắng của bạn để giúp đỡ, nhưng tôi nhận được lỗi sau: Lỗi chết người: bất ngờ tìm thấy con số không trong khi unwrapping một giá trị bắt buộc
Zakarius Jay Poggenpohl

dòng nào? @ZakariusJayPoggenpohl
Himanshu Moradiya

4

À, vậy là tôi thấy mình đang giải quyết vấn đề giống hệt như OP.

Vấn đề là các giải pháp được đưa ra ở đâyở đây không hoạt động khi mã đang được thực thi trong một sân chơi, vì Optionsmenu add filestrông khác cho nó không hiển thị Add to targetstrường:

nhập mô tả hình ảnh ở đây

.playgroundThay vào đó, khi ở trong một tệp, hãy nhấn vào Hide or show the Navigatornút ở trên cùng bên phải cửa sổ Xcode của bạn (ấn tượng trực quan) ->nhập mô tả hình ảnh ở đây

Sau đó, khi Bộ điều hướng mở ra ở phía bên trái của cửa sổ Xcode, chỉ cần kéo và thả tệp của bạn vào Resourcesthư mục của sân chơi.

Nếu thiết lập của bạn trông giống như sau, bạn sẽ ổn:

nhập mô tả hình ảnh ở đây


Cảm ơn bạn. Điều này đã giúp tôi, khi tôi đang thử nghiệm một số mã trong Playground (một phần của một dự án lớn hơn).
mayankk2308 Ngày

2

Cùng một vấn đề, tình huống và giải pháp hơi khác nhau. Tôi đang làm theo hướng dẫn sử dụng mã sau:

    // Start the background music:
    if let musicPath = Bundle.main.path(forResource:
        "Sound/BackgroundMusic.m4a", ofType: nil) {
        print("SHOULD HEAR MUSIC NOW")
        let url = URL(fileURLWithPath: musicPath)

        do {
            musicPlayer = try AVAudioPlayer(contentsOf: url)
            musicPlayer.numberOfLoops = -1
            musicPlayer.prepareToPlay()
            musicPlayer.play()
        }
        catch { print("Couldn't load music file") }
    }
}

Tôi đã gặp vấn đề tương tự như những người khác nhưng không có giải pháp nào khắc phục được sự cố. Sau khi thử nghiệm, tất cả những gì tôi làm là xóa Âm thanh khỏi đường dẫn trong cuộc gọi sau và mọi thứ đều hoạt động:

Bundle.main.path(forResource: "BackgroundMusic.m4a", ofType: nil)

Có vẻ như hướng dẫn đã bị lỗi khi yêu cầu tôi đưa Âm thanh vào đường dẫn.


2

Tôi đã thêm vào file.txtdự án của mình và nó tự động được thêm vào Copy Bundle Filesdự án của tôi. Đối với tôi, tôi đã phải xóa tiện ích mở rộng khỏi forResourcevà nó hoạt động.

let path = Bundle.main.path(forResource: "file", ofType: "txt") // not forResource: "file.txt"


2

Thật điên rồ khi một vấn đề đơn giản như vậy có thể tốn bao nhiêu thời gian.

Một số câu trả lời ở đây đã giúp tôi nhưng tôi luôn cố gắng:

Bundle.main.url(forResource: selectedTitle, withExtension: "mp3")

Vì một số lý do mà nó không hoạt động, nhưng việc lấy đường dẫn và dịch nó sang URL sau đó hoạt động:

let path = Bundle.main.path(forResource: selectedTitle, ofType: "mp3")
let url = URL(fileURLWithPath: path!)

0

Tôi nghĩ bạn không muốn inDirectory:phương pháp này. Hãy thử cái này thay thế:

if let filepath = Bundle.main.path(forResource: "newTest", ofType: "txt") {
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.