2011-07-20 24 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

相关问题