我的winform应用程序使用xml文件来存储数据,我应该在哪里存储它们以便Vista用户可以写入它们?
由于
答案 0 :(得分:8)
使用Environment.GetFolderPath
以独立于操作系统的方式获取最合适的文件夹。
特别是,您需要以下SpecialFolder值之一:
ApplicationData
- 如果文件是漫游的,按用户而且仅供应用程序使用,并且不代表用户可能关心的文档。LocalApplicationData
- 如果文件是非漫游的,按用户而且仅供应用程序使用,并且不代表用户可能关心的文档。CommonApplicationData
- 如果文件是漫游的,则对所有用户都是通用的,仅供应用程序使用,并不代表用户可能关心的文档。 注意:在Vista上,这会映射到 C:\ProgramData
,默认情况下对于常规用户来说是只读的(因为更改其中的文件可能会影响行为管理员使用的程序)。您可以显式更改应用程序子文件夹的权限,也可以选择其他选项之一。MyDocuments
- 如果文件是每位用户并代表文档。请注意,没有像{strong> SpecialFolder
这样的CommonDocuments
枚举值代表机器范围的文档存储,即使有一个文件夹打算像一个文件夹一样(C:\Documents and Settings\All Users\Documents ,Vista上有 C:\Users\Public\Documents
。您必须自己查找操作系统版本,如果要写入这些位置,请选择相应的文件夹。
内部Environment.GetFolderPath
使用Win32 API SHGetFolderPath
。 SHGetFolderPath
使用的枚举为您提供了其他几个特殊文件夹(包括公共文档)的众所周知的位置。您可以直接使用SHGetFolderPath
;您可以在PInvoke.net上找到它p/invoke definition和相应的CSIDL enum definition。
您也可以使用IsolatedStorage
。但是,对于每个用户而言,它是不可漫游的,配额有限,用户无法从Windows资源管理器轻松访问。因此,它实际上是等同于SpecialFolder.ApplicationData
的中/低信任。
答案 1 :(得分:4)
Environment.GetFolderPath应该告诉您Windows希望存储内容的位置。
对于特定于用户的数据,
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
通常会返回C:\ Users \%user%\ AppData \ Roaming
对于常见数据,
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
通常返回C:\ ProgramData。
这也将在旧版Windows下做正确的事情; XP通常会返回C:\ Documents and Settings \%user%\ Application Data和C:\ Documents and Settings \ All Users \ Application Data。
答案 2 :(得分:1)
尝试使用.Net Framework中的IsolatedStorage。它会为你做这项工作。
框架可以为您管理这些位置,而不是管理驱动器,文件夹和文件等。它的目的是建立一个您不必担心用户权限的区域。
以下代码序列直接来自MSDN,但显示了您将如何使用这些文件。
using System;
using System.IO;
using System.IO.IsolatedStorage;
public class ReadingAndWritingToFiles{
public static int Main(){
// Get an isolated store for this assembly and put it into an
// IsolatedStoreFile object.
IsolatedStorageFile isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
// This code checks to see if the file already exists.
string[] fileNames = isoStore.GetFileNames("TestStore.txt");
foreach (string file in fileNames){
if(file == "TestStore.txt"){
Console.WriteLine("The file already exists!");
Console.WriteLine("Type \"StoreAdm /REMOVE\" at the command line to delete all Isolated Storage for this user.");
// Exit the program.
return 0;
}
}
writeToFile(isoStore);
Console.WriteLine("The file \"TestStore.txt\" contains:");
// Call the readFromFile and write the returned string to the
//console.
Console.WriteLine(readFromFile(isoStore));
// Exit the program.
return 0;
}// End of main.
// This method writes "Hello Isolated Storage" to the file.
private static void writeToFile(IsolatedStorageFile isoStore){
// Declare a new StreamWriter.
StreamWriter writer = null;
// Assign the writer to the store and the file TestStore.
writer = new StreamWriter(new IsolatedStorageFileStream("TestStore.txt", FileMode.CreateNew,isoStore));
// Have the writer write "Hello Isolated Storage" to the store.
writer.WriteLine("Hello Isolated Storage");
writer.Close();
Console.WriteLine("You have written to the file.");
}// End of writeToFile.
// This method reads the first line in the "TestStore.txt" file.
public static String readFromFile(IsolatedStorageFile isoStore){
// This code opens the TestStore.txt file and reads the string.
StreamReader reader = new StreamReader(new IsolatedStorageFileStream("TestStore.txt", FileMode.Open,isoStore));
// Read a line from the file and add it to sb.
String sb = reader.ReadLine();
// Close the reader.
reader.Close();
// Return the string.
return sb.ToString();
}// End of readFromFile.
}
答案 3 :(得分:0)
您希望您的应用程序数据是特定于用户的吗?然后你应该考虑把它放在C:\Users\%username%\%appname%\...
中。否则,@ Mike_G没有错,建议只是把它放在与你的应用程序相同的目录中。
编辑:除了你的评论之外,C:\Program Files\...
是不可写的,在这种情况下我可能会考虑在所有情况下使其成为用户特定的(具有良好的默认值),除非我有充分的理由希望它在一个地方合并。如果是这种情况,我会将其作为应用程序配置的一部分,让用户确定他们想要(并且可以)保存数据的位置。
答案 4 :(得分:0)
如果数据适用于所有用户,则可以尝试使用“共享文档”区域。在XP上,它位于C:\ Documents and Settings \ All Users \ Documents。我不确定Vista,但它很可能在C:\ Users中。
答案 5 :(得分:-2)
为什么不在应用程序目录中(与安装该应用程序的目录相同)?