2011-07-20 27 views
16

我一直在使用ApplicationDeployment.CurrentDeployment.DataDirectory來存儲客戶端在運行時下載的內容,預計每次啓動應用程序時都會出現內容,但是現在如果應用程序更新,我發現這些更改看似隨機。我可以在哪裏安全地存儲ClickOnce部署的數據文件?

什麼是在點擊一次部署中爲應用程序存儲用戶數據的最可靠方法?

目前我一直在使用下面的方法

private const string LocalPath = "data"; 

public string GetStoragePath() { 
    string dir; 
    if (ApplicationDeployment.IsNetworkDeployed) { 
     ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; 
     dir = Path.Combine(ad.DataDirectory, LocalPath); 
    } else { 
     dir = LocalPath; 
    } 
    return CreateDirectory(dir); 
} 

我本來跟着標題下的ClickOnce Data Directory文章Accessing Local and Remote Data in ClickOnce Applications其中指出,這是推薦路徑。

注意CreateDirectory(string)只是創建一個目錄,如果它不存在。

我發現我的問題的根本原因是我創建了許多文件和一個索引文件,這個索引文件包含絕對路徑,一次性移動升級內容(或副本),所以絕對路徑不復存在。我將調查獨立存儲,如Damokles所建議的,看看它是否對點擊一次部署具有相同的副作用。

+1

如果你走了孤立的存儲路線,一定要看問題... http:// stackoverflow。com/questions/202013 – codeConcussion

+0

謝謝whatknott,我會牢記這一點。 –

回答

20

另一種選擇是讓在用戶的AppData文件夾中的應用程序的目錄,並將其存儲在那裏。你可以得到一個路徑與此:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

你會發現有很多的應用程序使用(和它的等值當地貨幣)。它也不會在ClickOnce版本之間移動。

+0

我選擇了這種方法,因爲它是一種侵入性較小的變化。使用漫遊隔離存儲可能是最好的方法,但是這需要對我的應用程序進行大量更改,這是一個單行更改。我非常感謝你爲這個Tridus。 –

+0

這是一個問題給你,夥計們。當您卸載ClickOnce應用程序時,這些文件會發生什麼? –

+0

@AlexSorokoletov沒什麼。他們不是應用程序的一部分,所以他們堅持。 – Tridus

5

退房IsolatedStorage這應該有所幫助。 它甚至適用於部分信任環境。

爲了讓你的數據,你需要使用從this post

+0

謝謝Damokles,我會研究它。我發現ClickOnce實際上覆制了我的數據,但是我存儲了絕對路徑,當然舊的文件不再存在,孤立的存儲是否有相同的問題,或者是否會點擊一次,讓我獨自一人呢? –

+0

@Brett:是的,如果您正確使用它,IsolatedStorage將解決該問題。 –

+0

Demokles,非常感謝您回答這個問題,我確實認爲這將是一個很好的方法,並且會爲新的應用程序記住這一點,但是我選擇使用ApplicationData方法,因爲這是一個非常少侵入性的更改。我非常感謝你的回答。 –

4

這取決於你正在保存的數據所採取的application scoped IsolatedStorage

using System.IO; 
using System.IO.IsolatedStorage; 
... 

IsolatedStorageFile appScope = IsolatedStorageFile.GetUserStoreForApplication();  
using(IsolatedStorageFileStream fs = new IsolatedStorageFileStream("data.dat", FileMode.OpenOrCreate, appScope)) 
{ 
... 

代碼。

您當前正在保存到數據目錄中,這很好。你需要注意的是每個版本的應用程序都有自己的數據目錄。更新時,ClickOnce在啓動應用程序時將先前版本的所有數據複製到新版本。這給你一個掛鉤,將任何數據從一個版本遷移到下一個版本。這對於Sql Lite或SQL CE等內存數據庫非常有用。

我想說的一件事是,如果將數據存儲在數據目錄中時有大量數據(4 gig),則這些數據將從舊版本複製到新版本。這會降低升級後的啓動時間。如果您有大量數據,或者您不想擔心遷移數據,則可以將數據存儲在用戶本地文件夾中,以提供您的完全信任,或者如果您擁有部分信任,則可以使用獨立存儲。

Isolated Storage

Local User Application Data

+0

Thankyou這個Bronumski,這確實迭代了一些問題I正面臨着,我的數據量相對較小,不超過50MB左右。 –

+3

另外,如果您創建了新文件,它不會向前傳送數據。它只攜帶部署到下一個版本的數據。 – RobinDotNet

+0

@RobinDotNet好點 – Bronumski

相關問題