我有一种编辑器,它在 ui 中显示了一些字符串和一张图片,并且我将数据保存在一个文本文件和一个具有相同名称的分离的 .jpg 文件中。
现在,当我试图通过 覆盖 .jpg 文件时File.Replace
,它说图片被另一个进程阻止了,这显然是我自己的应用程序的进程。
我希望内存流可以解决这个问题,因为它是在 RAM 中处理的。所以我想通过内存流加载所有 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();
但它一直告诉我,我试图覆盖的 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)));
}
请参阅 PenniePet 帖子中的 GetImageFromByteArray 方法。
最后编辑:
这完全是我的错,这真的让我很尴尬,我忘记了我正在加载图像。由于我修复了它,锁定问题不再存在。
我选择 PenniePete 的 Awnser 是正确的,因为我目前正在使用它,因为它是我尝试的最后一个,而且他也让我看到了我的失败。
我希望你们其他人不会生气。感谢您所有的帮助!