即使使用 dispose 函数,当前可执行文件正在使用文件

File is being used by the current executable even though using dispose function

这是我的代码,我试图用另一个文件夹中的另一个图像替换一个文件夹中的图像,同时保留他的文件名。 我正在使用 dataGridView 检索文件夹的内容 我正在将所选单元格中的图像直接加载到 picturebox 我在用着: File.Copy(Source, Destination,true); 为了复制我的文件,我确保处理掉所有东西,这样它就不会被进程使用。

我的完整项目(评论):

private void Form1_Load(object sender, EventArgs e)
{
    //Get content of the DESTINATION files on a specific folder and put it into a dataGridView1

    string[] files = Directory.GetFiles(@Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\Black Desert\FaceTexture", "*", SearchOption.TopDirectoryOnly);
    DataTable table = new DataTable();
    table.Columns.Add("File Name");
    for (int i = 0; i < files.Length; i++)
    {
        FileInfo file = new FileInfo(files[i]);
        table.Rows.Add(file.Name);

    }
    dataGridView1.DataSource = table;

    //Get content of the SOURCE files on a specific folder and put it into a dataGridView2

    string[] files2 = Directory.GetFiles(@"Face Texture", "*");
    DataTable table2 = new DataTable();
    table2.Columns.Add("File Name");
    for (int i = 0; i < files2.Length; i++)
    {
        FileInfo file = new FileInfo(files2[i]);
        table2.Rows.Add(file.Name);

    }
    dataGridView2.DataSource = table2;
}

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    try
    {
        string[] sizes = { "B", "KB", "MB", "GB", "TB" };
        double len = new FileInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\Black Desert\FaceTexture\" + dataGridView1.SelectedCells[0].Value.ToString()).Length;
        int order = 0;
        while (len >= 1024 && order < sizes.Length - 1)
        {
            order++;
            len = len / 1024;
        }

        string result = String.Format("{0:0.##} {1}", len, sizes[order]);

        //We get the picturebox to show which file we selected in the cell (datagridview1)
        pictureBox1.Image = Image.FromFile(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\Black Desert\FaceTexture\" + dataGridView1.SelectedCells[0].Value.ToString());
        LblFileName1.Text = dataGridView1.SelectedCells[0].Value.ToString();
        //We have the full path here
        LblFilePath1.Text = (Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\Black Desert\FaceTexture\" + dataGridView1.SelectedCells[0].Value.ToString());
        LblFileSize1.Text = result;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e)
{
    try
    {
        button1.Enabled = true;

        string[] sizes = { "B", "KB", "MB", "GB", "TB" };
        double len = new FileInfo("Face Texture\" + dataGridView2.SelectedCells[0].Value.ToString()).Length;
        int order = 0;
        while (len >= 1024 && order < sizes.Length - 1)
        {
            order++;
            len = len / 1024;
        }

        string result = String.Format("{0:0.##} {1}", len, sizes[order]);

        //We get the picturebox to show which file we selected in the cell (datagridview2)
        pictureBox2.Image = Image.FromFile("Face Texture\" + dataGridView2.SelectedCells[0].Value.ToString());
        LblFileName2.Text = dataGridView2.SelectedCells[0].Value.ToString();
        //We have the full path here
        LblFilePath2.Text = "Face Texture\" + dataGridView2.SelectedCells[0].Value.ToString();
        LblFileSize2.Text = result;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        //Get store into a string both paths before disposing them
        string Source = LblFilePath1.Text;
        string Destination = LblFilePath2.Text;

        pictureBox1.Dispose();
        pictureBox2.Dispose();
        dataGridView1.Dispose();
        dataGridView2.Dispose();
        LblFileName1.Dispose();
        LblFileName2.Dispose();
        LblFilePath1.Dispose();
        LblFilePath2.Dispose();
        LblFileSize1.Dispose();
        LblFileSize2.Dispose();

        File.Copy(Source, Destination, true);
        MessageBox.Show(Source + Destination);

    }
    catch (Exception ex2)
    {
        //Eh, used by the process ..
        MessageBox.Show(ex2.Message);
    }
}

您想处理图像对象而不是 PictureBox 对象。

因此pictureBox.Image.Dispose()将解决问题。

所以 PictureBox has image 属性 class 有一个 Dispose() 方法