我的winform应用程序使用xml文件来存储数据,我应该在哪里存储它们以便Vista用户可以写入它们?

时间:2009-02-25 22:28:15

标签: windows xml winforms

我的winform应用程序使用xml文件来存储数据,我应该在哪里存储它们以便Vista用户可以写入它们?

由于

6 个答案:

答案 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 SHGetFolderPathSHGetFolderPath使用的枚举为您提供了其他几个特殊文件夹(包括公共文档)的众所周知的位置。您可以直接使用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)

为什么不在应用程序目录中(与安装该应用程序的目录相同)?