我可以将Stream对象转换为FileInfo对象吗?
对于ExcelPackage构造函数,您需要一个FileInfo对象。我宁愿使用某种流对象(f.i.MemoryStream),因为我不需要将文件保存到服务器本身,而是将它作为FileStream公开给用户。我不想创建文件,我必须从服务器中删除,这些服务器仅用于生成目的并且不再使用。除此之外,否则我还需要在服务器上的目录/文件上为应用程序/用户提供必要的权限。我可以将Stream对象转换为FileInfo对象吗?
所以我的问题是:如何将流对象转换为FileInfo对象。
添加下面的构造方法ExcelPackage使得可以使用流来代替。
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);
}
A FileInfo
class是围绕磁盘上文件的路径的简单包装。
不可能有FileInfo
包装内存流。
但是,您可以下载源代码并添加一个需要Stream
的构造函数。 (文件路径仅用于WriteDebugFile
方法)
您不能将Stream
同样转换为FileInfo
;它们代表完全不同的事物。 A Stream
包含的数据可能代表或不代表磁盘上的文件。另一方面,FileInfo
包含关于文件的元数据,该文件可能存在也可能不存在。
你可以做的是Stream
的内容写入到磁盘上的文件,创建一个FileInfo
在该文件指向并传递FileInfo
给构造什么。
你不能这样做,你应该做的是输出内存流到文件并获取FileInfo对象为新创建的文件并将其传递给ExcelPackage。
正如Fredrik Mörk
所述,这是不可能的,因为它们在两种类型之间没有默认转换,也不推荐。
仅适用于reference
,您可以通过实施IConvertible
接口来提供自己的Conversion
逻辑。在这种情况下再次不正确的做法,但可能会在别的地方有所帮助。
class CustomStream : Stream, IConvertible
{
public FileInfo ConvertToFileInfo()
{
return new FileInfo("");
}
}
这是你如何将它转换
CustomStream stream = new CustomStream();
FileInfo fileInfo = stream.ConvertToFileInfo();
寻找在用于ExcelPackage
的源代码,它使用上传递到构造,与FileMode.Open
和FileAccess.ReadWrite
的FileInfo
对象的FullName
属性Package.Open
方法,以初始化Package
对象。
Package.Open
方法也可以直接接受Stream
。
如果你愿意,你可以重载自己ExcelPackage
构造函数接受Stream
参数,只需拨打Package.Open
是Stream
对象 - 这很容易是,例如,一个MemoryStream
。
是的,你可以
var excelPackage = new ExcelPackage();
excelPackage.Load(fileStream);
在哪里以及如何像您一样更改源代码? – user3207158 2016-12-09 23:26:42