在现代应用程序开发中,高效地存储和管理二进制数据是一个常见的需求。LiteDB 作为一个轻量级的嵌入式 NoSQL 数据库,提供了简单而强大的二进制数据存储方案。本文将深入探讨如何使用 LiteDB 在 C# 中存储、检索和管理二进制数据。
准备工作
首先,确保安装 LiteDB NuGet 包:
Install-Package LiteDB
复制
二进制数据存储模型
定义数据模型
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; }
}复制
二进制数据存储实现
存储文件
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 检索文件
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);
}
}复制
高级功能
文件大小限制
public void EnforceFileSizeLimit(long maxSizeInBytes)
{
// 检查文件大小
var largeFiles = _fileCollection.Find(f => f.FileSize > maxSizeInBytes);
foreach (var file in largeFiles)
{
// 可以选择删除或标记
_fileCollection.Delete(file.Id);
}
}复制
文件压缩
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();
}
}复制
使用示例
写文件信息
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();
}
}
}复制
读取文件信息
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();
}
}
}复制

注意事项
LiteDB 适合存储小到中等大小的文件(推荐 < 16MB)
对于大文件,考虑使用文件系统存储路径
定期备份数据库
注意内存消耗
结论
LiteDB 提供了一种简单、高效的方式在 C# 应用程序中存储和管理二进制数据。通过合理设计,可以轻松实现文件的存储、检索和管理。
如果你正在从事上位机、自动化、机器视觉、物联网(IOT)项目或数字化转型方面的工作,欢迎加入我的微信圈子!在这里,我们不仅可以轻松畅聊最新技术动态和行业趋势,还能够在技术问题上互相帮助和支持。我会尽量利用我的知识和经验来帮助你解决问题,当然也期待从大家的专业见解中学习和成长。无论你是新手还是老鸟,期待与志同道合的朋友交流心得,一起进步!
文章转载自技术老小子,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
2025年4月中国数据库流行度排行榜:OB高分复登顶,崖山稳驭撼十强
墨天轮编辑部
2082次阅读
2025-04-09 15:33:27
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
1809次阅读
2025-04-25 18:53:11
【DBA坦白局】第一期:在小城市和一线城市做DBA,是“躺”还是“卷”?
墨天轮编辑部
1386次阅读
2025-04-10 14:17:22
Oracle Concepts(Oracle 19c):07 SQL
Ryan Bai
1025次阅读
2025-04-09 10:57:11
数据库国产化替代深化:DBA的机遇与挑战
代晓磊
957次阅读
2025-04-27 16:53:22
2025年3月国产数据库大事记
墨天轮编辑部
920次阅读
2025-04-03 15:21:16
2025 DBA 薪资观察:做 DBA 还香吗?
墨天轮编辑部
856次阅读
2025-04-24 15:53:21
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
659次阅读
2025-04-25 15:30:58
外国CTO也感兴趣的开源数据库项目——openHalo
小满未满、
641次阅读
2025-04-21 16:58:09
2025年3月国产数据库中标情况一览:TDSQL大单622万、GaussDB大单581万……
通讯员
629次阅读
2025-04-10 15:35:48