Where to input Path.Combine for android

A common problem I’ve seen is PC builds not running properly on android when using binary to save data. I’ve also heard of people using Path.Combine to fix this issue. I’ve been struggling to find exactly where and how to put that line into the code without errors. If anyone could help that would be great. Thanks!

using UnityEngine;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;

public class UpgradeSave
{
    public Upgrade _levels;

    public UpgradeSave()
    {
        _levels = new Upgrade();
        _levels.myUpgrades = new UpgradeData();
        LoadUpgrade();
    }
    public void SaveUpgrade()
    {
        Debug.Log(Application.persistentDataPath);
        FileStream file = new FileStream(Application.persistentDataPath + "/player.dat", FileMode.OpenOrCreate);
        try
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(file, _levels.myUpgrades);
        }
        catch (SerializationException e)
        {
            Debug.LogError("There was an issue serilizing this data: " + e.Message);
        }
        finally
        {
            file.Close();
        }
    }

    public void LoadUpgrade()
    {
        FileStream file = new FileStream(Application.persistentDataPath + "/player.dat", FileMode.Open);
        try
        {
            BinaryFormatter formatter = new BinaryFormatter();
            _levels.myUpgrades = (UpgradeData)formatter.Deserialize(file);
        }
        catch (SerializationException e)
        {
            Debug.LogError("There was an issue serilizing this data: " + e.Message);
        }
        finally
        {
            file.Close();
        }
    }
}

Path.Combine just combines two or more path fragments into one path. You should not use any kind of slashes yourself in your hardcoded path fragments, just the fragment names. All it does is that it ensures that the correct seperation character is used and if a path fragment does already contain a trailing seperation character that it’s not duplicated. Some examples

// will be "MyTestFolder\MySubFolder\MyFile.name" on windows
// and "MyTestFolder/MySubFolder/MyFile.name" on linux / mac / android
string p = Path.Combine("MyTestFolder", "MySubFolder", "MyFile.name");


// will be "MyTestFolder\MySubFolder\MyFile.name" on windows
// probably causes issues on non windows builds
string p = Path.Combine("MyTestFolder\\", "MySubFolder", "MyFile.name");

Since Application.persistentDataPath always returns a valid path depending on the platform, it can be used as the initial fragment in Path.Combine. Thanks to that method you don’t have to care if persistentDataPath actually contains a trailing slash / backslash or not. Just combine it with the next fragment of your desired path. In your case:

string fileName = Path.Combine(Application.persistentDataPath, "player.dat");

Note that the recommended pattern for the usage of filestreams is the using block:

using(FileStream file = new FileStream(fileName, FileMode.Open))
{
    // use the "file" steam here
}
// the stream will be closed here, no matter what happens inside the block.
// Once you leave the block the "file" object will be disposed which will close the file handle.

The using block can only be used with objects which implement the IDisposable interface. For more information see the using statement