Problem z usunięciem pliku zapisu gry [Unity 3d] [ problem rozwiązany ]


#1

Cześć,
mam problem z usunięciem pliku zapisu gry na windows. Na androidzie oraz linuxie wszystko działa ok ale na windowsie jeden z plików nie chce się usunąć i nie mogę dojść jaki to może być powód.

plik gry zapisywany jest w następujący sposób:

BinaryFormatter format = new BinaryFormatter();
FileStream file = File.Create(Application.persistentDataPath +"/playerbag");
PlayerInventory data = new PlayerInventory();
data.saved_bag = myList;
format.Serialize(file,data);
file.Close();

Próby usunięcia włącznie z usuwaniem całego folderu nie dają rady. Najdziwniejsze jest to, że problem występuje tylko na wisnowsach sprawdzane na Windows 7, Windows 10 oraz Windows 8. Próbowałem również nadpisać plik ale też nic to nie daję.

Usuwałem to za pomocą

  1. Directory.Delete(Application.persistentDataPath, true);
  2. File.Delete(Application.persistentDataPath +"/playerbag");
  3. tutaj próbowałem go nadpisać

BinaryFormatter format = new BinaryFormatter();
FileStream fileBag = File.Create(Application.persistentDataPath +"/playerbag");
PlayerInventory data = new PlayerInventory();
format.Serialize(fileBag,data);

fileBag.Close();

File.Delete(Application.persistentDataPath +"/playerbag");


#2

Jakiś error/exception? Bo nie wierzę, że system zwraca komunikat ‘nie daję rady’.


#3

doszedłem do sedna problemu, funkcja usuwania wiesza się ponieważ windows dodaje w appdata plik “Player.log”(plik konfiguracyjny dotyczący rozdzielczości itd.) który jest cały czas w użyciu (przez projekt) i dlatego nie może go usunąć(playerbag poprostu nie był usuwany ponieważ alfabetycznie jest następny).

Teraz kwestia jak to zrobić aby forech sprawdzał wszystko poza Player.log?
Aktualnie mam takie coś ale i tak się wiesza

    foreach (string file in Directory.GetFiles(Application.persistentDataPath+"/")) 
    { tempString="";

        if(file !=Application.persistentDataPath +"/"+"Player" )

        {

        tempString = file;
        File.Delete(tempString);
            

        }         
    }

#4

Co to znaczy ‘wiesza się’?
Coś jest w konsoli? Daj try+catch i printnij exception.


#5

chyba powinno być
Application.persistentDataPath +"\"+“Player.log


#6

Fakt. I jak już to nie powinno się sklejać ścieżki stringiem tylko użyć Path.Combine.


#7

mikrooptymalizacja - tempString jest niepotrzebny. Co więcej w każdym przejściu pętli niepotrzebnie go “zerujesz”.

A tak w ogóle to wywalanie wszystkiego z katalogu wydaje mi się złym pomysłem. Jeżeli twoim celem jest usunięcie zapisów to funkcja powinna być skonstruowana w taki sposób, aby wywalić tylko te zapisy a nie wszystko z katalogu. W przyszłości mogą się pojawiać inne problemy jak z tym “player.log”

I druga sprawa - to, że w katalogu znajduje się zablokowany plik nie powinno mieć wpływu na usuwanie innego pliku. File.Delete(Application.persistentDataPath +"/playerbag") powinno zwrócić w konsoli jakiś wyjątek. Tak w zasadzie to nie musisz usuwać pliku jeżeli nowy plik jest tworzony przez File.Create().


#8

Problem został rozwiązany, tak jak pisał @W_P, przez swoje niechlujstwo nie wpisałem rozszerzenia pliku. @frozenshade dzięki za poradę.
Przedstawiając całą sytuację w prosty sposób, plik Player.log, tworzony wyłącznie na Windowsach, wywalał cały skrypt. Plik playerbag nie był nawet ruszany ponieważ alfabetycznie był po Player.log i błędnie się skoncentrowałem na nim.
Dzięki wszystkim za pomoc!


#9

wszystkie operacje, które mogą się z jakiegoś powodu nie udać (np ktoś blokuje plik, który chcesz skasować) powinny być obłożone try+catch, dzięki temu masz wszystko pod kontrolą.
Jeśli to plik tymczasowy, roboczy to sugeruję doczytać o Path.GetTempPath i ogólnie o postępowaniu z plikami tymczasowymi.
Jeśli zapisujesz stan gry to najlepiej robić to w katalogu z danymi dla danego usera, najlepiej wg wzoru:
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Nazwa_studia", "Nazwa_gry");


#10

Dzięki, jeżeli chodzi o programowanie w unity jestem jeszcze zielony. Nie chciałbym wyuczać się złych nawyków. Spróbuję zaadoptować sposób, który opisujesz.