2010-05-15 74 views
4

我正在設計一個應用程序,它可以讓你找到某些程序製作的圖片(屏幕截圖)。我將在應用程序本身中提供一些程序的位置以使用戶啓動。windows應用程序的設計問題,最佳方法?

我在想,隨着時間的推移,我應該如何去添加新的位置,我的第一個想法就是將它編碼到應用程序中,但這意味着用戶必須重新安裝它才能使更改生效。

我的第二個想法是使用XML文件來包含所有位置以及其他數據,如應用程序的名稱。這也意味着用戶可以添加自己的位置,如果他們願意並通過互聯網共享。

第二個選項似乎是最好的方法,但後來我不得不考慮如何在用戶計算機上進行管理。理想情況下,我只需要一個.exe而不依賴於任何外部文件,如XML,但這會讓我回到第一點。

難道是最好簡單地使用ClickOnce部署創建在開始菜單中的條目,並創建包含.exe和文件名的文件夾?

感謝您的反饋意見,我不想在設計完成之前開始實施應用程序。

回答

3

通常我不會將任何東西硬編碼到應用程序中。正如你正確指出的那樣,這會使設計變得不靈活。

我通常這種類型的配置信息存儲在文件夾Local Application Data下的XML文件。

如果用戶總是(或經常)互聯網連接,你可以考慮的替代方案(或附加)來存儲這樣的Web服務上的「書籤」信息的能力。

編輯:

這裏有一個代碼片段我已經使用多年了這樣的事情

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 
using System.Xml.Serialization; 

namespace JTools.IO.Configuration 
{ 
    public static class ConfigManager<T> where T : new() 
    { 
     private const string FILENAME = "Config.xml"; 

     public static T Load() 
     { 
      return Load(ConfigFile); 
     } 

     public static T Load(string fileName) 
     { 
      T ret = default(T); 

      try 
      { 
       // Open file to read the data from 

       using (FileStream fs = new FileStream(fileName, FileMode.Open)) 
       { 

        // Create an XmlSerializer object to perform the deserialization 
        XmlSerializer xs = new XmlSerializer(typeof(T)); 

        // Use the XmlSerializer object to deserialize the data from the file 
        ret = (T)xs.Deserialize(fs); 
       } 
      } 
      catch (System.IO.DirectoryNotFoundException) 
      { 
       throw new Exception("Could not find the data directory '" + fileName + "'"); 
      } 
      catch (System.IO.FileNotFoundException) 
      { 
       ret = new T(); 
      } 

      return ret; 
     } 

     public static void Save(T config) 
     { 
      Save(config, ConfigFile); 
     } 

     public static void Save(T config, string fileName) 
     { 
      // Create file to save the data to 

      using (FileStream fs = new FileStream(fileName, FileMode.Create)) 
      { 

       // Create an XmlSerializer object to perform the serialization 
       XmlSerializer xs = new XmlSerializer(typeof(T)); 

       // Use the XmlSerializer object to serialize the data to the file 
       xs.Serialize(fs, config); 
      } 
     } 

     static private string configFile = null; 
     static public string ConfigFile 
     { 
      get 
      { 
       if (configFile == null) 
       { 
        string appName = typeof(T).FullName; 

        string baseFolder = System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); 
        string jFolder = Path.Combine(baseFolder, "JToolsConfig"); 
        string dataPath = Path.Combine(jFolder, appName); 

        if (!Directory.Exists(dataPath)) 
        { 
         Directory.CreateDirectory(dataPath); 
        } 

        configFile = Path.Combine(dataPath, FILENAME); 
       } 

       return configFile; 
      } 
     } 

    } 
} 
+0

本地應用程序數據似乎是一個好主意,但我似乎無法找到關於如何正確實現它的很多文檔,除非我使用的是一個糟糕的谷歌搜索。 – 2010-05-15 19:45:47

+0

@Jamie:看看接受的答案http://stackoverflow.com/questions/1992905/c-error-creating-directory-in-specialfolder-localapplicationdata-on-windows-7-as你得到一個使用該方法的路徑在那裏概述,然後將文件寫入該路徑。正如Oded指出的那樣,您可以使用XmlSerializer(例如)來保存和加載數據。我會在我的答案中發佈一個代碼示例。 – 2010-05-16 01:34:37

+0

感謝您的其他問題的代碼段和鏈接,我會確保在其他答案中使用特殊文件夾方法。 – 2010-05-16 16:20:19

2

我會採取的方法是有一個Locations類(集合),我可以序列化成XML文件(使用XmlSerializerDataContractSerializer)。

您可以檢查XML文件是否存在 - 如果它存在,它反序列化到您的收藏,如果沒有,你可以創建你的硬編碼默認一個新的集合。

+0

我認爲這將是與Shawn提出的解決方案相結合的最佳解決方案,通過允許用戶指定XML文件的位置,它們可能更容易使用,而不是強制它們在特定位置使用。 – 2010-05-15 19:45:12

1

我建議你在組織用戶可讀的方式你的所有數據,並問他想要(使用一個或多個XML文件),它存儲在他的計算機上的用戶。通過這種方式,用戶可以將XML文件存儲在任何他喜歡的位置,並瞭解他們的工作內容。他可以使用它們與他人共享他的「圖書館」,他可以手動對這些XML文件進行更改,他甚至可以製作自己的程序,該程序使用相同的文件(某種附加到自己的程序中)。

+0

好主意,允許用戶選擇目的地意味着他們沒有太多限制。 – 2010-05-15 19:46:15