繁体   English   中英

从ZipArchiveEntry创建SPListItem而不使用FileStream

[英]Create SPListItem from ZipArchiveEntry without FileStream

我是一个新的.Net开发人员,在文档库中开发上载的Zip文件时遇到问题。

我需要提取上传的Zip文件的内容,以对其中包含的文件进行一些操作。

因此,我选择使用ZipArchive Stream来解决我的问题,我可以轻松地从DocLib中检索我的SPFile并从中创建流。

但是我无法从ZipArchiveEntry创建嵌入式文件,我尝试了以下代码(不是复制/过去,我不在开发机器上)

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时遇到问题,因为它引发了系统I / O错误,据我了解,这可能是由于ZipArchiveEntry.Open()方法返回的流是deflatestream。

我看到可以使用MemoryStream完成文件创建,但是我不明白如何将deflatestream转换为memorystream。

我从另一个地方得到解决方案,但是..

为了从deflatestream获取内存流,您需要使用Stream中的CopyTo()方法。

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);
            }                
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM