Мое приложение winform использует XML-файлы для хранения данных, где я должен их хранить, чтобы пользователи Vista могли писать в них? - PullRequest
2 голосов
/ 26 февраля 2009

Мое приложение winform использует XML-файлы для хранения данных, где я должен их хранить, чтобы пользователи Vista могли писать в них?

Спасибо

Ответы [ 6 ]

8 голосов
/ 26 февраля 2009

Используйте Environment.GetFolderPath, чтобы получить наиболее подходящую папку независимо от ОС.

В частности, вам необходимо одно из следующих значений SpecialFolder:

  • ApplicationData - если файлы находятся в роуминге, для каждого пользователя и предназначены только для приложения и не представляют документы, которые могут беспокоить пользователя.
  • LocalApplicationData - если файлы не в роуминге, для каждого пользователя и предназначены только для использования в приложении и не представляют документы, которые могут беспокоить пользователя.
  • CommonApplicationData - если файлы находятся в роуминге, являются общими для всех пользователей и предназначены только для использования в приложении и не представляют документы, которые могут интересовать пользователя. ПРИМЕЧАНИЕ: В Vista это соответствует C:\ProgramData, который по умолчанию доступен только для чтения для обычных пользователей (из-за того, что изменение файлов там может повлиять на поведение программ, используемых админы). Вы можете явно изменить разрешения в подпапке приложения или выбрать один из других вариантов.
  • MyDocuments - если файлы для каждого пользователя и представляют документы.

Обратите внимание, что нет никакого перечисляемого значения SpecialFolder, например CommonDocuments, которое представляло бы хранилище документов на уровне компьютера, даже если есть папка, предназначенная для обслуживания этого типа (C:\Documents and Settings\All Users\Documents на XP и C:\Users\Public\Documents на Vista). Вам нужно будет найти версию ОС и выбрать соответствующую папку, если вы хотите записать в эти места.

Внутренне Environment.GetFolderPath использует Win32 API SHGetFolderPath. Перечисление, используемое SHGetFolderPath, дает вам известные местоположения для нескольких других специальных папок (включая Общие документы). Вы можете использовать напрямую SHGetFolderPath; вы можете найти его p / invoke Определение и соответствующее CSIDL определение перечисления на PInvoke.net.

Вы также можете использовать IsolatedStorage. Тем не менее, он не для роуминга, для каждого пользователя, с ограниченной квотой и не легко доступен для пользователя из проводника Windows. Таким образом, это действительно средний / низкий уровень доверия, эквивалентный SpecialFolder.ApplicationData.

4 голосов
/ 26 февраля 2009

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.

1 голос
/ 26 февраля 2009

Попробуйте использовать IsolatedStorage из .Net Framework. Он сделает эту работу за вас.

Framework может управлять этими расположениями вместо вас, вместо управления дисками, папками, файлами и тому подобным. Его цель - создать область, в которой вам не нужно беспокоиться о правах пользователей.

Приведенная ниже кодовая последовательность прямо из 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.
}
0 голосов
/ 26 февраля 2009

Если данные предназначены для всех пользователей, вы можете попробовать использовать область «Общие документы». На XP это находится в C: \ Documents and Settings \ All Users \ Documents. Я не уверен насчет Vista, но скорее всего это вместо C: \ Users.

0 голосов
/ 26 февраля 2009

Хотите ли вы, чтобы данные вашего приложения были специфичны для пользователя? Тогда вам следует подумать о том, чтобы поместить его в C:\Users\%username%\%appname%\... В противном случае @ Mike_G не ошибается, предлагая просто поместить его в тот же каталог, что и ваше приложение.

РЕДАКТИРОВАТЬ: за исключением того, что, как отмечается в вашем комментарии, C:\Program Files\... недоступно для записи, и в этом случае я, вероятно, рассмотрю вопрос о том, чтобы сделать его специфичным для пользователя (с хорошими значениями по умолчанию) во всех случаях, если только у меня не было веской причины хотеть это консолидировано в одном месте. Если бы это было так, я бы включил его в конфигурацию приложения и позволил бы пользователю определять, где он хочет (и может) сохранить данные.

0 голосов
/ 26 февраля 2009

почему бы не в каталоге приложений (тот же, в котором установлено приложение)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...