2014-04-11 61 views
0

創建SPListItem我是一個新的.NET developper和我現在面臨的一個問題,而深化發展在文檔庫中上載的Zip文件。從ZipArchiveEntry沒有的FileStream

我需要提取上傳到做包含的文件中的某些動作的zip文件的內容。

所以我選用使用ZipArchive流來處理我的問題,我可以從我DocLib找回我的spfile容易從它創建流。

,但我不能夠從ZipArchiveEntry創建嵌入的文件,我想下面的一段代碼(不是複製/過去,我不是我的dev的機器)

foreach(SPFile myFile in mySPFolder.Files) 
{ 
    ZipArchive myZip = new ZipArchive(myFile.OpenBinaryStream()); 

    foreach(ZipArchiveEntry subZip in ZipArchive.Entries) 
    { 
     SPFile newFile = list.RootFolder.Add("myxml.xml",subZip.Open()) 
    } 
} 

我在創建我的newFile時面臨一個問題,因爲它引發了一個System I/O錯誤,根據我的理解,這可能是由於方法ZipArchiveEntry.Open()返回的流是一個deflatestream。

我看到文件的創建可以用一個MemoryStream來完成,但我無法理解如何將deflatestream轉換爲一個MemoryStream。

+0

能否請您講一個好一點?我不知道你在問什麼。 –

+0

我的意思是:如何從ZipArchiveEntry獲取MemoryStream? – Filsdegandalf

回答

1

我從另一個地方的解決方案,但..

爲了得到你需要使用從流CopyTo從()方法deflatestream一個MemoryStream。

public void ExtractLibraryZipFolder(SPWeb web, SPList myList, string FolderPath, SPFile myFile, bool overWrite) 
    { 
     ZipArchive myZip = new ZipArchive(myFile.OpenBinaryStream()); 

     foreach (ZipArchiveEntry subZip in myZip.Entries) 
     { 
      MemoryStream myMemoryStream = new MemoryStream(); 
      subZip.Open().CopyTo(myMemoryStream); 
      if (FolderPath != string.Empty) 
      { 
       SPFolder theFolder = web.GetFolder("/ImportToolLibrary/"); 
       theFolder.SubFolders[FolderPath].Files.Add(subZip.Name, myMemoryStream); 
      } 
      else 
      { 
       SPFile myUpload = myList.RootFolder.Files.Add(subZip.Name, myMemoryStream); 
      }     
     } 
    }