File.Exists无法统一工作

时间:2017-10-01 19:51:42

标签: c# unity3d

我尝试编写脚本,以便在该插槽中找到保存文件后,保存按钮的文本会发生变化。但是,无论我做什么,我的脚本似乎都找不到该文件。这就是我现在所拥有的。

    if (File.Exists ("save1.dat")) {
        //set button text
    } else {
        Debug.Log ("Failure");
    }

我已尝试过多种不同的变体。 我已尝试使用不同的文件,不同的文件扩展名,包括Application.dataPath,使用Resources.Load,但没有任何作用。出于某种原因,这些函数似乎无法在我的Unity项目中找到任何文件,尽管我可以在统一编辑器和我的文件浏览器中清楚地看到它们。这可能是什么原因造成的?有办法绕过这个吗?

1 个答案:

答案 0 :(得分:2)

您要求的文件路径不是有效的文件路径。您需要使用Application.dataPath作为根目录,并确保在附加文件之前以/结束。您可能还必须将\替换为/(查看我自己的代码)。

这是一个大杂烩,但我用它来确定文件IO的应用程序目录:

public static class Configuration {
    public static string currentBaseDirectory = "";
    public static string currentDirectory = "";

    public static void loadCurrentDirectory ()
    {
        currentDirectory = Application.dataPath;
        currentDirectory = currentDirectory.Replace( @"\", "/" );
        bool hasFoundMatch = false;

        if ( !currentDirectory.EndsWith( "/" ) )
            currentDirectory += "/";

        switch (Application.platform) {
            case RuntimePlatform.OSXEditor: //<path to project folder>/Assets
            case RuntimePlatform.WindowsEditor:
                if(currentDirectory.EndsWith("Assets/")) {
                    currentDirectory = currentDirectory.Substring(0, currentDirectory.LastIndexOf( "Assets/" ) );
                    currentDirectory += "RuntimeData/";
                    hasFoundMatch = true;
                }
                break;
            case RuntimePlatform.WindowsPlayer: //<path to executablename_Data folder>
                break;
            case RuntimePlatform.OSXPlayer: //<path to player app bundle>/Contents
                if(currentDirectory.EndsWith(".app/Contents/")) {
                    currentDirectory = currentDirectory.Substring(0, currentDirectory.LastIndexOf( ".app/Contents/" ) );
                    currentDirectory += "RuntimeData/";
                    hasFoundMatch = true;
                }
                break;
            case RuntimePlatform.OSXDashboardPlayer: //<path to the dashboard widget bundle>
            case RuntimePlatform.WindowsWebPlayer: //not supported
            case RuntimePlatform.OSXWebPlayer:
            default:
                hasFoundMatch = false;
                break;
        }


        if (!hasFoundMatch) {
            currentDirectory = Path.GetFullPath("RuntimeData/");
            currentDirectory = currentDirectory.Replace(@"\", "/");
        }

        if (!Directory.Exists( currentDirectory)) {
            for (int i = 0; i < 3; i++)
                currentDirectory = currentDirectory.Substring( 0, currentDirectory.LastIndexOf( "/" ) );
            currentDirectory += "/RuntimeData/";
        }

        currentBaseDirectory = currentDirectory.Replace("/RuntimeData", "");
    }
}

这允许我在Assets旁边有一个RuntimeData目录,我可以把保存文件放在里面。然后这个文件夹在发布后附带可执行文件(尽管你可能需要一个干净的副本,不需要任何开发测试保存;) )。

RuntimeData directory location