2025-11-08
LiteDB
00

目录

准备工作
二进制数据存储模型
定义数据模型
二进制数据存储实现
存储文件
4.2 检索文件
高级功能
文件大小限制
文件压缩
使用示例
写文件信息
读取文件信息
注意事项
结论

在现代应用程序开发中,高效地存储和管理二进制数据是一个常见的需求。LiteDB 作为一个轻量级的嵌入式 NoSQL 数据库,提供了简单而强大的二进制数据存储方案。本文将深入探讨如何使用 LiteDB 在 C# 中存储、检索和管理二进制数据。

准备工作

首先,确保安装 LiteDB NuGet 包:

Bash
Install-Package LiteDB

二进制数据存储模型

定义数据模型

C#
public class FileDocument { // 文档唯一标识 public ObjectId Id { get; set; } // 文件名 public string FileName { get; set; } // 文件类型 public string FileType { get; set; } // 二进制数据 public byte[] FileContent { get; set; } // 文件大小(字节) public long FileSize { get; set; } // 上传时间 public DateTime UploadDate { get; set; } }

二进制数据存储实现

存储文件

C#
public class BinaryStorageService { private readonly LiteDatabase _database; private readonly ILiteCollection<FileDocument> _fileCollection; public BinaryStorageService(string databasePath) { // 创建数据库连接 _database = new LiteDatabase(databasePath); _fileCollection = _database.GetCollection<FileDocument>("files"); } /// <summary> /// 存储文件到 LiteDB /// </summary> /// <param name="filePath">本地文件路径</param> /// <returns>存储的文件文档</returns> public FileDocument StoreFile(string filePath) { // 读取文件为二进制数据 byte[] fileBytes = File.ReadAllBytes(filePath); // 创建文件文档 var fileDocument = new FileDocument { FileName = Path.GetFileName(filePath), FileType = Path.GetExtension(filePath), FileContent = fileBytes, FileSize = new FileInfo(filePath).Length, UploadDate = DateTime.Now }; // 插入数据库 _fileCollection.Insert(fileDocument); return fileDocument; } }

4.2 检索文件

C#
public class BinaryRetrievalService { private readonly LiteDatabase _database; private readonly ILiteCollection<FileDocument> _fileCollection; public BinaryRetrievalService(string databasePath) { _database = new LiteDatabase(databasePath); _fileCollection = _database.GetCollection<FileDocument>("files"); } /// <summary> /// 根据文件名检索文件 /// </summary> /// <param name="fileName">文件名</param> /// <returns>文件文档</returns> public FileDocument RetrieveFileByName(string fileName) { return _fileCollection.FindOne(f => f.FileName == fileName); } /// <summary> /// 将文件保存到本地 /// </summary> /// <param name="fileDocument">文件文档</param> /// <param name="outputPath">输出路径</param> public void SaveFileToDisk(FileDocument fileDocument, string outputPath) { if (fileDocument == null) { throw new ArgumentNullException(nameof(fileDocument)); } File.WriteAllBytes(outputPath, fileDocument.FileContent); } }

高级功能

文件大小限制

C#
public void EnforceFileSizeLimit(long maxSizeInBytes) { // 检查文件大小 var largeFiles = _fileCollection.Find(f => f.FileSize > maxSizeInBytes); foreach (var file in largeFiles) { // 可以选择删除或标记 _fileCollection.Delete(file.Id); } }

文件压缩

C#
public byte[] CompressFile(byte[] fileBytes) { using (var compressedStream = new MemoryStream()) { using (var gzipStream = new GZipStream(compressedStream, CompressionMode.Compress)) { gzipStream.Write(fileBytes, 0, fileBytes.Length); } return compressedStream.ToArray(); } }

使用示例

写文件信息

C#
namespace App08 { internal class Program { static void Main(string[] args) { string dbPath = "myfiles.db"; // 检索文件 var retrievalService = new BinaryRetrievalService(dbPath); var retrievedFile = retrievalService.RetrieveFileByName("C#区块链编程.pdf"); Console.ReadKey(); } } }

读取文件信息

C#
namespace App08 { internal class Program { static void Main(string[] args) { string dbPath = "myfiles.db"; // 检索文件 var retrievalService = new BinaryRetrievalService(dbPath); var retrievedFile = retrievalService.RetrieveFileByName("C#区块链编程.pdf"); if(retrievedFile!= null) { Console.WriteLine("File found: " + retrievedFile.FileName); Console.WriteLine("File size: " + retrievedFile.FileSize); //将文件保存到本地 File.WriteAllBytes(retrievedFile.FileName, retrievedFile.FileContent); } Console.ReadKey(); } } }

image.png

注意事项

  1. LiteDB 适合存储小到中等大小的文件(推荐 < 16MB)
  2. 对于大文件,考虑使用文件系统存储路径
  3. 定期备份数据库
  4. 注意内存消耗

结论

LiteDB 提供了一种简单、高效的方式在 C# 应用程序中存储和管理二进制数据。通过合理设计,可以轻松实现文件的存储、检索和管理。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!