2010-03-17 209 views
8

对于ExcelPackage构造函数,您需要一个FileInfo对象。我宁愿使用某种流对象(f.i.MemoryStream),因为我不需要将文件保存到服务器本身,而是将它作为FileStream公开给用户。我不想创建文件,我必须从服务器中删除,这些服务器仅用于生成目的并且不再使用。除此之外,否则我还需要在服务器上的目录/文件上为应用程序/用户提供必要的权限。我可以将Stream对象转换为FileInfo对象吗?

所以我的问题是:如何将流对象转换为FileInfo对象。

回答

2

添加下面的构造方法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); 
} 
+0

在哪里以及如何像您一样更改源代码? – user3207158 2016-12-09 23:26:42

2

A FileInfo class是围绕磁盘上文件的路径的简单包装。
不可能有FileInfo包装内存流。

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

7

您不能将Stream同样转换为FileInfo;它们代表完全不同的事物。 A Stream包含的数据可能代表或不代表磁盘上的文件。另一方面,FileInfo包含关于文件的元数据,该文件可能存在也可能不存在。

可以做的是Stream的内容写入到磁盘上的文件,创建一个FileInfo在该文件指向并传递FileInfo给构造什么。

+5

他明确表示,他并不想这样做。 – SLaks 2010-03-17 13:23:36

+0

@SLaks:我知道。我告诉他为什么他的愿望不可能实现。但是,您在代码中添加构造函数的建议是一个很好的建议。 – 2010-03-17 13:24:35

+0

我试图避免必须更改源代码,但那可能无法避免。 – Michael 2010-03-17 13:29:15

0

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

-1

正如Fredrik Mörk所述,这是不可能的,因为它们在两种类型之间没有默认转换,也不推荐。

仅适用于reference,您可以通过实施IConvertible接口来提供自己的Conversion逻辑。在这种情况下再次不正确的做法,但可能会在别的地方有所帮助。

class CustomStream : Stream, IConvertible 
    { 
     public FileInfo ConvertToFileInfo() 
     { 
      return new FileInfo(""); 
     } 
    } 

这是你如何将它转换

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

但最新的用法...您也可以创建一个空的FileInfo并将其提供给该函数,而不是进行扩展。 ExcelPackage可能使用FileInfo来获取值。伪装可以给出不可预知的结果 – RvdK 2010-03-17 13:32:46

+1

这不起作用。 'ExcelPackage'将尝试从'FileInfo'中的路径读取文件。 – SLaks 2010-03-17 13:44:40

0

寻找在用于ExcelPackage的源代码,它使用上传递到构造,与FileMode.OpenFileAccess.ReadWriteFileInfo对象的FullName属性Package.Open方法,以初始化Package对象。

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

如果你愿意,你可以重载自己ExcelPackage构造函数接受Stream参数,只需拨打Package.OpenStream对象 - 这很容易是,例如,一个MemoryStream

0

是的,你可以

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