net core流相关

 

 

Stream.Read与StreamReader.Read都可以读取流中的信息

        /// <summary>
        /// 将流中的内容以字节码的形式读出来
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        public static byte[] StreamToBytes(Stream stream)
        {
            byte[] bytes = new byte[stream.Length];
            stream.Read(bytes, 0, bytes.Length);
            stream.Seek(0, SeekOrigin.Begin);
            return bytes;
        }

 

 常见的Reader和Writter类型

  • BinaryReader和 BinaryWriter :用于将基元数据类型作为二进制值进行读取和写入。
  • StreamReader 和 StreamWriter : 用于通过使用编码值在字符和字节之间来回转换来读取和写入字符。
  • StringReader 和 StringWriter:用于从字符串读取字符以及将字符写入字符串中。
  • TextReader和 TextWriter :用作其他读取器和编写器(读取和写入字符和字符串,而不是二进制数据)的抽象基类。
        public static string ReadString(Stream stream)
        {
            StreamReader reader = new StreamReader(stream, Encoding.Default);
            var ret = reader.ReadLine();
            return ret;
        }

 

 

压缩ZIP

将内存中的文件压缩成ZIP并返回字节码

        /// <summary>
        /// 将指定的文件列表按路径打包成zip文件
        /// </summary>
        /// <param name="files"></param>
        /// <returns></returns>
        public static byte[] GetZipArchive(List<InMemoryFile> files)
        {
            byte[] archiveFile;
            //将带有路径的文件获取出来并先创建好对应路径的文件夹
            //List<InMemoryFile> folders = files.Where(u => !string.IsNullOrWhiteSpace(u.Path)).GroupBy(i => i.Path).FirstOrDefault().ToList();


            //再将文件放在到相应的文件夹中
            using (var archiveStream = new MemoryStream())
            {
                using (var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))
                {
                    foreach (var file in files)
                    {
                        var zipArchiveEntry = archive.CreateEntry($"{file.Path}{file.FileName}", CompressionLevel.Fastest);
                        using (var zipStream = zipArchiveEntry.Open())
                            zipStream.Write(file.Content, 0, file.Content.Length);
                    }
                }

                archiveFile = archiveStream.ToArray();
            }

            return archiveFile;
        }
    /// <summary>
    /// 存放于内存中的文件
    /// </summary>
    public class InMemoryFile
    {
        /// <summary>
        /// 文件名,包含后缀,但不包含压缩后的文件夹路径
        /// </summary>
        public string FileName { get; set; }
        /// <summary>
        /// 文件内容
        /// </summary>
        public byte[] Content { get; set; }
        /// <summary>
        /// 在压缩文件中的存放路径,如WebResource/
        /// </summary>
        public string Path { get; set; }
    }

 

 

 

 

从FormFIle中的ZIP里读取某个文件

        public static byte[] GetFileFromZipArchive(IFormFile zipFile, string fullFileName)
        {
            var zipFilePath = zipFile.ContentType;
            var stream = zipFile.OpenReadStream();
            using (ZipArchive archive =new ZipArchive(stream, ZipArchiveMode.Read))
            {
                var file = archive.Entries.FirstOrDefault(u => u.FullName == fullFileName);
                if (file != null)
                {
                    using var memoryStream = new MemoryStream();
                    file.Open().CopyTo(memoryStream);
                    var content = memoryStream.ToArray();
                    return content;
                }
            }
            return null;
        }

 

posted @ 2023-11-02 10:00  随乄风  阅读(22)  评论(0编辑  收藏  举报