Programm funktioniert plötzlich nicht mehr, da es Dateien nicht findet.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Programm funktioniert plötzlich nicht mehr, da es Dateien nicht findet.

    Hallo,

    ich habe ein kleines Programm geschrieben, welches Daten (.CVS) von einer SD Karte ausliest und diese dann in ein Array importiert und auswertet.

    Im Sommer habe ich eine Version fertiggestellt, getestet und alles hat gut funktioniert. Das bedeutet, das die Dateien auf der SD Karte gefunden, kopiert,
    umbenannt und verschoben wurden. Die Auswahl des Pfades habe ich über einen Filechooser gelöst, so das der Pfad korrekt sein sollte.
    Am Programm habe ich seitdem nichts mehr geändert und plötzlich findet das Programm die Dateien nicht mehr???

    Ich würde mich sehr freuen, wenn ich da einen Tipp bekommen könnte, woran das liegt.
    Diese Tool ist das erste welches ich in Objective-C geschrieben habe.

    Ein Log Auszug:

    Shell-Script

    1. 2016-11-06 16:16:02.229 TanitaWaage[691:38971] Die URL ist file:///Users/michael/Desktop/TanitaWaage/SD-Karte/
    2. 2016-11-06 16:16:02.229 TanitaWaage[691:38971] Die URL als Pfad ist /Users/michael/Desktop/TanitaWaage/SD-Karte
    3. 2016-11-06 16:16:06.015 TanitaWaage[691:38971] Es wurde 1 gewählt
    4. 2016-11-06 16:16:06.015 TanitaWaage[691:38971] Übergebe den Inhalt für Waage Speicher Nummer 1
    5. 2016-11-06 16:16:06.015 TanitaWaage[691:38971] Übergebe den Inhalt für den SD-Pfad file:///Users/michael/Desktop/TanitaWaage/SD-Karte/
    6. 2016-11-06 16:16:06.015 TanitaWaage[691:38971] Der Dateiname für den Import ist: DATA1.CSV
    7. 2016-11-06 16:16:06.016 TanitaWaage[691:38971] Der Dateiname mit Pfad von der SD-Karte: file:/Users/michael/Desktop/TanitaWaage/SD-Karte/DATA1.CSV
    8. 2016-11-06 16:16:06.016 TanitaWaage[691:38971] Der Dateipfad des Imports: /Users/michael/Library/Application Support/TanitaWaage/Import/
    9. 2016-11-06 16:16:06.016 TanitaWaage[691:38971] Der Dateipfad mit Name des Imports: /Users/michael/Library/Application Support/TanitaWaage/Import/DATA1.CSV
    10. 2016-11-06 16:16:06.016 TanitaWaage[691:38971] Der Dateiname für Benutzerdaten ist: BenutzerDaten1.plist
    11. 2016-11-06 16:16:06.016 TanitaWaage[691:38971] Der Dateipfad für Benutzerdaten ist: /Users/michael/Library/Application Support/TanitaWaage/Daten/
    12. 2016-11-06 16:16:06.016 TanitaWaage[691:38971] Der Dateipfad mit Name für Benutzerdaten ist: /Users/michael/Library/Application Support/TanitaWaage/Daten/BenutzerDaten1.plist
    13. 2016-11-06 16:16:06.016 TanitaWaage[691:38971] Das Datenverzeichnis für die Programmdaten sind: /Users/michael/Library/Application Support/TanitaWaage
    14. 2016-11-06 16:16:06.017 TanitaWaage[691:38971] Der Dateiname des Backups ist: DATA1-2016-11-06um16-16-06.CSV
    15. 2016-11-06 16:16:06.017 TanitaWaage[691:38971] Der Dateipfad des Backups ist: /Users/michael/Library/Application Support/TanitaWaage/Backup/
    16. 2016-11-06 16:16:06.017 TanitaWaage[691:38971] Der Dateipfad mit Name des Backups ist: /Users/michael/Library/Application Support/TanitaWaage/Backup/DATA1-2016-11-06um16-16-06.CSV
    17. 2016-11-06 16:16:06.033 TanitaWaage[691:38971] Die Datei /Users/michael/Library/Application Support/TanitaWaage/Daten/BenutzerDaten1.plist ist nicht vorhanden
    18. 2016-11-06 16:16:13.019 TanitaWaage[691:38971] Es wurde der Import Button gedrückt
    19. 2016-11-06 16:16:13.019 TanitaWaage[691:38971] Der Speicherplatz der Waage ist die 1
    20. 2016-11-06 16:16:13.019 TanitaWaage[691:38971] Der Dateipfad ist file:///Users/michael/Desktop/TanitaWaage/SD-Karte/
    21. 2016-11-06 16:16:13.019 TanitaWaage[691:38971] Der Dateiname für den Import ist: DATA1.CSV
    22. 2016-11-06 16:16:13.019 TanitaWaage[691:38971] Der Dateiname mit Pfad von der SD-Karte: file:/Users/michael/Desktop/TanitaWaage/SD-Karte/DATA1.CSV
    23. 2016-11-06 16:16:13.020 TanitaWaage[691:38971] Der Dateipfad des Imports: /Users/michael/Library/Application Support/TanitaWaage/Import/
    24. 2016-11-06 16:16:13.020 TanitaWaage[691:38971] Der Dateipfad mit Name des Imports: /Users/michael/Library/Application Support/TanitaWaage/Import/DATA1.CSV
    25. 2016-11-06 16:16:13.020 TanitaWaage[691:38971] Der Dateiname für Benutzerdaten ist: BenutzerDaten1.plist
    26. 2016-11-06 16:16:13.020 TanitaWaage[691:38971] Der Dateipfad für Benutzerdaten ist: /Users/michael/Library/Application Support/TanitaWaage/Daten/
    27. 2016-11-06 16:16:13.020 TanitaWaage[691:38971] Der Dateipfad mit Name für Benutzerdaten ist: /Users/michael/Library/Application Support/TanitaWaage/Daten/BenutzerDaten1.plist
    28. 2016-11-06 16:16:13.020 TanitaWaage[691:38971] Das Datenverzeichnis für die Programmdaten sind: /Users/michael/Library/Application Support/TanitaWaage
    29. 2016-11-06 16:16:13.021 TanitaWaage[691:38971] Der Dateiname des Backups ist: DATA1-2016-11-06um16-16-13.CSV
    30. 2016-11-06 16:16:13.021 TanitaWaage[691:38971] Der Dateipfad des Backups ist: /Users/michael/Library/Application Support/TanitaWaage/Backup/
    31. 2016-11-06 16:16:13.021 TanitaWaage[691:38971] Der Dateipfad mit Name des Backups ist: /Users/michael/Library/Application Support/TanitaWaage/Backup/DATA1-2016-11-06um16-16-13.CSV
    32. 2016-11-06 16:16:13.021 TanitaWaage[691:38971] Dateiname mit Pfad der SD-Karte: file:/Users/michael/Desktop/TanitaWaage/SD-Karte/DATA1.CSV -- file:///Users/michael/Library/Developer/Xcode/DerivedData/TanitaWaage-dthhotjfiikkwccxbvttdhpxeyhk/Build/Products/Debug/
    33. 2016-11-06 16:16:13.022 TanitaWaage[691:38971] Dateiname mit Pfad für den Import: file:///Users/michael/Library/Application%20Support/TanitaWaage/Import/DATA1.CSV
    34. 2016-11-06 16:16:13.022 TanitaWaage[691:38971] Dateiname mit Pfad für den ProgrammDaten: file:///Users/michael/Library/Application%20Support/TanitaWaage/Daten/
    35. 2016-11-06 16:16:13.022 TanitaWaage[691:38971] Dateiname mit Pfad für die Daten: file:///Users/michael/Library/Application%20Support/TanitaWaage/Daten/BenutzerDaten1.plist
    36. 2016-11-06 16:16:13.022 TanitaWaage[691:38971] Dateiname mit Pfad für den Backup: file:///Users/michael/Library/Application%20Support/TanitaWaage/Backup/DATA1-2016-11-06um16-16-13.CSV
    37. 2016-11-06 16:16:13.022 TanitaWaage[691:38971] Übergebe Quelle file:/Users/michael/Desktop/TanitaWaage/SD-Karte/DATA1.CSV -- file:///Users/michael/Library/Developer/Xcode/DerivedData/TanitaWaage-dthhotjfiikkwccxbvttdhpxeyhk/Build/Products/Debug/
    38. 2016-11-06 16:16:13.022 TanitaWaage[691:38971] Übergebe Quelle file:///Users/michael/Library/Application%20Support/TanitaWaage/Import/DATA1.CSV
    39. 2016-11-06 16:16:13.023 TanitaWaage[691:38971] Die Datei wurde von file:/Users/michael/Desktop/TanitaWaage/SD-Karte/DATA1.CSV -- file:///Users/michael/Library/Developer/Xcode/DerivedData/TanitaWaage-dthhotjfiikkwccxbvttdhpxeyhk/Build/Products/Debug/ nach file:///Users/michael/Library/Application%20Support/TanitaWaage/Import/DATA1.CSV kopiert
    40. 2016-11-06 16:16:13.024 TanitaWaage[691:38971] Die Fehlermeldung ist Error Domain=NSCocoaErrorDomain Code=4 "The file “DATA1.CSV” doesn’t exist." UserInfo=0x60000027ee80 {NSFilePath=/Users/michael/Library/Application Support/TanitaWaage/Import/DATA1.CSV, NSUnderlyingError=0x60000024e220 "The operation couldn’t be completed. No such file or directory"}
    41. 2016-11-06 16:16:13.025 TanitaWaage[691:38971] Die Datei file:///Users/michael/Library/Application%20Support/TanitaWaage/Import/DATA1.CSV wurde entsperrt
    42. 2016-11-06 16:16:13.025 TanitaWaage[691:38971] Es sind 0 Tagessätze im Zeilen-Array
    43. 2016-11-06 16:16:13.025 TanitaWaage[691:38971] Zeilen-Array vor dem entfernen 0
    44. 2016-11-06 16:16:13.025 TanitaWaage[691:38971] Zeilen-Array nach dem entfernen 0
    45. 2016-11-06 16:16:13.025 TanitaWaage[691:38971] Das Array ist Leer bitte wählen Sie ein anderen Speicher
    46. 2016-11-06 16:16:13.025 TanitaWaage[691:38971] Die leere Datei file:///Users/michael/Library/Application%20Support/TanitaWaage/Import/DATA1.CSV wurde gelöscht
    Alles anzeigen
    Das Problem schein in Zeile 32, 39, 40.

    Vielen Dank
    Michael
  • Wir kennen den Quellcode nicht und testen können wir das auch nicht. Was genau bei den Debugausgaben passiert, können wir auch nicht wissen. Was die Fehlermeldung bedeutet, weiß Du hoffentlich selber! Da musst Du selber testen und mit den Debugger ran. Einfach mal prüfen, ob bei der Ausgabe aus Zeile 39 die Datei kopiert wird. Geht das gut? Keine Fehlermeldung?

    Wieso arbeitest Du eigenltich mit einer Debug-Vesion und nicht mit einem Release?

    Ziemlich viel Debugausgaben...
  • Das Programmieren mit Objective-C und Xcode mach ich nicht nicht allzu lange. Ich kann auch leider nicht täglich programmieren und so einen Plan wie man mit Xcode arbeitet habe ich auch nicht wirklich. Immer wieder fange ich von vorne an weil dazwischen die Zeit zu gross ist und immer wieder etwas vergesse. Jetzt möchte ich aber endlich mal eine kleines Projekt bis zum Abschluss durchziehen.

    Die Debug Ausgaben sind in Wirklichkeit Ausgaben auf die Konsole, da ich noch nicht weis wie man logfiles erstellt.
    Ich weiss das ich zu viel ausgebe und ich bemühe mich dies weniger werden zu lassen. Aber an bestimmten Stellen, möchte ich wissen was das für Werte drin stehen.

    Mir ist aufgefallen, das die Dateien nicht gefunden werden wenn ich den Pfad ändere.
    Beende ich das Programm und starte es dann wieder, ändere nicht den Pfad, sondern lasse diesen so wie er dann beim einlesen der NSUserdefault ist.
    Dann drücke ich die Schaltfläche Importieren, klappt es seltsamerweise. Daraus ziehe ich den Schluss, das mein Problem in dem Abschnitt ist worin ich den Pfad auswähle.

    C-Quellcode

    1. #pragma Aktion Button SD-Kart
    2. -(IBAction)buttonAuswahlSdKarte:(id)sender {
    3. // Ein Öffnen Pannel wird erzeugt
    4. NSOpenPanel *ladePanel = [NSOpenPanel openPanel];
    5. // deaktiviert die option mehrere Objekte auswählen zu können
    6. [ladePanel setAllowsMultipleSelection:NO];
    7. // Titel des Dialogfeldes für die Aufgabe festlegen
    8. [ladePanel setTitle: @"Pfad zur SD-Karte auswählen"];
    9. [ladePanel setCanChooseDirectories:YES];
    10. [ladePanel setCanCreateDirectories:NO];
    11. [ladePanel setCanChooseFiles:NO];
    12. // Aufruf (runModal) des Dialogfensters Laden
    13. if ([ladePanel runModal] == NSModalResponseOK) {
    14. // Liefert ein Array-Objekt mit den vollständigen Pfadnamen der ausgewählten Dateien
    15. NSArray *ladeURLs = [ladePanel URLs];
    16. // Da nur eine Auswahl möglich war, wird die erste Datei im Arrray ermittelt
    17. pfadSD = [ladeURLs objectAtIndex:0];
    18. NSLog(@"Die URL ist %@", pfadSD);
    19. NSLog(@"Die URL als Pfad ist %@", [pfadSD path]);
    20. // Der Pfad wird in dem TextField ausgegeben
    21. [textfeldSdKarte setStringValue:[pfadSD path]];
    22. // speichert den Datenpfad auf der Festplatte im Preferences Verzeichnis
    23. NSUserDefaults *systemEinstellungen = [NSUserDefaults standardUserDefaults];
    24. [systemEinstellungen setURL:pfadSD forKey:@"pfadSD"];
    25. [systemEinstellungen synchronize];
    26. } // ENDE Dialogfenster Laden
    27. } // ENDE IBAction buttonAuswahlSdKarte
    Alles anzeigen
  • Ist ein bißchen schwierig so über Fernwartung.

    Wenn ich Deinen Code richtig verstehe, versuchst Du über NSUserDefaults einen Wert (den Pfad) für verschiedene Stellen Deines Programms auszutauschen. Dafür ist NSUserDefaults so eigentlich nicht gedacht.

    Ich könnte mir vorstellen, daß in der modal Runloop das NSUserDefaults synchronize asynchron abläuft und deshalb dann an anderer Stelle kurz nach dem vermeintlichen Schreiben nicht aktuell ist. Nur wild geraten.

    Ich würde wohl generell für den Pfad eher irgendwo eine Property setzen (z.B. im AppDelegate). Beim Starten des Programms werden die UserDefaults ausgelesen und die Property entsprechend mit dem letzten Wert gesetzt und beim Beenden des Programms wird in die User Defaults der letzte Wert der Property eingetragen. Dazwischen wird dann nur mit der Property agiert.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • torquato schrieb:

    Ich könnte mir vorstellen, daß in der modal Runloop das NSUserDefaults synchronize asynchron abläuft und deshalb dann an anderer Stelle kurz nach dem vermeintlichen Schreiben nicht aktuell ist. Nur wild geraten.
    Und falsch geraten. Wenn du etwas in die UserDefaults schreibst, ist das innerhalb deines Programms sofort überall verfügbar. Die Methode synchronize triggert nur das Speichern auf die Platte. Der Aufruf von synchronize ist übrigens in den seltensten Fällen wirklich notwendig. Das System schreibt die UserDefaults zu gegebenen Zeitpunkt selbstständig auf die Platte.
  • Beim Start des Programms werden die NSUserdefaults gelesen um die Variablen für das Programm parat zu haben.
    Wenn jetzt der Pfad über NSOpenPanel geändert wird, dann schreibe ich diesen wieder mit NSUserdefaults um diesen
    neuen Wert aktuell zu halten.

    Dann werde ich das Synchronize mal entfernen und sehen wass passiert?
    Danke.


    Das NSUserdefaults funktioniert auch ohne synchronize, aber leider lag es nicht daran.

    Wenn ich das Programm wieder beende und es dann wieder starte, den Pfad nicht ändere, funktioniert das ganze.
    Also was ist anders?
    Die Variable pfadSD welche ich mit dem NSOpenpanel fülle ist vom Typ her NSURL.
    Habe peinslichst darauf geachtet, das die Datentypen stimmen.

    Beim Speichern der NSURL verwende ich

    C-Quellcode

    1. // speichert den Datenpfad auf der Festplatte im Preferences Verzeichnis
    2. NSUserDefaults *systemEinstellungen = [NSUserDefaults standardUserDefaults];
    3. [systemEinstellungen setURL:pfadSD forKey:@"pfadSD"];



    Beim Laden der NSURL verwende ich

    C-Quellcode

    1. // Laden der Programmeinstellungen für die SD-Karte
    2. NSUserDefaults *systemEinstellungen = [NSUserDefaults standardUserDefaults];
    3. pfadSD = [systemEinstellungen valueForKey:@"pfadSD"];
    Wird das ganze dann immer noch als NSURL geladen, oder wird es als String geladen?
    Naja die Variable ist ja vor dem laden "pfadSD" schon als NSURL definiert worden.

    Das Problem muss irgendwo dazwischen sein ??

    Also habe ich nach dem speichern durch NSUserdefaults die Variable direkt wieder eingelesen

    C-Quellcode

    1. // speichert den Datenpfad auf der Festplatte im Preferences Verzeichnis
    2. NSUserDefaults *systemEinstellungen = [NSUserDefaults standardUserDefaults];
    3. [systemEinstellungen setURL:pfadSD forKey:@"pfadSD"];
    4. // Laden der Programmeinstellungen für die SD-Karte
    5. pfadSD = [systemEinstellungen valueForKey:@"pfadSD"];
    6. } // ENDE Dialogfenster Laden
    Und dann hat es direkt auf anhieb geklappt.
    Kann doch nicht sein, das die Vorgehensweise so funktioniert?
    Die Variable pfadSD war ja vorher auch schon im Speicher, das müsste bedeuten, das die Variable irgendwas mit dem aussehen zu tun haben muss?

    NSLog(@"Die URL ist %@", pfadSD);
    Ergibt den Inhalt: file:///Users/michael/Desktop/SD-Karte/

    NSLog(@"Die URL als Pfad ist %@", [pfadSD path]);
    Ergibt den Inhalt: /Users/michael/Desktop/SD-Karte

    Das was in der plist gespeichert wird sieht so aus: /Users/michael/Desktop/SD-Karte

    Aber mit [pfadSD path] kann ich es nicht in die NSURL speichern, weil da ein String zurückgegeben wird.

    Zumindest funktioniert es un mit der einen zusätzlichen weile code kann ich leben, obwohl das ein Gefühl in mir auslöst die Lösung hin gefriemelt zu haben.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von michael m. ()