Пожалуйста, извините меня, если это плохой вопрос, поскольку я плохо разбираюсь в файлах с памятью. Я использую файлы с отображением памяти в моем проекте. Я отслеживаю файлы в процессе и файл, который уже обработан в файлах с отображением памяти. У меня есть два файла с отображением памяти. В первом файле с отображением памяти я отслеживаю обработанные файлы и во втором файле с отображением памяти, я отслеживаю обрабатываемые файлы. Поэтому, когда обработка завершена в определенном файле, я делаю запись в первом сопоставленном файле памяти и удаляю запись из второго сопоставленного файла. Теперь проблема в том, что если все файлы обрабатываются, я удаляю второй объект с отображением памяти. Но когда пользователь добавляет больше файлов для обработки, я инициализирую новый объект с отображением памяти с тем же именем, что и второе имя сопоставленного файла памяти. И когда я пытаюсь получить доступ к этому второму файлу, он дает исключение "безопасный дескриптор закрыт" .
Обратите внимание: я должен удалить второй файл с отображением карты памяти.
Просьба предложить.
ПЕРВОЕ ОБНОВЛЕНИЕ Функция, которая записывает первый файл с отображением памяти
Public void WriteFile()
{
DialogResult result = folderBrowserDialog1.ShowDialog();
if (result == DialogResult.OK)
{
mmf1 = MemoryMappedFile.OpenExisting("Some File Name1");
Class1 Class1obj = new Class1();
string foldername = folderBrowserDialog1.SelectedPath;
Class1obj.CreateMMFFile1(foldername, mmf1, "MMF_IPC1");
}
Class1.RefreshExplorer();
}
Функция, которая записывает второй файл с отображением памяти:
public void ProcessFiles()
{
DialogResult result = folderBrowserDialog1.ShowDialog();
if (result == DialogResult.OK)
{
mmf = MemoryMappedFile.OpenExisting("Some File Name");
Class1 Class1obj = new Class1();
string foldername = folderBrowserDialog1.SelectedPath;
Class1obj.CreateMMFFile1(foldername, mmf, "MMF_IPC");
}
Class1.RefreshExplorer();
}
Функция, которая добавляет первый файл и удаляет второй файл.
Public void AppendFile()
{
Class1 Class1obj = new Class1();
string foldername = folderBrowserDialog1.SelectedPath;
Class1obj.AppendToMMFFile(mmf1, "MMF_IPC1");
Class1.RefreshExplorer();
mmf.Dispose();
}
Теперь, когда пользователь добавляет новый файл для обработки, будет вызвана функция ProcessFiles(), и я получаю исключение. Позвольте мне знать, что еще я могу сделать, чтобы подробнее рассказать об этом. CreateMMFFile1() и CreateMMFFile() - это функция, которая записывает файлы с отображением памяти.
Второе ОБНОВЛЕНИЕ Вот функция AppendToMMFFile, которая добавляет первые данные файла MMF во второй файл MMF.
Public void AppendToMMFFile()
{
StringBuilder sb = new StringBuilder();
string str = string.Empty;
try
{
using (var stream = mmf.CreateViewStream())
{
System.IO.BinaryReader reader = new System.IO.BinaryReader(stream, System.Text.Encoding.Unicode);
sb.Append(reader.ReadString());
sb.Append(str + "\r\n");
}
using (var stream = mmf1.CreateViewStream())
{
System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream, System.Text.Encoding.Unicode);
writer.Write(sb.ToString());
}
}
catch (Exception ex)
{
Debug.WriteLine("Unable to monitor memory file. " + ex);
}
}