File.WriteAllBytes正在创建一个0字节的文件

时间:2017-02-25 08:59:03

标签: c# file unity3d byte

我目前正在制作益智游戏,并尝试制作自动更新程序。因此,用户无需手动下载最新版本即可更新游戏。版本检查本身正在运行,但是当我尝试使用WWW(url)下载文件时,下载需要相当长的时间,但是一旦我在文件浏览器中检查它就创建了一个0字节的文件。在OSX中,它实际上会立即被删除。

这是我正在使用的代码。

void UpdateGame(){
    string path = Application.dataPath;
    if (Application.platform == RuntimePlatform.OSXPlayer) {
        path += "/../../";
    }
    else if (Application.platform == RuntimePlatform.WindowsPlayer) {
        path += "/../";
    }

    if (System.IO.File.Exists (path+"/Apo_Alpha.app")) {
        Debug.Log ("File exists!");
        System.IO.File.Delete (path+"/Apo_Alpha.app");

    }


        WWW www = new WWW ("https://www.dropbox.com/sh/aayo9iud7t98hgb/AACDqSST_-rT2jIfxq1Zc2SXa?dl=1");

    while (!www.isDone) {
        Debug.Log ("Waiting for download");
    }

        string fullPath = path+"/Apo_Alpha.app";
        System.IO.File.WriteAllBytes (fullPath, www.bytes);

    Debug.Log ("Done downloading...");
    Debug.Log ("File downloaded at " + fullPath);

}

为什么会这样?是因为我可能要等待写入这些字节吗?我很乐意在这里得到某种形式的帮助。我确定这只是一个小错误,但我无法在任何地方找到答案。 (网址是正确的,我仔细检查过它们......)

1 个答案:

答案 0 :(得分:0)

  

当我尝试使用WWW(url)下载文件时,它需要相当多   一段时间下载

那是因为你阻止了主线程。这应该在协程中完成。

UploadedFile

然后使用IEnumerator downLoadFromServer() { WWW www = new WWW("yourUrl"); yield return www; Debug.Log("Done downloading"); byte[] yourBytes = www.bytes; System.IO.File.WriteAllBytes(fullPath, yourBytes); }

调用/启动协同程序

现在,如果你想使用StartCoroutine(downLoadFromServer());,你必须在coroutine函数中产生,或者Unity主线程将冻结,直到文件被下载。

以下是应如何使用www.isDone的示例:

www.isDone

最后,不要手动创建路径。不要做这样的事情:

IEnumerator downLoadFromServer() { string url = "https://www.dropbox.com/sh/aayo9iud7t98hgb/AACDqSST_-rT2jIfxq1Zc2SXa?dl=1"; WWW www = new WWW(url); while (!www.isDone) { //Must yield below/wait for a frame yield return null; } Debug.Log("Done downloading"); byte[] yourBytes = www.bytes; //Now Save it System.IO.File.WriteAllBytes(fullPath, yourBytes); }

使用path += "/../";执行此操作:

Path.Combine