Как исправить процесс не может получить доступ к файлу, потому что он используется другим процессом - PullRequest
1 голос
/ 06 мая 2019

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

private void timer1_Tick(object sender, EventArgs e)
{
    string[] images = Directory.GetFiles(@"D:\reflexscherm\root\Logo-teams2", "*.*");
    counter++;
    var maxcount = images.Count();
    textBox1.Text = maxcount.ToString();

    if (counter > maxcount - 1)
    {
        counter = 0;
        maxcount = images.Count();
    }

    //pb1.Image.Dispose();

    pb1.Image = Image.FromFile(images[counter]);
    //Image oldImage = pb1.Image;
    //pb1.Image.Dispose();
    //oldImage.Dispose();
    //pb1.Image = Image.FromFile(images[counter]);
}

private void button2_Click(object sender, EventArgs e)
{ 
    timer1.Stop();
    Image oldImage = pb1.Image; 
    pb1.Image = Image.FromFile(@"D:\reflexscherm\root\sponsor1\x. Groot-logo-REFLEX.jpg");
    pb1.Image.Dispose();
    oldImage.Dispose();

    string[] files = System.IO.Directory.GetFiles(sourcepath);
    string[] delfiles = Directory.GetFiles(targetpath);
    this.Hide();


    foreach (string d in delfiles)
    {
        Image oldI = pb1.Image;
        pb1.Image = Image.FromFile(@"D:\reflexscherm\root\sponsor1\x. Groot-logo-REFLEX.jpg");
        //pb1.Image.Dispose();
        oldI.Dispose();
        File.Delete(d);
    }
    foreach (string s in files)
    {
        string fname = s.Substring(sourcepath.Length + 1);
        File.Copy(Path.Combine(sourcepath, fname), Path.Combine(targetpath, fname), true);
        this.Show();
        timer1.Start();
    }

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

Ответы [ 3 ]

1 голос
/ 07 мая 2019

Метод 1: сохранение копии и назначение свойства элемента управления

Используйте этот метод, когда объект растрового изображения обрабатывается в более чем одном месте , поэтому нам нужносохранить его для дальнейших разработок / заданий и сохранить на диск после.

Назначьте, сохраните и утилизируйте исходное растровое изображение немедленно, удалив файл изображения:

Bitmap bitmap = null;
//---------------------------------------------

string imagePath = @"[Path of the Image]";

bitmap?.Dispose();
pictureBox1.Image?.Dispose();

using (Bitmap tempImage = new Bitmap(imagePath, true))
{
    bitmap = new Bitmap(tempImage);
    pictureBox1.Image = bitmap;
}

File.Delete(imagePath);

Метод 2: Назначьте растровое изображение и немедленно утилизируйте его

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

string imagePath = @"[Path of the Image]";
using (Image image = Image.FromFile(imagePath, true))
{
    pictureBox1.Image?.Dispose();
    pictureBox1.Image = new Bitmap(image);
}

File.Delete(imagePath);

Обратите внимание, что старое изображение, назначенное контролю, если таковое имеется, удаляется перед назначением нового.

Также обратите внимание, что я всегда указываю на сохранение внутренней информации ICMесли есть, указав true в качестве второго параметра для new Bitmap(imagePath, true) и Image.FromFile(imagePath, true).
Некоторые изображения не будут выглядеть как исходные, если мы этого не сделаем.

0 голосов
/ 06 мая 2019

Вы должны использовать доступ к файлу только для чтения, если не хотите, чтобы он был заблокирован:

using( FileStream stream = new FileStream( path, FileMode.Open, FileAccess.Read ) )

{

     image = Image.FromStream( stream );

}

Надеюсь, это поможет ...

0 голосов

У меня раньше была такая же проблема, я сделал следующее:

            this.photo.Dispose();
            this.photo.Refresh();
            this.photo.Image.Dispose();
            this.photo.Image = null;
            this.photo.ImageLocation = null;

и оно того стоит.

...