Unity IOException: Cannot create 'path' because a file with the same name already exists.?
Hey,
in meinem Autoupdater Script was ich in unity programmiere habe ich nun diesen Fehler: https://paste.ofcode.org/hzX9CZX7GmMeKn5YxXqeJV
Wie kann ich den Beheben? Schließlich soll er ja nur die ZIP Datei herunterladen und entpacken. Und nicht irgendein Ordner erstellen.
Lg
2 Antworten
Wäre es ein Problem, vor dem Entpacken die bereits vorhandene Datei zu löschen, sofern vorhanden? Ich meine sowas wie:
if (File.Exists(path))
{
File.Delete(path)
}
Und anscheinend hat er damit ein Problem, weil die Spieldateien bereits existieren. Ich kenne deinen Code dazu nicht, aber ich würde annehmen, dass irgendwo entweder direkt oder versteckt versucht wird, so ein directory anzulegen.
Verwendest du die ZipFile.ExtractToDirectory-Methode?
Ja diese Methode verwende ich. Nein ich habei n der ZIP erstmal ein test textdokument was es so noch nicht existiert
Naja jetzt steht da: UnauthorizedAccessException: "Access to the path 'C:\Users\Benutzer\Desktop\Workspaces\Unity\War Reloaded' is denied."
Soll ich dir mal die klasse schicken?
Ja, wäre hilfreich wenn du sie in pastebin oder so hochladen würdest ;)
Zeile 84: Kannst du es mal mit
ZipFile.ExtractToDirectory(zipLoc, path.Replace(' ', '_'), true);
probieren?
EDIT: Syntax fixed
"Argument 3: Konvertierung von "bool" in "System.Text.Encoding" nicht möglich."
Ich benutze die 2018er version von unity
strange, eigentlich sollte ZipFile.ExtractToDirectory eine Überlagerung haben, die zwei strings und ein bool annimmt:
Komisch was könnte man sonst noch probieren?
Unabhängig davon steht in der Dokumentation:
"Das angegebene Verzeichnis darf nicht vorhanden sein. Die-Methode erstellt das angegebene Verzeichnis und alle Unterverzeichnisse."
Also solltest du für den Inhalt deiner Zip lieber nen eigenen Ordner anlegen und diesen vor Aufruf der Methode löschen, sofern er existiert.
Es gäbe noch "ZipArchive" und noch "ZipFileExtensions"
Um zu checken, ob es am existierenden Verzeichnis liegt, vielleicht testweise das hier?
public void unzip()
{
string path = Directory.GetCurrentDirectory() + @"\TestFolder";
ZipFile.ExtractToDirectory(zipLoc, path.Replace(' ', '_'));
UnityEngine.Debug.Log("Unziped to: " + path);
//clean();
}
Wenn das der Fehler ist, sollte obiger Code exakt einmal funktionieren.
Oder kennst du noch eine andere lösung?
Ok, ne kleine Idee:
public void unzip()
{
string newPath = path.Replace(' ', '_') + @"\newFile.txt";
string path = Directory.GetCurrentDirectory() + @"\TestFolder";
ZipFile.ExtractToDirectory(zipLoc, newPath);
UnityEngine.Debug.Log("Unziped to: " + path);
//clean();
}
Der Gedanke ist, dass du vielleicht versuchst, ein Verzeichnis durch eine Datei zu ersetzen, was nicht erlaubt ist. Statt ".txt" solltest du natürlich deine eigene Endung benutzen
Ok dann kriege ich diesen fehler: UnauthorizedAccessException: Access to the path 'C:\Users\Benutzer\Desktop\Workspaces\Unity\War Reloaded' is denied.
How annoying :'D Hast du vielleicht einfach keine Schreibrechte in dem Ordner? Versuch einfach mal eiskalt, stattdessen in den Pfad C:\temp zu entpacken
Dann kommt: ArgumentException: Name has invalid chars
What? Die Zeile sollte ungefähr so aussehen:
ZipFile.ExtractToDirectory(zipLoc, @"C:\temp");
Ähm der fehler kommt von der downloadUpdate Methode
Ok, das würde ja bedeuten, dass er entweder mit unzip fertig ist oder gar nicht erst damit begonnen hat, oder? Kannst du mal gucken, ob in C:\temp jetzt dein .zip entpackt wurde?
Nee weil er es ja nicht schaft die datei zu downloaden
und du hast den Pfad wirklich nur in der einen Zeile in unzip verändert?
Ja und jetzt gerade auch in der downloade method. Aber da kam jetzt dieser fehler:
NullReferenceException: Object reference not set to an instance of an objectAutoUpdater.downloadUpdate () (at Assets/War Confirmed/Scripts/AutoUpdater.cs:71)
Das ist höchst seltsam, denn wenn du den Pfad nur in der unzip-Methode veränderst, sollte sich am Ablauf bis dahin doch gar nichts ändern.
Die zeile 71 ist die: client.DownloadFile(downloadURL, @"C:\temp");
Oh, moment, machen wir nochmal alle Änderungen rückgängig :'D
Du downloadest die Zip-Datei in irgendein Directory und versuchst dann, den Inhalt in dasselbe Directory zu entpacken?
Ich hab noch ne Idee. Schau mal nach, was eigentlich in zipLoc drinsteht:
public void unzip()
{
//string path = Directory.GetCurrentDirectory();
//ZipFile.ExtractToDirectory(zipLoc, path.Replace(' ', '_'));
//UnityEngine.Debug.Log("Unziped to: " + path);
//clean();
UnityEngine.Debug.Log("ZipLoc: " + zipLoc);
}
Wenn ich das richtig sehe, steht da nur der Pfad, nicht aber explizit die zip-Datei. In diesem Fall müsstest du zipLoc entsprechend ändern oder erweitern:
public void unzip()
{
string path = Directory.GetCurrentDirectory().Replace(' ','_');
ZipFile.ExtractToDirectory(zipLoc + @"\filename.zip", path);
UnityEngine.Debug.Log("Unziped to: " + path);
//clean();
}
Natürlich musst du "filename.zip" durch den echten Namen ersetzen.
.... die datei hat sich wohl erstellt ich habe nur immer im falschen Ordner der aber auch so heißt geguckt. Aber anscheinend kann er nicht Dateien die schon existieren überschreiben wie macht ich das?
Obwohl hier ist noch ein Fehler: NullReferenceException: Object reference not set to an instance of an object
Aber anscheinend kann er nicht Dateien die schon existieren überschreiben wie macht ich das?
Vorher prüfen, ob die Datei schon existiert und gegebenenfalls vorher löschen?
NullReferenceException heißt, dass er irgendwo ein Objekt verwenden muss, das es gar nicht gibt. Je nachdem an welcher Stelle die auftritt, kann das alle möglichen Ursachen haben.
Wie auch immer jetzt ist es wieder dieser fehler: UnauthorizedAccessException: Access to the path 'C:\temp\fiel' is denied.
Hast du schon geguckt, was genau in zipLoc drinsteht? (vgl. meine Antwort von vor 3 Stunden).
Ok ich habs mal gestartet wenn ich auf download klicke dann steht da "Zip was downloaded to: C:\Temp" das und dann kommt der fehler das heißt er schafft es nichtmal die datei zu downloaden sonst würde danach stehen: "Download Complete"
Vergessen wir die Geschichte mit C:\Temp, ich glaube der Fehler liegt woanders.
Stell nochmal den Code wieder her, den du mir ursprünglich geschickt hast (https://paste.ofcode.org/HJMikFjVEYzyJ5Z37i3iCL). Bei der Version schafft er es ja wenigstens, die .zip zu downloaden, wenn ich das richtig verstanden habe.
In dieser Version logge mal, was in zipLoc drinsteht.
Ok in der Console steht:
"Downloade to C:\Users\Benutzer\Workspaces\Unity\War Reloaded...." Danach steht da:
ArgumentException: The specified path is not of a legal form (empty).
Das ist doch vorher gar nicht passiert, oder? Bist du sicher, dass alles genau so ist, wie es war, bevor wir was dran geändert haben?
Ja ich habe mir den kompletten code kopiert...
Ok, und in den anderen Klassen hast du auch zwischendurch nichts geändert?
Dann müssen wir wohl nachgucken, was mit den Argumenten passiert ist...
Logge mal in der download-methode, was in downloadURL und in path drinsteht.
wie den path hab ich doch gelloged und dir url weiß ich auswendig oder hab ich
da jetzt was falsch verstanden?
so sieht jetzt die klasse mit den entsprechenden loggern aus: https://paste.ofcode.org/RDP2TCZfAWp2iskRExUin4
Ok, sieht ganz gut aus. Bis zu welchem Punkt kommt er in den Logs?
OMG kein wunder irgendwie geht die URL nicht: "Downloade from to C:\Users\Benutzer\Dekstop\Workspaces\Unity\War Reloaded...
Kann es sein das pastebin offline ist?
Ok solange wie Pastebin offline ist können wir es leider nicht testen
Ärgerlich, aber das hält uns ja nicht davon ab, zu denken :D
Wenn ich das richtig verstanden habe, liefert
Directory.GetCurrentDirectory();
die Location C:\Users\Benutzer\Dekstop\Workspaces\Unity\War Reloaded zurück.
Und du setz zipLoc auf eben diesen string.
Ich denke, das Problem bei ExtractToDirectory(zipLoc, ...) ist, dass zipLoc nicht explizit den Pfad der zip-Datei angibt, sondern nur das Verzeichnis, in dem die zip-Datei zu finden ist. Meiner Ansicht nach müsstest du hier stattdessen
ExtractToDirectory(zipLoc + @"\filename.zip", ...) verwenden.
Warte neuigkeiten aus den logs:
1 nachicht:
"Downloade from https://lens-support.de/Files/WarConfirmed/WarConfirmed.zip to C:\Users\Finn\Desktop\Workspaces\Unity\War Reloaded..."
2 nachicht:
"Downloaded to: C:\Users\Finn\Desktop\Workspaces\Unity\War Reloaded"
3 Nachicht:
"Unzip from C:\Users\Benutzer\Desktop\Workspaces\Unity\War Reloaded to C:\Users\Benutzer\Desktop\Workspaces\Unity\War Reloaded..."
4 Nachicht:
"UnauthorizedAccessException: Access to the path 'C:\Users\Benutzer\Desktop\Workspaces\Unity\War Reloaded' is denied.
Ok, probiere es jetzt in Zeile 88 mit:
ZipFile.ExtractToDirectory(zipLoc + @"\WarConfirmed.zip", path.Replace(' ', '_'));
er schafft es zum unzip und dann kommt wieder:
"FileNotFoundException: Could not find file C:\Users\Benutzer\Desktop\Workspaces\Unity\War Reloaded\WarConfirmed.zip"
Und er sagt bei mir das das Update neu währe obwohl beide versionen gleich sind also 1.0 xD und wie kann ich die aktuellste version aus er PlayerInfo auslesen?
Liegt das daran, dass du die Leerzeichen ersetzt hast? mach mal vor Zeile 88
zipLoc = zipLoc.Replace(' ', '_');
Dieses mal steht davor nur: "Downloade from https://lens-support.de/Files/WarConfirmed/WarConfirmed.zipto C:\Users\Finn\Desktop\Workspaces\Unity\War_Reloaded..."
Und dann der Fehler
"UnauthorizedAccessException: Access to the path C:\Users\Benutzer\Desktop\Workspaces\Unity\War_Reloaded" is denied."
fml... Aber die Änderung mit
ZipFile.ExtractToDirectory(zipLoc + @"\WarConfirmed.zip", path.Replace(' ', '_'));
Hast du drin gelassen, oder?
ja nur dieses Replace hab ich entfernt
Ok, der Übersichtlichkeit zuliebe:
Entferne mal alle Replaces. und dann ersetze Zeile 71 und 72 durch:
path = Directory.GetCurrentDirectory().Replace(' ', '_');
zipLoc = Directory.GetCurrentDirectory().Replace(' ', '_');
Ok bis zu unzip message geht es danach kommt das:
DirectoryNotFoundException: Could not find a part of the path "C:\Users\Benutzer\Desktop\Workspaces\Unity\War_Reloaded\WarConfirmed.zip".
Gut, das ist ne Neuerung :D Schau mal manuell in C:\Users\Benutzer... nach, was exakt fehlt.
Ok, aber der Ordner War_Reloaded (mit Unterstrich) existiert?
Das ist natürlich ein Problem :D
Darf ich fragen, wieso genau du die Leerzeichen eigentlich durch Unterstriche ersetzen musst?
Hab ich mal in einem tutorial gesehen deswegen mache ich das
Naja, besser wäre es, wenn deine Ordnernamen überhaupt keine Leerzeichen hätten...
Unabhängig davon: Probier die Replaces einfach mal alle wegzulassen.
Jeztt probiert er es zu downloaden bricht ab und dieser fehler erscheint:
UnauthorizedAccessException: Access to the path 'C:\Users\Finn\Desktop\Workspaces\Unity\War Reloaded' is denied.
Vielleicht bei DownloadFile stattdessen folgendes?
client.DownloadFile(downloadURL, zipLoc + @"\WarConfirmed.zip");
Perfekt er kann jetzt alles entpacken und downloaden aber löschen kanne rdie nicht grund: UnauthorizedAccessException: "C:\Users\Benutzer\Desktop\Workspaces\Unity\War Reloaded is a directory"
achso er kanne s nicht löschen weil ich @"\WarConfirmed.zip" vergessen habe
Ok aber wie kann ich machen das er die Sachen auch überschrieben kan
Eigentlich sollte das halt mit
ZipFile.ExtractToDirectory(zipLoc + @"\WarConfirmed.zip", path, true);
funktionieren... Aber bei dir kennt er die Überlagerung ja nicht, richtig?
Ansonsten kannst du wie gesagt mal versuchen, den file zu löschen, falls er schon vorhanden ist.
Das funktioniert leider nicht bei mir mit dem true
Und wie kann ich nach dem Update das programm beenden lassen?
Normalerweise werden Programme automatisch beendet, wenn es keine Anweisung mehr gibt, die sie ausführen können. Ansonsten kannst du natürlich mal versuchen, es mit Application.Quit() oder so zu forcieren.
Ok noch eins warum wird bei mir new version avaible angezeigt wenn es die aktuellste version ist?
Das hier ist nun das ergebnis: https://paste.ofcode.org/8S3v6FMm3NndHZVGMLDZUA
Ich hab keine Ahnung, woher CurVersion und latestVersion kommen... Von daher kann ich dir das auch nicht wirklich beantworten ;)
Im Moment sehe ich auch gar nicht, wo CurVersion überhaupt mit nem Wert belegt wird.
Und wie kann ich die version aus den PlayerSettings noch auslesen?
Ok, das kann ich ja nun nicht riechen :P
Schau mal nach, ob in einer der beiden Versionen ein unsichtbares Sonderzeichen oder ein Leerzeichen oder so auftaucht, sodass die Versionen zwar gleich aussehen, aber de facto unterschiedliche strings sind.
bezüglich PlayerSettings: Hast dus mal mit PlayerSettings.bundleVersion probiert?
Schön währe es wenn es auch keine fehler geben könnte "string CurVersion = PlayerSettings.bundleVersion.ToString();"
Wofür brauchst du das ToString()? Ist bundleVersion nicht eh schon ein string?
Und von welchen Fehlern sprichst du?
ne ich wusste nicht das man es in der start methode machen muss bin gleich wieder on
Hast du Discord oder so? So kannst du mir dann besser helfen. Naja aber weißt du eine Lösung wegen dem Update das es dort immer angezeigt wird?
Ich habe export fehler kannst du mir da nochmal helfen?
Probiers mal mit UnityEngine.Application.Version statt PlayerSettings.bundleVersion
Ich hab ehrlich gesagt keine Ahnung, was bei den Updates schiefgeht. Du kannst mal prüfen, ob er ins "if" oder ins "else" geht (also ob beim Vergleich was schief läuft oder ob der Fehler woanders liegt).
Leider hab ich auch gar nicht mehr übermäßig viel Zeit
Alles gefixt ich muss leider pastebin nehmen und kann leider nicht meine server nehmen
Packe die ZIP in ein neues, leeres Verzeichnis aus. Im ZIP gibt es einen Ordner, der genauso heisst wie eine bereits vorhandene Datei, daher die Fehlermeldung, das er das nicht auspacken kann.
In der ZIP ist nur ein Text Dokument. Im neuen Ordner? Nein schließlich soll er ja später die Spieldateien überschreiben und sonst startet das game ja nicht das neue Update.
Der Soll ja eigentlich keinen Ordner erstellen sondern das Update installieren in dem er die Spieldateien überschreibt