我可以将Stream对象转换为FileInfo对象吗?

时间:2010-03-17 13:15:50

标签: c# asp.net-mvc

对于ExcelPackage构造函数,您需要一个FileInfo对象。我宁愿使用某种流对象(f.i.MemoryStream),因为我不需要将文件保存到服务器本身,而是将其作为FileStream公开给用户。我不想制作我必须从服务器中删除的文件,这些服务器仅用于生成目的而从未再次使用过。除此之外,我还需要服务器上目录/文件上的应用程序/用户的必要权限。

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

7 个答案:

答案 0 :(得分:7)

您无法将Stream转换为FileInfo;它们代表完全不同的东西。 Stream包含的数据可能代表也可能不代表磁盘上的文件。另一方面,FileInfo包含有关文件的元数据,可能存在也可能不存在。

可以做的是将Stream的内容写入磁盘上的文件,创建指向该文件的FileInfo并传递FileInfo到构造函数。

答案 1 :(得分:2)

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

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

答案 2 :(得分: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 );
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

查看ExcelPackage的源代码,它使用传递给构造函数的Package.Open对象的FullName属性上的FileInfo方法,FileMode.Open }和FileAccess.ReadWrite,初始化Package对象。

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

如果您愿意,可以自行重载ExcelPackage构造函数以接受Stream参数,只需在Package.Open对象上调用Stream即可例如,MemoryStream

答案 5 :(得分:0)

是的,你可以

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

答案 6 :(得分:-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();