不使用FileStream从ZipArchiveEntry创建SPListItem

本文关键字:ZipArchiveEntry 创建 SPListItem FileStream | 更新日期: 2023-09-27 17:57:53

我是新来的。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。

不使用FileStream从ZipArchiveEntry创建SPListItem

我从另一个地方得到了解决方案,但。。

为了从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);
            }                
        }
    }