当前位置:首页 > 行业动态 > 正文

c#本地存储

C#本地存储摘要: C#中, 本地存储涵盖多种方式。如文件I/O操作,可读写文件;数据库存储,像SQLite等便于数据管理;还有缓存技术,能提升数据访问速度。

在C#中,本地存储是一个非常重要的概念,它允许应用程序在本地设备上保存和读取数据,以下是一些常见的C#本地存储方式及其详细描述:

c#本地存储  第1张

一、文件系统存储

1、文本文件

写入:使用System.IO命名空间下的StreamWriter类可以方便地将文本数据写入到文件中。

 using (StreamWriter sw = new StreamWriter("example.txt"))
     {
         sw.WriteLine("Hello, World!");
     }

读取:通过StreamReader类来读取文本文件中的内容,示例如下:

 using (StreamReader sr = new StreamReader("example.txt"))
     {
         string content = sr.ReadToEnd();
         Console.WriteLine(content);
     }

2、二进制文件

写入:当需要存储非文本数据(如图像、音频等)时,可以使用BinaryWriter,将一个整数数组写入二进制文件:

 int[] numbers = { 1, 2, 3, 4, 5 };
     using (BinaryWriter bw = new BinaryWriter(File.Open("numbers.dat", FileMode.Create)))
     {
         foreach (int number in numbers)
         {
             bw.Write(number);
         }
     }

读取:对应的,使用BinaryReader来读取二进制文件中的数据,示例:

 using (BinaryReader br = new BinaryReader(File.Open("numbers.dat", FileMode.Open)))
     {
         List<int> numbers = new List<int>();
         while (br.PeekChar() != -1)
         {
             numbers.Add(br.ReadInt32());
         }
         // 处理读取到的数据
     }

二、数据库存储

1、SQLite

特点:SQLite是一款轻量级的嵌入式数据库,无需单独的服务器进程即可运行,它在移动应用开发和小型项目中非常受欢迎,因为它简单易用且资源占用少。

使用步骤

安装和引用:首先需要在项目中安装SQLite的NuGet包,引入相关的命名空间。

创建连接:使用SQLiteConnection类建立与数据库的连接。

 using (var connection = new SQLiteConnection("Data Source=mydatabase.db;Version=3;"))
       {
           connection.Open();
           // 执行数据库操作
       }

创建表和执行查询:可以通过SQLiteCommand对象来执行SQL语句,创建表、插入数据、查询数据等操作,创建一个名为“Users”的表并插入一条记录:

 using (var connection = new SQLiteConnection("Data Source=mydatabase.db;Version=3;"))
       {
           connection.Open();
           string createTableQuery = "CREATE TABLE IF NOT EXISTS Users (Id INTEGER PRIMARY KEY, Name TEXT)";
           var createTableCommand = new SQLiteCommand(createTableQuery, connection);
           createTableCommand.ExecuteNonQuery();
           string insertQuery = "INSERT INTO Users (Name) VALUES ('John Doe')";
           var insertCommand = new SQLiteCommand(insertQuery, connection);
           insertCommand.ExecuteNonQuery();
       }

2、Entity Framework Core with SQLite

特点:Entity Framework Core是微软推出的一个ORM框架,它可以与多种数据库配合使用,包括SQLite,使用EF Core可以让开发者以面向对象的方式操作数据库,而无需编写大量的SQL代码。

使用步骤

安装和配置:安装Entity Framework Core和SQLite的NuGet包,在项目的appsettings.json文件中配置数据库连接字符串。

 {
         "ConnectionStrings": {
           "DefaultConnection": "Data Source=mydatabase.db;"
         }
       }

定义模型和上下文:创建实体类来表示数据库中的表结构,定义一个“User”实体类:

 public class User
       {
           public int Id { get; set; }
           public string Name { get; set; }
       }

创建一个继承自DbContext的上下文类,用于管理数据库操作。

 public class MyDbContext : DbContext
       {
           public DbSet<User> Users { get; set; }
           protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
           {
               optionsBuilder.UseSqlite("Data Source=mydatabase.db;");
           }
       }

执行操作:通过上下文类来添加、删除、修改和查询数据,添加一条用户记录:

 using (var context = new MyDbContext())
       {
           User newUser = new User { Name = "Jane Doe" };
           context.Users.Add(newUser);
           context.SaveChanges();
       }

三、缓存存储

1、内存缓存

