Не могу сохранить файл, потому что он используется

Я пробовал так много разных способов сделать это, и он все еще говорит мне, что файл используется, когда я пытаюсь удалить его, прежде чем сохранить его снова.

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);

Посмотрите, получите ли вы когда-нибудь исключение в приведенном выше фрагменте кода. Если вы попытаетесь это сделать, это может указать на причину проблемы.

Другие вопросы по тегам