У меня есть редактор, у которого есть некоторые строки и изображение, отображаемое в файлах ui и iam, сохраняющих данные в текстовом файле и отдельном файле .jpg с тем же именем.Использование MemoryStream для загрузки .jpg без блокировки файла процессом?
Теперь, когда iam пытается переопределить файл .jpg на File.Replace
, в нем говорится, что изображение заблокировано другим процессом, который, очевидно, является процессом моего собственного приложения.
Я надеюсь, что memystream может исправить это, потому что он обрабатывается в ОЗУ. Поэтому я хотел бы загрузить все jpg-файлы с помощью memystream, но я не понимаю, как загрузить что-либо с помощью memystream, если это возможное решение моей проблемы вообще.
Редактировать: В основном код снипп это примерно это одна:
private void CopyPicture(bool PictureHasChanged)
{
try
{ //kopiere die datei nur, wenn sie nicht bereits vorhanden ist.
if (File.Exists(TargetFolder + Exercise.Name + ".jpg") == false)
{//kopiert das neue bild in das zielverzeichnis
File.Copy(Exercise.Bild.UriSource.LocalPath, TargetFolder + Exercise.Name + ".jpg");
}
else
{
//wenn das Bild einer bestehenden übung geändert wurde
if (PictureHasChanged)
{
//überprüft ob eine datei mit dem namen existiert
if (File.Exists(TargetFolder + Exercise.Name + ".jpg") == true)
{//löscht die existente datei
File.Replace(Exercise.Bild.UriSource.LocalPath, TargetFolder + Exercise.Name + ".jpg", TargetFolder + Exercise.Name + ".jpg");
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\n\n" + ex.Source);
return;
}
}
и я картина хранится внутреннее в простом списке как BitmapImage по: new BitmapImage(new Uri(f.FullName.ToString().Remove(f.FullName.Length - 4, 4) + ".jpg",UriKind.RelativeOrAbsolute))
я надеюсь, что это помогает понять проблему лучше
EDIT 2: Теперь IAM выполнив следующие действия, чтобы загрузить изображения:
FileStream fsSource = new FileStream(JpgTarget, FileMode.Open, FileAccess.Read);
byte[] bytes = new byte[fsSource.Length];
using (fsSource)
{
// Read the source file into a byte array.
int numBytesToRead = (int)fsSource.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
// Read may return anything from 0 to numBytesToRead.
int n = fsSource.Read(bytes, numBytesRead, numBytesToRead);
// Break when the end of the file is reached.
if (n == 0)
break;
numBytesRead += n;
numBytesToRead -= n;
}
//numBytesToRead = bytes.Length;
}
BitmapImage Image = new BitmapImage();
//erstellt das bitmap für die liste
using (MemoryStream Memstream = new MemoryStream(bytes))
{
Image.BeginInit();
Image.StreamSource = Memstream;
Image.CacheOption = BitmapCacheOption.OnLoad;
Image.EndInit();
Image.Freeze();
}
fsSource.Close();
Но твердит мне, что Pictrue, IAM пытается перезаписать уже используется другим процессом.
Edit 3: Я пытался использовать решение Pennie Pet и в конечном итоге с этим, та же проблема с заблокированного файла:
Bitmap newBitmap = GetImageFromByteArray(File.ReadAllBytes(JpgTarget));
using (MemoryStream memory = new MemoryStream())
{
newBitmap.Save(memory, newBitmap.RawFormat);
memory.Position = 0;
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
//fügt der liste die aus der textdatei gelesene übung hinzu
List.Add(new Uebung(text, Sitting, wdh, bitmapImage, f.Name.Substring(0, f.Name.Length - 4)));
}
См METHODE GetImageFromByteArray в должности PenniePet в.
Последнее редактирование:
Это была полностью моя вина, и это действительно меня смущать, я забыл, что я был Загрузка изображения в другой точке. Поскольку я исправил его, проблема с блокировкой больше не существует.
Я выбрал Awnser PenniePete как правильно, потому что ям в настоящее время использовал его, так как это был последний, который я пытался, и он также открыл глаза на мою неудачу.
Надеюсь, вы, другие ребята, не будете сумасшедшими. Спасибо за всю твою помощь!
Это помогло бы увидеть код, который вы на самом деле используете. Вам понадобится 'FileStream', чтобы прочитать файл независимо, но похоже, что вы, возможно, сможете загрузить его в« MemoryStream »в качестве буфера. Но я также не уверен, что это лучший способ сделать то, что вы ищете. Нам действительно нужно увидеть ваш код и лучшее описание того, что вы пытаетесь сделать. –
@MatthewHaugen там, вы идете, я надеюсь, что это делает для вас любой смысл:/ – Marv
Вы располагаете растровое изображение? – CodeCaster