2010-03-17 277 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); 
相關問題