Как загрузить файл в поток памяти
У меня есть имя файла, указывающее на текстовый файл, включая его путь, в виде строки. Теперь я хотел бы загрузить это .csv
файл в поток памяти. Как мне это сделать?
Например, у меня есть это:
Dim filename as string="C:\Users\Desktop\abc.csv"
3 ответа
Вам не нужно загружать файл в MemoryStream.
Вы можете просто позвонить File.OpenRead
чтобы получить FileStream
содержащий файл.
Если вы действительно хотите, чтобы файл находился в MemoryStream, вы можете вызвать CopyTo
скопировать FileStream в MemoryStream.
У меня был файл 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();