Как загрузить файл в поток памяти

У меня есть имя файла, указывающее на текстовый файл, включая его путь, в виде строки. Теперь я хотел бы загрузить это .csv файл в поток памяти. Как мне это сделать?

Например, у меня есть это:

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

3 ответа

Решение

Вам не нужно загружать файл в MemoryStream.

Вы можете просто позвонить File.OpenRead чтобы получить FileStream содержащий файл.

Если вы действительно хотите, чтобы файл находился в MemoryStream, вы можете вызвать CopyTo скопировать FileStream в MemoryStream.

Dim stream As New MemoryStream(File.ReadAllBytes(filename))

У меня был файл XML, читаемый с диска, используя старый API XmlReader. Как прочитать XML-файл в памяти, а затем работать с ним в памяти вместо повторного чтения диска? На основе ответа VB от Centro (проголосовало за), но с блоком 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"));

Ниже приведен фрагмент кода, показывающий код для чтения XML-документа теперь, когда он находится в MemoryStream. По сути, тот же код, что и когда он исходил из FileStream, указывающего на файл на диске. Да, API XMLTextReader старый и неуклюжий, но это то, с чем мне пришлось работать в этом приложении.

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

Вы можете скопировать его в поток файлов следующим образом:

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();  
Другие вопросы по тегам