Считывание содержимого файла C# и SystemOutOfMemoryException
Разрабатываю приложение для архивации. для записи в файл/чтения использую стандартную библиотеку System.IO. При считывании строки программа способна оперировать информацией, однако, при подгрузке из файла этой же информации программа кидает SystemOutOfMemoryException. С чем это может быть связано?
Функция добавления файла в виде строки:
private async void btnAddElement_Click(object sender, RoutedEventArgs e)
{
try
{
System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
ofd.Filter = "All|*.*|Image|*.jpg;*.jpeg;*.png|Video|*.mp4";
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
currentFile.Add(FileToBase64(ofd.FileName));
names.Add(GetFileName(ofd.FileName).Replace(' ', specSymbol));
MessageBox.Show(names[names.Count - 1]);
if (withName)
await Task.Run(() => File.WriteAllLines(resPath, ConstructContent(currentFile, names)));
else
await Task.Run(() => File.WriteAllLines(resPath, FilesToBase64(currentFile)));
WriteToLog("\"" + ofd.FileName + "\" added successfuly.", new StackTrace());
MessageBox.Show("\"" + ofd.FileName + "\" added successfuly.");
}
}
catch (Exception ex)
{
MessageBox.Show("Error on new file adding: " + ex.Message + " " + ex.Source);
WriteToLog("Error on new file adding", new StackTrace(), ex);
}
}
ConstructContent здесь соединяет всю нужную информацию в строки для записи.
Функция отделения содержимого файла для работы (считанного в сыром виде через ReadAllLines):
List<string> GetContent(List<string> fileLines)
{
List<string> base64s = new List<string>();
for (int i = 0; i < fileLines.Count; i++)
{
try
{
base64s.Add(fileLines[i].Split()[0]);
}
catch (Exception ex)
{
MessageBox.Show("GetContent(): Index-" + i + ";" + ex.Message);
}
}
return base64s;
}
Прошу заметить, что программа не получает огромных объемов информации, так как при добавлении строки функционирует нормально, а вот считывание из файла, почему-то, требует огромного количества памяти. Исключение получается в результате выполнения этой команды в GetContent:
fs.Add(cf[i].Split()[0]);