Копирование файла IOException необработанное.При загрузке изображения из картинки - PullRequest
2 голосов
/ 18 февраля 2011

Помощь!Я не могу понять, как закрыть файл.Он всегда дает мне файл IOException, что-то вроде , он используется другим процессом

Вот мой код

private void uploadpic_btn_Click(object sender, EventArgs e)
{
    open_dialog = new OpenFileDialog();

    open_dialog.Title = "Open picture";
    open_dialog.Filter = "JPEG (*.jpg;*.jpeg;*.jpe;*.jfif)|*.jpg";

    if (open_dialog.ShowDialog() != DialogResult.Cancel)
    {
        uploadpic_pb.BackgroundImage = Image.FromFile(open_dialog.FileName);
        uploadpic_pb.BackgroundImageLayout = ImageLayout.Stretch;
        uploadpic_pb.BorderStyle = BorderStyle.FixedSingle;
    }
}

private void saveBTN_Click(object sender, EventArgs e)
{
    string targetPath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "\\Pictures");
    string destFile = Path.Combine(targetPath, "Copied.jpg");

    if (!Directory.Exists(targetPath))
    {
        Directory.CreateDirectory(targetPath);
    }

    File.Copy(open_dialog.FileName, destFile, true);
}

private void Form1_Load(object sender, EventArgs e)
{
    Image myimage = Image.FromFile(@"C:\Pictures\Copied.jpg");

    uploadpic_pb.BackgroundImage = myimage;
    uploadpic_pb.BackgroundImageLayout = ImageLayout.Stretch;
    uploadpic_pb.BorderStyle = BorderStyle.FixedSingle;
}

Исключение возвращает

Процесс не может получить доступ к файлу 'C: \ Pictures \ Copied.jpg', поскольку он используется другим процессом.

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

Image.FromFile () устанавливает блокировку записи для файла. Form1_Load () таким образом устанавливает блокировку на Copied.jpg. Затем вы нажимаете кнопку uploadpic_btn, чтобы назначить новое растровое изображение свойству BackgroundImage. Однако дальнейшее нажатие кнопки saveBTN может привести к сбою, как вы написали код. Copied.jpg все еще заблокирован, объект Image все еще существует. Он не исчезнет, ​​пока не начнет работать сборщик мусора.

Чтобы не ждать этого, вам придется избавиться от изображения. Исправлено:

    if (open_dialog.ShowDialog() != DialogResult.Cancel)
    {
        if (uploadpic_pb.BackgroundImage != null) uploadpic_pb.BackgroundImage.Dispose();
        uploadpic_pb.BackgroundImage = Image.FromFile(open_dialog.FileName);
        // etc...
    }
1 голос
/ 18 февраля 2011

Попробуйте использовать переменную уровня класса для имени файла вместо targetPath, возможно добавляя дату и время, чтобы сохранить его уникальным. Сохраните overwrite = false в File.copy и посмотрите, работает ли он. Это всего лишь тест, чтобы убедиться, что ваш файл Copied.Jpg используется.

Также - скомпилируйте решение в режиме релиза и попробуйте запустить из EXE напрямую из bin вместо Visual Studio. Иногда вспомогательный процесс Visual Studio блокирует файлы.

...