Не могу сохранить файл, потому что он используется
Я пробовал так много разных способов сделать это, и он все еще говорит мне, что файл используется, когда я пытаюсь удалить его, прежде чем сохранить его снова.
if (Clipboard.GetDataObject().GetData(DataFormats.Bitmap) != null)
{
if (File.Exists(filename)) { File.Delete(filename); }
using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite))
{
ImageConverter converter = new ImageConverter();
byte[] bytes = (byte[])converter.ConvertTo(Clipboard.GetDataObject().GetData(DataFormats.Bitmap), typeof(byte[]));
fs.Write(bytes, 0, bytes.Length);
fs.Close();
fs.Dispose();
}
}
Как видите, у меня все в блоке "с помощью". Я также "закрываю" файл и даже пытался явно вызвать "dispose". Но когда я снова запускаю код, он все равно говорит мне, что файл используется. Что я могу сделать, чтобы иметь возможность перезаписать файл?
Я также попробовал это так:
using (Bitmap bmp = new Bitmap((Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap)))
{
if (bmp != null)
{
if (File.Exists(filename)) { File.Delete(filename); }
using (MemoryStream memory = new MemoryStream())
{
using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite))
{
bmp.Save(memory, ImageFormat.Bmp);
byte[] bytes = memory.ToArray();
fs.Write(bytes, 0, bytes.Length);
fs.Close();
}
memory.Dispose();
}
bmp.Dispose();
break;
}
}
и это все еще дает мне ту же ошибку.
1 ответ
Если файл уже заблокирован до запуска вашей программы, вы не сможете его открыть. Посмотрите, сможете ли вы разблокировать его с помощью такой программы, как Unlocker. Как только файл разблокирован, вы сможете снова открыть его.
Когда вы оборачиваете потоки файлов в using{}
заявление, close();
а также dispose();
звонки не нужны. Они сделаны для вас, когда код выходит из using{}
заявление. Не больно звонить close();
но это избыточно. Если вы позвоните dispose();
однако и конец использования звонков dispose();
вы, скорее всего, получите исключение, потому что вы звоните dispose();
на расположенном объекте. Удалить ваши звонки close();
а также dispose();
Если вы "завершаете процесс" в своей программе через диспетчер задач (mangler) или нажимаете кнопку "Стоп" внутри вашей IDE, когда программа зацикливается внутри using{}
заблокировать, он снова заблокирует файл, и вам нужно будет снова использовать "Unlocker".
Итак, удалите close()
а также dispose()
звонки, а затем используйте "Unlocker", чтобы разблокировать файл. Запустите вашу программу, и вы должны быть золотыми...
ОБНОВИТЬ:
Поместите блок try / catch вокруг следующего кода:
bmp.Save(memory, ImageFormat.Bmp);
byte[] bytes = memory.ToArray();
fs.Write(bytes, 0, bytes.Length);
Посмотрите, получите ли вы когда-нибудь исключение в приведенном выше фрагменте кода. Если вы попытаетесь это сделать, это может указать на причину проблемы.