【问题标题】:C# Store data apart from DatabaseC#将数据与数据库分开存储
【发布时间】:2018-09-05 07:59:02
【问题描述】:

我想存储几个要在我的应用程序中使用的字符串。 但我不想将它存储在我的数据库或配置中。 原因是我希望如果有人将应用程序从一个系统复制到另一个系统,则不应复制字符串。 此外,字符串可以在运行时通过应用程序进行操作。 最好的方法是什么?

【问题讨论】:

  • 你的意思是“字符串不应该被复制”,什么“从一个系统到另一个系统”
  • 您需要将其存储在某处;也许您可以将这些文件保留在用户的个人资料区域中?还是(颤抖)注册表?
  • 如果你把它作为一个文件放在同一个 BIN 文件夹中,你认为这是我的工作吗?
  • @BurimHajrizaj BIN 文件夹中的文件将不起作用,因为它也会在复制应用程序时被复制。
  • @RameshVerma 对不起,我的错,我以为你想要复制这些字符串。将它们存储为环境变量怎么样?

标签: c# json database storage config


【解决方案1】:

存储用户数据的一种简单方法是在用户主目录中创建一个文件。如果数据仅供程序内部使用,可以使用AppData\Local 文件夹(例如"C:\\Users\\myuser\\AppData\\Local":

File.WriteAllText(
    Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
        "MyCompany", "MyProduct", "MyStrings.txt"),
    "Some strings");

这里的字符串存储在"C:\\Users\\myuser\\AppData\\Local\\MyCompany\\MyProduct\\MyStrings.txt"

但是,用户不会轻易看到这些文件。因此,您应该考虑在不再需要此类文件时对其进行清理。

【讨论】:

    【解决方案2】:

    做到这一点的一种方法是使用该机器本地的key 加密您的string,例如MAC address,同时将其保存在机器上。显然要使用它,您必须阅读它,然后使用相同的密钥对其进行解密。

    这样,即使将字符串复制到另一个系统,新系统也无法解密和使用string,因为它没有与原始机器相同的key

    此解决方案与您决定将字符串存储在 bin 或应用数据中还是系统上的其他位置无关。

    【讨论】:

    • 能否提供一个链接或 C# 示例以使用 MAC 地址作为密钥进行加密?
    【解决方案3】:

    简单的解决方案,在用户文档中创建一个文件并将字符串存储在那里。它简单易实现,但不提供任何安全性。如果您要存储敏感信息,那么任何人都可以阅读它。用户也可以删除文件,这将导致文件未找到异常。

    第二个选项是将其写入注册表。这既不难也不简单。注册表将解决文件的安全问题。用户不会意外删除注册表。

    【讨论】:

      【解决方案4】:

      您可以将注册表用于此类操作。

      我有一个 Registry-Helper-Class 来执行这样的操作:

      public class RegistryUtils
      {
          public static string Read(string subKey, string keyName)
          {
              RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(subKey, true);
      
              if (registryKey == null)
              {
                  registryKey = Registry.CurrentUser.CreateSubKey(subKey, true);
              }
      
              var keyValue = registryKey.GetValue(keyName);
              registryKey.Close();
      
              return keyValue.ToString();
          }
          public static void Write(string subKey, string keyName, string keyValue)
          {
              RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(subKey, true);
      
              if (registryKey == null)
              {
                  registryKey = Registry.CurrentUser.CreateSubKey(subKey, true);
              }
      
              registryKey.SetValue(keyName, keyValue);
              registryKey.Close();
          }
      }
      

      然后你可以使用类来存储这样的东西:

      var storedValue = RegistryUtils.Read("MY_COMPANY/MY_PRODUCT","MY_STORED_VALUE");
      
      RegistryUtils.Write("MY_COMPANY/MY_PRODUCT", "MY_STORED_VALUE", storedValue);
      

      您可以使用它来存储任何类型的值,而不仅仅是字符串。但这不应该用于敏感数据,因为用户可以使用注册表编辑器读取和写入注册表的值。

      【讨论】:

        猜你喜欢
        • 2019-03-23
        • 2013-02-20
        • 2015-12-31
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多