Frage von DasesColles, 73

Unity3d Datei über Skript erstellen?

Hey Leute,

ich möchte über ein Skript in Unity3d eine Textdatei erstellen. Soweit so gut. Den Code(C#) kenn ich, und ich weiß, dass er funktionieren sollte, aber ich bekomme diese Fehlermeldung:

UnauthorizedAccessException: Access to the path 'C:\Users\ICH\Documents\' is denied.

Hier auch mal der Code für das Erstellen und Schreiben

System.IO.StreamWrite sw = System.IO.File.AppendText(getPath() + fileName);

Die Methode getPath() gibt folgenden Pfad:

C:\Users\ICH\Documents\

FileName ist mit "Test.txt" bestückt.

Warum taucht die Exception auf und wie kann ich den Fehler beheben? Liegt es am Code?

Hoffe jemand kann mir hier helfen,

MfG,

DasesColles

Antwort
von Berny96, 45

Schalte mal dein Antivirus aus und probiers dann nochmal. Kurzgesagt verbietet entweder Windows oder dein Antivirus dem Compiler die Datei einzulesen.

Kommentar von DasesColles ,

Hab ich ausprobiert. Ändert nichts. Wenn ich den Code in einem "normalen" C# Programm benutze funktioniert er.

Kommentar von Berny96 ,

Ist ja auch klar, Unity bekommt keine Rechte in deine Dateien zu schauen. Starte vielleicht mal als Administrator? 

Kommentar von DasesColles ,

Auch start mit Administratorrechten hilft nichts :(

Kommentar von DasesColles ,

Welchen Code würdest du verwenden um eine Datei zu erstellen und in sie zu schreiben? Vllt funktioniert der ja. Es gibt ja, soweit ich weiß, viele Möglichkeiten für so etwas.

Kommentar von Berny96 ,
File.WriteAllText("Pfad", "text");

oder 

File.WriteAllLines("Pfad", stringArray);

Streamwriter benutze ich nur wenn ich dynamisch den Text aufbaue und nicht gerade einen Stringbuilder benutze.

PS: Die Methoden erstellen falls noch nicht vorhanden die Datei und schreiben entsprechend rein.

PS: Und füge doch "using System.IO;" oben hinzu um nicht die Assemblys immer nennen zu müssen :D

Kommentar von DasesColles ,

Bekomme auch mit diesem Code den selben Fehler :(

Kommentar von Berny96 ,

Okay hab mal ein bisschen rumgeschaut und das hier gefunden.

Application.persistentDataPath

Das gibt dir einen Pfad zurück wo du Sachen speichern kannst. Der Pfad sucht sich automatisch auf Android, IOS, Windows und sonst wo einen Pfad wo Unity Zugriff hat und ist extra für sowas gedacht. Also einfach statt getPath(), Application.persistentDataPath einsetzen. 

Natürlich blöd wenn du unbedingt in Documents arbeiten willst aber ich denke das sollte jetzt nicht das Problem sein?

Kommentar von DasesColles ,

Mir ist erstmal wichtig, das er es abspeichert. Aber wie der Zufall will, wieder der selber Fehler.

Der neue Pfad:

C:/Users/ICH/AppData/LocalLow/DefaultCompany/MeinSpiel/
Kommentar von Berny96 ,

Puh. So langsam wirds eng. Ich würde darauf tippen das du immernoch irgendeinen Scanner offen hast der Unity verbietet Dateien zu öffnen. 

Kommentar von DasesColles ,

Heute hab ich mal wieder "C:/Users/ICH/Documents" versucht und es hat Funktioniert, die anderen Pfade aber nicht.

Kommentar von DasesColles ,

Was ich auch herausgefunden habe das der Pfad

C:/Users/ICH/Documents/

funktioniert, aber der Pfad

C:\Users\ICH\Documents

nicht funktioniert.

Warum das?

Kommentar von Berny96 ,

Also "\" gilt in C# als escapesequenz das heisst man kann mit vorangestelltem "\" verschiedene Sachen einfügen wie zum Beispiel mit \n eine Eingabe. \t bedeutet in einem string einmal Tab drücken. Wenn du den Pfad jetzt mit "\" beschreibst dann denkt sich C# immer du willst eine Sonderfunktion verwenden obwohl du lediglich den Pfad beschreibst. Das kannst du entweder beheben in dem du \ mit / ersetzt ODER was auch viel schöner ist einfach ein @ Zeichen vor dem string setzen. Das sagt dann dem Comiler das der string ein URL oder Pfad darstellen soll und er ignoriert alle Escapesequenzen. 

@"C:\Users\ICH\Documents"



Kommentar von DasesColles ,

Das ist mir bewusst mit "\". Ich hab ja auch immer "\\" geschrieben. Ich arbeite jetzt mit

File.WriteAllText("NeuerOrdner/test.txt", line);

Funktioniert jetzt. Er nimmt den Anwendungspfad mit dem Unterordner "NeuerOrdner". Der Code jedoch überschreibt den Inhalt der txt-Datei. Wie kann ich das ändern?

Kommentar von Berny96 ,

Was genau möchtest du tuen? Du kannst ja den Text einlesen mit File.ReadAllText("pfad") und ihn entpsrechend bearbeiten und ihn dann wieder reinschreiben. Dafür gibt es aber auch die Methode File.AppendAllText("pfad", text) was einfach den angegebenen Text hinten dranhängt.

Kommentar von DasesColles ,

Danke. File.AppendAllText ist ja irgendwie logisch. Jetzt funktioniert endlich alles :D

Kommentar von DasesColles ,

Welchen unterschied macht es, ob ich C:\ oder C:/ habe?

Denn die bekomme ich bei den Pfaden.

Kommentar von Berny96 ,

Windows verwendet immer "\" aber "/" ist eher allgemeingültig. Ich benutze ausschließlich "/". 

Keine passende Antwort gefunden?

Fragen Sie die Community