如何删除文件锁?C#

Joh*_*upe 5 c# file-io file

所以我正在使用C#并正在建立一个注册系统.因此,有一个选项可以添加图片和我做的事情,我提示用户选择一个文件,然后该文件将被复制到Directory文件夹,然后重命名为学生的录取号码.以下是该浏览按钮的代码:

OpenFileDialog openDlg = new OpenFileDialog();
            openDlg.Filter = "All JPEG files (*.jpg; *.jpeg)| *.jpg; *.jpeg";
            string filter = openDlg.Filter;
            openDlg.Multiselect = false;
            openDlg.Title = "Open a JPG File";
            if (openDlg.ShowDialog() == DialogResult.OK)
            {                
                curFileName = openDlg.SafeFileName;
                string curFilePath = openDlg.FileName;

                openDlg.Dispose();

                string sourcePath = @curFilePath.Remove((curFilePath.Length - curFileName.Length));
                string targetPath = "@";

                mycon.Open();
                string cmdstr = "SELECT imageDirectory from userSettings WHERE ID = 1";
                cmd = new OleDbCommand(cmdstr, mycon);
                dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    targetPath = (@dr["imageDirectory"].ToString());
                }
                dr.Close();
                mycon.Close();

                string sourceFile = Path.Combine(sourcePath, curFileName);
                string destFile = Path.Combine(targetPath, curFileName);

                File.Copy(sourceFile, destFile, true);

                newname = @destFile.Remove((destFile.Length - curFileName.Length)).ToString() + "\\" + (DateTime.Now.Year + "-" + textBox1.Text+".jpeg");

                if (File.Exists(newname) == true)
                {
                    pictureBox1.Image.Dispose();
                    try
                    {
                        File.Delete(newname);
                    }

                    catch (IOException ex)
                    {
                        MessageBox.Show(ex.ToString());
                        return;
                    }
                }

                File.Move(destFile, newname);

                photoPath = newname;
                pictureBox1.Image = Image.FromFile(photoPath);
Run Code Online (Sandbox Code Playgroud)

问题是:

a.)我有一个允许用户进入下一步的功能,然后如果他想在最后一步做一些更改,他可以返回并更新它.这里的问题是,当他更改图片时,我收到一条错误,指出"文件无法被访问,因为它正被另一个进程使用"

b.)当用户已经上传图片然后返回主页时,当他决定再次注册时,他将无法上传新图片,并显示错误消息:"该文件无法访问,因为它被另一个进程使用".

这两个错误都指向:

`File.Delete(newname);`
Run Code Online (Sandbox Code Playgroud)

我真的不知道该怎么做我自从昨晚以来一直在寻找解决方案的人我无法看到一个解决方案,不会让我完全改变整个代码.请帮忙 :(

Han*_*ant 6

你的代码是正确的,忽略了关于代码气味的贬低.处置PictureBox.Image对于避免内存不足异常非常重要.

此问题是由Bitmap类的实现细节引起的.当您打开图像文件时,该类会创建一个内存映射文件,以将图像的像素数据映射到内存中.这是对大图像的重要优化,它将像素数据保留在页面文件之外.如今,在GDI +设计15年后,现代机器拥有大量的RAM和磁盘空间,这一点并不那么重要.

但是,该内存映射文件会在文件上创建锁定.重要的是要防止任何其他进程弄乱文件数据并使文件的映射视图无效.您正在看到的是,尝试替换或删除该文件不再有效.您可以通过创建位图的深层副本来避免它,该副本在内存中包含所有像素数据并且不再使用该文件.像这样:

public static Bitmap LoadBitmapNolock(string path) {
    using (var img = Image.FromFile(path)) {
        return new Bitmap(img);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,使用此代码可以显着提高32位版本Windows上大图像内存不足的可能性.