我可以把一个流对象转换成文件信息对象吗?

14
对于ExcelPackage构造函数,您需要一个FileInfo对象。我更喜欢使用某种流对象(例如MemoryStream),因为我不需要将文件保存到服务器本身,而是将其公开为FileStream以供用户使用。我不想创建只用于生成目的且永远不会再次使用的服务器上必须稍后删除的文件。除此之外,否则我还需要应用程序/用户在服务器上目录/文件的必要权限。
那么我的问题是:如何将流对象转换为FileInfo对象。
7个回答

10
您无法将Stream直接转换为FileInfo,它们代表完全不同的事物。Stream包含可能表示磁盘上文件或非文件的数据。另一方面,FileInfo包含有关文件的元数据,该文件可能存在也可能不存在。
您可以将Stream的内容写入磁盘上的文件中,创建指向该文件的FileInfo并将其传递给构造函数。

6
他明确表示他不想做那件事。 - SLaks
@SLaks:我知道。我告诉他为什么他的愿望不太可能实现。不过,你在代码中添加构造函数的建议很好。 - Fredrik Mörk
我一直在尝试避免改变源代码,但这可能变得不可避免。 - Michael
1
@Michael:是的,它似乎站在这两者之间;修复代码或保存文件。任何一种都可以挽救局面。 - Fredrik Mörk

3

是的,你可以。

var excelPackage = new ExcelPackage();
excelPackage.Load(fileStream);

2
将以下构造函数添加到ExcelPackage中,可以使用流(Streams)进行操作。
public ExcelPackage( Stream stream ) {
    _package = Package.Open( stream, FileMode.Create, FileAccess.ReadWrite );

    Uri uriDefaultContentType = new Uri( "/default.xml", UriKind.Relative );
    PackagePart partTemp = _package.CreatePart( uriDefaultContentType, "application/xml" );

    XmlDocument workbook = Workbook.WorkbookXml; 

    _package.CreateRelationship( Workbook.WorkbookUri, TargetMode.Internal, schemaRelationships + "/officeDocument" );

    _package.DeletePart( uriDefaultContentType );
}

我应该在哪里以及如何修改源代码像您所做的那样? - user3207158

2

FileInfo类是一个简单的包装器,用于封装磁盘上文件的路径。
无法使用FileInfo来包装内存流。

但是,您可以下载源代码并添加一个接受Stream的构造函数。(文件路径仅在WriteDebugFile方法中使用)


0
你不能这样做,你应该将内存流输出到文件,并获取新创建文件的FileInfo对象,然后将其传递给ExcelPackage。

0

查看 ExcelPackage 的源代码,它在构造函数中使用 FileInfo 对象的 FullName 属性上的 Package.Open 方法,以 FileMode.OpenFileAccess.ReadWrite 初始化一个 Package 对象。

Package.Open 方法也可以直接接受一个 Stream

如果您想要,您可以自己重载 ExcelPackage 构造函数来接受一个 Stream 参数,并简单地调用该 Stream 对象上的 Package.Open--这个 Stream 对象可以很容易地是一个 MemoryStream,例如。


-3
正如 Fredrik Mörk 所提到的那样,由于两种类型之间没有默认转换可用,因此这是不可能的,并且也不建议这样做。
只作为参考,您可以通过实现 IConvertible 接口来提供自己的 Conversion 逻辑。虽然在此情况下并不正确,但在其他地方可能会有所帮助。
class CustomStream : Stream, IConvertible
    {
        public FileInfo ConvertToFileInfo()
        {
            return new FileInfo("");
        }
    }

这是如何转换它的方法

 CustomStream stream = new CustomStream();
 FileInfo fileInfo = stream.ConvertToFileInfo();

但这有什么用呢...您也可以创建一个空的FileInfo并将其提供给函数,而不是进行扩展。可能ExcelPackage使用FileInfo来获取值。伪造可能会产生不可预测的结果。 - RvdK
2
这样做不行。ExcelPackage会尝试从FileInfo中的路径读取文件。 - SLaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接