Bundle.main.path (forResource: ofType: inDirectory :) devuelve nil

82

Trate de no reír ni llorar, estoy volviendo a la codificación después de 20 años ...

He pasado más de 4 horas buscando referencias y probando fragmentos de código para que Bundle.main.path abra mi archivo de texto para poder leer los datos de mi aplicación (mi siguiente paso es analizarlos adecuadamente).

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.")
}

El resultado es: "newTest.txt not found". independientemente de cómo intente arrastrar y soltar el archivo en el proyecto, crear el archivo dentro de Xcode o usar el elemento de menú Archivo -> Agregar archivos a ...

Zakarius Jay Poggenpohl
fuente
let path: String = Bundle.main.path (forResource: "charlie", ofType: "txt")! let url: URL = URL (fileURLWithPath: path)
Himanshu Moradiya
Posible duplicado de stackoverflow.com/questions/34548771/…
Leo Dabus
@LeoDabus mi problema es similar a [link] stackoverflow.com/questions/40822170/… (que también comentaste) y también me da el mismo error.
Zakarius Jay Poggenpohl
Hermano, ¿tu problema resuelve o no?
Himanshu Moradiya
No, mismo error. :. (...
Zakarius Jay Poggenpohl

Respuestas:

193

El problema es que el archivo no se está copiando en su paquete de aplicaciones. Arreglarlo:

  • Haga clic en su proyecto
  • Haga clic en su objetivo
  • Seleccionar fases de construcción
  • Expandir los recursos del paquete de copias
  • Haga clic en '+' y seleccione su archivo.
Denis Hennessy
fuente
1
Agregué el archivo a "Copiar recursos de paquete", sin embargo, también lo encontré en mi lista "Compilar fuentes", lo cual se debe a que originalmente era un archivo rápido hasta que cambié la extensión. Pero cambiar la extensión no la eliminó de "Compilar fuentes". Así que lo saqué, lo ejecuté y funcionó como un encanto.
Christopher Wade Cantley
9
Esto funcionó para mí cuando nada más funcionó. ¿Por qué un archivo que coloco en Xcode no aparece automáticamente en "Copiar recursos del paquete"?
Trev14
@ Trev14 no tiene sentido que esto no suceda automáticamente
andrewcar
Loco, perdí un par de horas en esto cuando olvidé este "truco" para verificar lo que se agrega al paquete de aplicaciones. El problema era que estaba usando otro IDE donde agregué el archivo y ese IDE no editó el .pbxproj, por lo que no tenía mi recurso en el paquete de aplicaciones
jpcarreira
34

Verifique dos veces Optionsen el add filesmenú cuando agregue el archivo. El objetivo en Add to targetsdebe estar marcado para agregarlo al paquete:

En caso de que esté realmente en otro paquete (prueba, por ejemplo), use:

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

Haga clic en su archivo en su panel de navegación y abra el Panel derecho / Inspector de propiedades.

ingrese la descripción de la imagen aquí

Asegúrese de agregar a la membresía de destino

Kelvin Fok
fuente
1
Para cualquier otra persona que vea esto y esta es la solución para usted como lo fue para mí, debe hacer esto cada vez que el archivo sea reemplazado por una nueva versión.
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)
  }

Salida:

Hello Hems
Good Morning
I m here for you dude.
Happy Coding.
Himanshu Moradiya
fuente
@LeoDabus espera, acabo de convertir este código en swift 3.0
Himanshu Moradiya
1
Realmente aprecio su intento de ayudar, pero aparece el siguiente error: error fatal: inesperadamente encontrado nulo al desenvolver un valor opcional
Zakarius Jay Poggenpohl
cual linea ? @ZakariusJayPoggenpohl
Himanshu Moradiya
4

Ah, entonces me encontré lidiando exactamente con el mismo problema que el OP.

El problema es que las soluciones dadas aquí y aquí no funcionan cuando el código se está ejecutando en un patio de juegos, ya que el Optionsmenú de add filesparece diferente porque no muestra el Add to targetscampo:

ingrese la descripción de la imagen aquí

Cuando esté dentro de un .playgroundarchivo, presione el Hide or show the Navigatorbotón en la parte superior derecha de la ventana de Xcode (impresión visual) ->ingrese la descripción de la imagen aquí

Luego, una vez que el navegador se abre en el lado izquierdo de la ventana de Xcode, simplemente arrastre y suelte su archivo en el Resourcesdirectorio de su área de juegos.

Si su configuración se parece a la siguiente, debería estar bien:

ingrese la descripción de la imagen aquí

Montmons
fuente
Gracias. Esto me ayudó, ya que estaba probando un código en Playground (parte de un proyecto más grande).
mayankk2308
2

Mismo problema, situación y solución ligeramente diferente. Estoy siguiendo un tutorial que decía usar el siguiente código:

    // 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") }
    }
}

Tuve el mismo problema que otros, pero ninguna de las soluciones solucionó el problema. Después de experimentar, todo lo que hice fue eliminar Sound de la ruta en la siguiente llamada y todo funcionó:

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

Parece que el tutorial fue un error al decirme que incluyera Sound en la ruta.

tipo de paz
fuente
2

Agregué file.txta mi proyecto y se agregó automáticamente al Copy Bundle Filesde mi proyecto. Para mí, tuve que quitar la extensión del forResourcey funcionó.

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

Esto fue útil para mí: xcode: copie una estructura de carpetas en mi paquete de aplicaciones

Marque la opción "crear referencias de carpeta" cuando cree activos en carpetas anidadas.

Luego busque la ruta al archivo de esta manera:

let path = Bundle(for: type(of : self)).path(forResource: "some_folder_a/some_folder_b/response.json", ofType: nil)
Arkadiusz Turlewicz
fuente
2

Es una locura cuánto tiempo puede costar un problema tan simple.

Algunas respuestas aquí me ayudaron, pero siempre lo intenté:

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

Por alguna razón, eso no funciona, pero obtener la ruta y traducirla a una URL después funciona:

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

Creo que no quieres el inDirectory:método. Prueba esto en su lugar:

if let filepath = Bundle.main.path(forResource: "newTest", ofType: "txt") {
Rob Mayoff
fuente