特点:内存缓存是将数据存储在应用程序的内存中,访问速度非常快,但它的缺点是数据在应用程序重启后会丢失,并且占用一定的内存资源,适用于存储临时数据或频繁访问的数据。

使用方式:可以使用字典(Dictionary)来实现简单的内存缓存。

 Dictionary<string, object> cache = new Dictionary<string, object>();
     cache["key"] = "value";
     object value = cache["key"];

高级缓存机制:对于更复杂的缓存需求,可以使用第三方缓存库,如Memcached或Redis的客户端库,这些库提供了更丰富的功能,如数据过期策略、分布式缓存等,使用Memcached的客户端库:

 using Enyim.Caching;
     using Enyim.Caching.Configuration;
     using Enyim.Caching.Memcached;
     // 配置Memcached客户端
     MemcachedClientConfiguration config = new MemcachedClientConfiguration();
     config.Servers.Add(new ServerAddress("localhost", 11211)); // 假设Memcached服务器在本机运行,端口为11211
     MemcachedClient client = new MemcachedClient(config);
     // 存储数据到缓存中
     client.Store(StoreMode.Add, "key", "value");
     // 从缓存中获取数据
     object value = client.Fetch("key");

四、孤立存储(Isolated Storage)

1、特点:孤立存储是一种基于文件系统的存储机制,它将数据存储在一个与应用程序相关联的私有文件夹中,这种存储方式主要用于Windows Store应用和WPF应用等,以保证数据的安全性和隐私性,不同应用程序之间的孤立存储是相互隔离的,无法直接访问其他应用程序的数据。

使用方式:在Windows Store应用中,可以使用Windows.Storage命名空间下的相关类来操作孤立存储,创建一个文本文件并写入内容:

 using Windows.Storage;
     using System.Threading.Tasks;
     async Task WriteToIsolatedStorageAsync()
     {
         StorageFolder localFolder = ApplicationData.Current.LocalFolder;
         StorageFile sampleFile = await localFolder.CreateFileAsync("testfile.txt", CreationCollisionOption.ReplaceExisting);
         await FileIO.WriteTextAsync(sampleFile, "This is a test file.");
     }

读取文件:从孤立存储中读取文件内容的示例如下:

 async Task ReadFromIsolatedStorageAsync()
     {
         StorageFolder localFolder = ApplicationData.Current.LocalFolder;
         StorageFile sampleFile = await localFolder.GetFileAsync("testfile.txt");
         string content = await FileIO.ReadTextAsync(sampleFile);
         Console.WriteLine(content);
     }

五、注册表存储(仅适用于Windows桌面应用)

1、特点:注册表是Windows操作系统中的一个系统数据库,用于存储应用程序的配置信息和状态,虽然不推荐将大量数据存储在注册表中,但对于一些简单的配置信息,如用户偏好设置等,注册表存储是一种可行的选择,不过,注册表的操作相对复杂,且对注册表的错误操作可能会导致系统不稳定。

写入注册表:使用Microsoft.Win32命名空间下的Registry类和RegistryKey类来操作注册表,向注册表中写入一个键值对:

 using Microsoft.Win32;
     RegistryKey key = Registry.CurrentUser.OpenSubKey("Software\MyApplication", true);
     if (key == null)
     {
         key = Registry.CurrentUser.CreateSubKey("Software\MyApplication");
     }
     key.SetValue("SettingName", "SettingValue");

读取注册表:从注册表中读取键值对的示例如下:

 using Microsoft.Win32;
     RegistryKey key = Registry.CurrentUser.OpenSubKey("Software\MyApplication", false);
     if (key != null)
     {
         object value = key.GetValue("SettingName");
         Console.WriteLine(value);
     }

六、云存储(适用于网络应用)

1、特点:云存储是将数据存储在云端服务器上,通过网络进行访问,它具有高可用性、可扩展性和数据备份等优点,常见的云存储服务有Amazon S3、Azure Blob Storage、Google Cloud Storage等,不同的云存储服务提供商提供了不同的SDK和API,方便开发者在应用程序中集成云存储功能,不过,云存储通常需要付费(部分提供商提供免费额度),并且在网络环境较差时可能会影响数据的访问速度。

