2014-04-25 227 views
1

我正在使用JSON从网上下载文件。我现在想将文件保存到设备(我已经完成),但是每次运行应用程序时,我都会再次保存文件。尽管它已经存在。覆盖现有文件

如何修改我下面的代码,以便它不会使文件的一个新副本如果在使用相同的名称保存位置已经发现了什么?

IEnumerator Start() 
{ 
    WWW urlToLoad = new WWW(url); 
    yield return urlToLoad; 
    Debug.Log(urlToLoad.text); 

    jsonContents = urlToLoad.text; 
    var n = JSON.Parse(jsonContents); 
    jsonURL = n["data"][0]; 
    Debug.Log(jsonURL.ToString()); 


    string[] splitJSONURL = jsonURL.Split('/'); 
    string bundle = splitJSONURL[splitJSONURL.Length - 1]; 
    SaveBytesAsFile(Application.persistentDataPath + "/" + bundle, urlToLoad.bytes); 

} 

void SaveBytesAsFile(string filePath, byte[] array) 
{ 
    print("Saving to: " + filePath + " :: " + array.Length); 

    File.WriteAllBytes(filePath, array); 
} 
+1

检查文件是否存在,如果是这样,新的文件名 –

+0

你问如何使文件覆盖现有的保存呢?这段代码应该已经这样做了,除非'bundle'每次都不一样。如果你问如何让它不被覆盖,那么看看已经给出的答案。 – Bobson

回答

2

检查文件是否存在。如果没有,请创建它:

if (!File.Exists(filePath)) 
{ 
    File.WriteAllBytes(filePath, array); 
} 
else 
{ 
    // do some magic, create an other file name or give an error 
} 
+0

这不是原子操作,所以如果您使用的是网络共享,如果共享联机并且许多节点正在调用此代码,则可能会失败。换句话说,不要在网络农场中这样做。我建议使用流媒体对象,它可以让你选择创建/覆盖。 – Brain2000

1

我倾向于检查文件是否存在,如果是这样我的日期附加到文件名,你可以轻松地跳过写入文件,以及:

// With a new filename: 
if (File.Exists(filePath)) 
{ 
    File.WriteAllBytes(filepath + "-" + DateTime.Now.ToString("yyyy-MM-dd-hhmm") + ".txt", array); 
} 

// To skip writing the file all together, follow @PatrickHofman's answer. 

理想情况下,如果要保存所有文件,则您的文件命名模式应包含此可能性。

您可能也想,如果它需要你保留所有的数据,如数据库寻找到一个存档过程。这样,当你覆盖文件时你什么都不会丢失,并且如果需要的话可以很容易地替换数据。