进程无法访问该文件,因为它已被其他进程使用

时间:2013-12-03 11:28:06

标签: c#

我正在尝试上传图片并将其保存到数据库并给我一个错误

private void Save_Click(object sender, EventArgs e)
        {
            SqlCommand cmd = connect.CreateCommand();
            cmd = new SqlCommand("sp_InsertDepartStaff", connect);
            cmd.CommandType = CommandType.StoredProcedure;
            try
            {

                FileStream filestream = new FileStream(picLoc, FileMode.Open, FileAccess.ReadWrite);
                BinaryReader binaryreader = new BinaryReader(filestream);
                image = binaryreader.ReadBytes((int)filestream.Length);

                connect.Open();


                //connect.Open();
                SqlParameter parm = new SqlParameter("@StaffID", SqlDbType.Int);
                parm.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(parm);
                SqlParameter parm1 = new SqlParameter("@LoginID", SqlDbType.Int);
                parm1.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(parm1);
                SqlParameter parm4 = new SqlParameter("@StaffRoleID", SqlDbType.Int);
                parm4.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(parm4);


                cmd.Parameters.AddWithValue("@FirstName", SqlDbType.NVarChar).Value = firstNameTextBox.Text;
                cmd.Parameters.AddWithValue("@LastName", SqlDbType.NVarChar).Value = lastNameTextBox.Text;
                cmd.Parameters.AddWithValue("@UserName", SqlDbType.NVarChar).Value = userNameTextBox.Text;
                cmd.Parameters.AddWithValue("@Password", SqlDbType.NVarChar).Value = passwordTextBox.Text;
                cmd.Parameters.AddWithValue("@Email", SqlDbType.NVarChar).Value = emailTextBox.Text;
                cmd.Parameters.AddWithValue("@Phone", SqlDbType.NVarChar).Value = phoneTextBox.Text;

                cmd.Parameters.AddWithValue("@StaffRole", SqlDbType.NVarChar).Value = staffRoleTextBox.Text;
                cmd.Parameters.AddWithValue("@Department", SqlDbType.NVarChar).Value = departmentTextBox.Text;
                cmd.Parameters.Add(new SqlParameter("@ProfilePic", image));

                //clear();
                cmd.ExecuteNonQuery();
                MessageBox.Show("Saved Successfully!");
                connect.Close();
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }




     public void upload_Click(object sender, EventArgs e)
            {

                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "image files|*.jpg;*.png;*.gif";
                ofd.InitialDirectory = "C:\\Users\\maria.ngako\\Desktop\\Icons";
                ofd.FileName.ToString();
                DialogResult dr = ofd.ShowDialog();

                if (ofd.ShowDialog() == DialogResult.OK)
                {


                    profilePicPictureBox.Image = Image.FromFile(ofd.FileName);
                    picLoc = ofd.FileName.ToString();
                    profilePicPictureBox.ImageLocation = picLoc;
                }
    }

2 个答案:

答案 0 :(得分:4)

您忘了关闭该文件。

解决问题的最佳方法

由于您只是从文件中读取所有字节,因此您可以这样做:

image = File.ReadAllBytes(picLoc);

替代方法

否则,您可以更改此代码:

FileStream filestream = new FileStream(picLoc, FileMode.Open, FileAccess.ReadWrite);
BinaryReader binaryreader = new BinaryReader(filestream);
image = binaryreader.ReadBytes((int)filestream.Length);

对此:

using (FileStream filestream = new FileStream(picLoc, FileMode.Open, FileAccess.ReadWrite))
{
    BinaryReader binaryreader = new BinaryReader(filestream);
    image = binaryreader.ReadBytes((int)filestream.Length);
}

这将确保文件流关闭 - 即使在读取文件时出现异常。

或者,由于关闭BinaryReader也会关闭其基础流,您可以这样做:

using (BinaryReader binaryreader = new BinaryReader(new FileStream(picLoc, FileMode.Open, FileAccess.ReadWrite)))
{
    image = binaryreader.ReadBytes((int)filestream.Length);
}

作为旁注:您正在使用ReadWrite访问权限打开文件。通常,您应该打开访问要求最低的文件;在这种情况下,您只是阅读它们,因此您应该使用FileAccess.Read

答案 1 :(得分:2)

您忘了关闭FileStream,这就是为什么在尝试再次打开时出错的原因。

filestream.Close();

using(FileStream filestream = new FileStream(picLoc, FileMode.Open, FileAccess.ReadWrite))
{
   //Do operations here
}