У меня есть своего рода редактор, в котором есть несколько строк и изображение, отображаемое в пользовательском интерфейсе, и я сохраняю данные в текстовом файле и отдельном файле .jpg с тем же именем.
Теперь, когда я пытаюсь переопределить файл .jpg с помощью File.Replace
, он говорит, что изображение заблокировано другим процессом, который, очевидно, является процессом моего собственного приложения.
Я надеюсь, что поток памяти может исправить это, потому что он обрабатывается в ОЗУ. Поэтому я хотел бы загрузить все файлы jpg с помощью потока памяти, но я не понимаю, как загрузить что-либо с помощью потока памяти, если это вообще возможное решение моей проблемы.
Изменить: в основном фрагмент кода, о котором идет речь, таков:
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;
}
}
и у меня есть изображение, хранящееся внутри в простом списке в виде растрового изображения: new BitmapImage(new Uri(f.FullName.ToString().Remove(f.FullName.Length - 4, 4) + ".jpg",UriKind.RelativeOrAbsolute))
я надеюсь, что это поможет лучше понять проблему
РЕДАКТИРОВАТЬ 2: теперь я делаю следующее, чтобы загрузить изображение:
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();
Но он продолжает говорить мне, что The Pictrue, который я пытаюсь перезаписать, уже используется другим процессом.
Изменить 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)));
}
См. метод GetImageFromByteArray в сообщении PenniePet.
Последнее редактирование:
Это была полностью моя вина, и это меня очень смутило, я забыл, что загружал изображение в другой момент. Так как я это исправил, проблема с заблокированным аккаунтом больше не существует.
Я выбрал Awnser от PenniePete как правильный, потому что в настоящее время я использую его, так как это был последний, который я пробовал, и он также открыл мне глаза на мою неудачу.
Я надеюсь, что вы, ребята, не рассердитесь. Спасибо за всю твою помощь!
FileStream
для чтения файла в любом случае, но похоже, что вы можете, да, загрузить его вMemoryStream
в качестве буфера. Но я также не уверен, что это лучший способ сделать то, что вы ищете. Нам действительно нужно увидеть ваш код и лучшее описание того, что вы пытаетесь сделать. - person Matthew Haugen   schedule 20.11.2014