即使使用 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()
方法
这是我的代码,我试图用另一个文件夹中的另一个图像替换一个文件夹中的图像,同时保留他的文件名。
我正在使用 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()
方法