【问题标题】:Could I return a FileStream as a generic interface to a file?我可以将 FileStream 作为文件的通用接口返回吗?
【发布时间】:2023-03-20 16:38:01
【问题描述】:

我正在编写一个需要返回对二进制文件的引用的类接口。通常我会提供对文件的引用作为文件路径。但是,我正在考虑将一些文件(例如小缩略图)直接存储在数据库中,而不是存储在文件系统中。在这种情况下,我不想添加额外的步骤,即从数据库中读取缩略图到光盘上,然后返回文件路径供我的程序读取。我想将图像直接从数据库流式传输到我的程序中,并避免将任何内容写入光盘,除非用户明确想要保存某些内容。

让我的界面返回FileStream 甚至Image有意义吗?然后由实现类来确定FileStreamImage 的来源是磁盘上的文件还是数据库中的二进制数据。

public interface MyInterface
{ 
    string Thumbnail {get;}
    string Attachment {get;}
}

public interface MyInterface
{ 
    Image Thumbnail {get;}
    FileStream Attachment {get;}
}

【问题讨论】:

    标签: c# .net file-io interface


    【解决方案1】:

    您可以返回一个Stream 对象,该对象流向文件或数据库

    【讨论】:

      【解决方案2】:

      你可以。但是我会改变界面看起来更像:

      public interface MyInterface
      { 
          Image CreateThumbnail();
          FileStream CreateAttachment();
      }
      

      这解决了关于返回对象生命周期的任何歧义;例如,防止它们从你的脚下被丢弃。

      【讨论】:

        【解决方案3】:

        对于像缩略图一样使用清晰的小内容,我认为您最好返回将使用的类型(即图像)。如果您有大量内容,其目的可能会有所不同,或者它们可能是部分阅读它的原因,那么Stream 就是他们要走的路。在任何一种情况下,内容的来源都是对班级用户隐藏的。您还需要考虑流的 dispose 语义以及您是否希望该类的用户能够控制数据库连接保持打开状态的时间。

        【讨论】:

        • 为什么要在 FileStream 上使用 Stream?
        • 它从调用者那里抽象出内容的来源。如果流可能是不同的源,例如文件或某种数据库 blob,这将特别有用。它也可以是 MemoryStream。假设您最初从某种数据库 blob 流开始,然后决定先读取整个 blob,您可以切换到 MemoryStream 而不会影响调用者。一般来说,除非调用者需要知道它是什么类型的流,否则我总是使用 Stream。 (而且我不记得至少在我的代码中是这样的情况。)
        【解决方案4】:

        如果文件的大小不是很大并且适合内存,您可以使用byte[] 来表示文件。否则 Stream 很好,但请确保您实现 IDisposable 以正确释放它。

        【讨论】:

        • 任何已知文件的最大大小约为 200kb。附件可以是任何东西,但我可以将它们限制为最大大小。
        猜你喜欢
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多