暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

LiteDB 二进制数据存储详细指南

技术老小子 2025-02-16
3

在现代应用程序开发中,高效地存储和管理二进制数据是一个常见的需求。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();
        }
    }
}

复制

注意事项

  1. LiteDB 适合存储小到中等大小的文件(推荐 < 16MB)

  2. 对于大文件,考虑使用文件系统存储路径

  3. 定期备份数据库

  4. 注意内存消耗

结论

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


如果你正在从事上位机、自动化、机器视觉、物联网(IOT)项目或数字化转型方面的工作,欢迎加入我的微信圈子!在这里,我们不仅可以轻松畅聊最新技术动态和行业趋势,还能够在技术问题上互相帮助和支持。我会尽量利用我的知识和经验来帮助你解决问题,当然也期待从大家的专业见解中学习和成长。无论你是新手还是老鸟,期待与志同道合的朋友交流心得,一起进步!

文章转载自技术老小子,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论