【问题标题】:how to load a file into memory stream如何将文件加载到内存流中
【发布时间】:2011-09-07 00:36:12
【问题描述】:

我有一个指向文本文件的文件名,包括它的路径,作为一个字符串。现在我想将这个.csv 文件加载到内存流中。我该怎么做?

例如,我有这个:

Dim filename as string="C:\Users\Desktop\abc.csv"

【问题讨论】:

标签: .net vb.net


【解决方案1】:
Dim stream As New MemoryStream(File.ReadAllBytes(filename))

【讨论】:

  • 将文件加载到内存流后,我可以在文件内容中添加标题吗?像 xls 文件中的标题。
【解决方案2】:

您不需要将文件加载到 MemoryStream 中。

您可以简单地调用File.OpenRead 来获取包含该文件的FileStream

如果您确实希望文件在 MemoryStream 中,可以调用 CopyTo 将 FileStream 复制到 MemoryStream 中。

【讨论】:

  • 我可以在文件流中附加文件吗?
  • @Ram:是的,你可以。只需拨打Open 而不是OpenRead。然后,您可以写入和读取相同的流。
  • CopyTo 方法从 .NET 4 开始就存在。看到这个答案stackoverflow.com/a/5730893/1589759
  • 这不应该是答案,这不是操作要求的。
【解决方案3】:

我使用旧的 XmlReader API 从磁盘读取了一个 XML 文件。如何将 XML 文件读入内存,然后在内存中使用,而不是重复读取磁盘?基于 Centro 的 VB 答案(已投票),但带有 Using 块,并且在 C# 中。

关键线:

MemoryStream myXMLDocument = new MemoryStream(File.ReadAllBytes(@"c:\temp\myDemoXMLDocument.xml"));

关于 OP 的问题,如果您想将 CSV 文件加载到 MemoryStream 中:

MemoryStream myCSVDataInMemory = new MemoryStream(File.ReadAllBytes(@"C:\Users\Desktop\abc.csv"));

下面的代码 sn-p 显示了读取 XML 文档的代码,因为它位于 MemoryStream 中。基本上与来自指向磁盘上文件的 FileStream 时的代码相同。是的,XMLTextReader API 既旧又笨重,但这是我在这个应用程序中必须使用的。

    string myXMLFileName = @"c:\temp\myDemoXMLDocument.xml";
    using (MemoryStream myXMLDocument = new MemoryStream(File.ReadAllBytes(myXMLFileName)))
    {
            myXMLTextReader = new XmlTextReader(myXMLDocument);
            myXMLTextReader.WhitespaceHandling = WhitespaceHandling.None;
            myXmlTextReader.Read(); // read the XML declaration node, advance to <Batch> tag
            while (!myXmlTextReader.EOF) 
            {
                if (myXmlTextReader.Name == "xml" && !myXmlTextReader.IsStartElement()) break;
                // advance to <Batch> tag
                while (myXmlTextReader.Name == "Batch" && myXmlTextReader.IsStartElement())
                {
                    string BatchIdentifier = myXmlTextReader.GetAttribute("BatchIdentifier");
                    myXmlTextReader.Read(); // advance to next tag
                    while (!myXmlTextReader.EOF)
                    {
                        if (myXmlTextReader.Name == "Transaction" && myXmlTextReader.IsStartElement())
                        {
                            // Start a new set of items
                            string transactionID = myXmlTextReader.GetAttribute("ID");
                        myXmlTextReader.Read(); // Read next element, possibly another Transaction tag
                    }
                }
                //All Batch tags are completed.Move to next tag
                myXmlTextReader.Read();
            }
            // Close the XML memory stream.
            myXmlTextReader.Close();
            myXmlDocument.Close();
        }
    }

【讨论】:

    【解决方案4】:

    您可以像这样将其复制到文件流中:

    string fullPath = Path.Combine(filePath, fileName);
    FileStream fileStream = new FileStream(fullPath, FileMode.Open);
    Image image = Image.FromStream(fileStream);
    MemoryStream memoryStream = new MemoryStream();
    image.Save(memoryStream, ImageFormat.Jpeg);
    //Close File Stream
    fileStream.Close();  
    

    【讨论】:

    • 这样做会解压缩图像,然后将其重新压缩为 jpeg。只需使用文件流copyto方法将字节数组复制到内存流中即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2022-01-01
    • 2017-01-22
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多