使用方式:以Amazon S3为例,首先需要在项目中安装AWS SDK for .NET的NuGet包,进行身份验证和授权配置,创建AmazonS3Client对象。

 using Amazon.S3;
     using Amazon.Runtime;
     using Amazon.Auth;
     // 配置AWS凭证
     AmazonS3Config config = new AmazonS3Config { RegionEndpoint = RegionEndpoint.USEast1 }; // 假设使用美国东部(弗吉尼亚北部)区域
     BasicAWSCredentials credentials = new BasicAWSCredentials("your-access-key-id", "your-secret-access-key");
     AmazonS3Client client = new AmazonS3Client(credentials, config);
     // 上传文件到S3存储桶
     PutObjectRequest request = new PutObjectRequest
     {
       BucketName = "mybucket",
       Key = "myfile.txt",
       FilePath = "path/to/local/file.txt"
     };
     PutObjectResponse response = client.PutObject(request);
     // 从S3存储桶下载文件
     GetObjectRequest downloadRequest = new GetObjectRequest
     {
       BucketName = "mybucket",
       Key = "myfile.txt"
     };
     using (GetObjectResponse downloadResponse = client.GetObject(downloadRequest))
     {
       using (Stream responseStream = downloadResponse.ResponseStream)
       using (Stream fileStream = File.Create("path/to/local/downloadedfile.txt"))
       {
         responseStream.CopyTo(fileStream);
       }
     }
     }

七、XML文件存储(适用于配置文件等结构化数据)

1、特点:XML(可扩展标记语言)是一种用于描述数据的语言,它具有良好的结构性和可读性,XML文件可以方便地与其他应用程序或系统进行数据交换,在C#中,可以使用System.Xml命名空间下的相关类来操作XML文件,不过,XML文件的解析和生成相对复杂,对于简单的数据存储需求,可能不太适合,如果数据结构比较简单,可以考虑使用XML文件存储一些配置文件或少量的结构化数据,存储应用程序的配置信息:

 using System;
     using System.Xml;
     using System.Xml.Serialization;
     // 定义配置类
     [Serializable]
     public class AppConfig
     {
       public string Setting1 { get; set; }
       public int Setting2 { get; set; }
     }
     // 序列化配置对象到XML文件
     AppConfig config = new AppConfig { Setting1 = "Value1", Setting2 = 2 };
     XmlSerializer serializer = new XmlSerializer(typeof(AppConfig));
     using (FileStream fs = new FileStream("config.xml", FileMode.Create))
     {
       serializer.Serialize(fs, config);
     }
     // 反序列化XML文件到配置对象
     AppConfig loadedConfig;
     using (FileStream fs = new FileStream("config.xml", FileMode.Open))
     {
       loadedConfig = (AppConfig)serializer.Deserialize(fs);
     }
     Console.WriteLine(loadedConfig.Setting1);

八、JSON文件存储(适用于轻量级的数据交换格式)

1、特点:JSON(JavaScript对象表示法)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于在不同编程语言之间进行数据交换,在C#中,可以使用Newtonsoft.Json(现在更名为Json.NET)库来操作JSON文件,这个库提供了丰富的功能,如序列化和反序列化对象、处理复杂的JSON结构等,JSON文件适用于存储一些不需要复杂结构和类型的数据,如配置文件、简单的数据集合等,相比XML,JSON的语法更简洁,解析速度也更快,存储一个简单的用户信息:

 using Newtonsoft.Json;
     using System.IO;
     // 定义用户类
     public class UserInfo
     {
       public string Name { get; set; }
       public int Age { get; set; }
     }
     // 序列化用户对象到JSON文件
     UserInfo user = new UserInfo { Name = "Alice", Age = 30 };
     string jsonString = JsonConvert.SerializeObject(user);
     File.WriteAllText("userinfo.json", jsonString);
     // 反序列化JSON文件到用户对象
     string readJsonString = File.ReadAllText("userinfo.json");
     UserInfo deserializedUser = JsonConvert.DeserializeObject<UserInfo>(readJsonString);
     Console.WriteLine(deserializedUser.Name);

FAQs:

1、**Q: C#本地存储有哪些方式?** A: C#本地存储方式丰富多样,主要包括文件系统存储(如文本文件、二进制文件)、数据库存储(如SQL Server、SQLite)、缓存存储(如内存缓存、分布式缓存)、孤立存储(适用于Windows Store应用等)、注册表存储(仅适用于Windows桌面应用)、云存储(如Amazon S3等)以及XML和JSON文件存储等,开发者可以根据具体应用场景和需求选择合适的存储方式。

0