我的代码是这样的:
using (var openFileDialogForImgUser = new OpenFileDialog())
{
string location = null;
string fileName = null;
string sourceFile = null;
string destFile = null;
string targetPath = @"..\..\Images";
openFileDialogForImgUser.Filter = "Image Files (*.jpg, *.png, *.gif, *.bmp)|*.jpg; *.png; *.gif; *.bmp|All Files (*.*)|*.*"; // filtering only picture file types
openFileDialogForImgUser.InitialDirectory = @"D:\My Pictures";
var openFileResult = openFileDialogForImgUser.ShowDialog(); // show the file open dialog box
if (openFileResult == DialogResult.OK)
{
using (var formSaveImg = new FormSave())
{
var saveResult = formSaveImg.ShowDialog();
if (saveResult == DialogResult.Yes)
{
imgUser.Image = new Bitmap(openFileDialogForImgUser.FileName); //showing the image opened in the picturebox
fileName = openFileDialogForImgUser.FileName;
location = Path.GetDirectoryName(fileName);
sourceFile = System.IO.Path.Combine(location, fileName);
destFile = System.IO.Path.Combine(targetPath, fileName);
if (!System.IO.Directory.Exists(targetPath))
{
System.IO.Directory.CreateDirectory(targetPath);
}
System.IO.File.Copy(sourceFile, destFile, true); /* error occurs at this line */
}
else
openFileDialogForImgUser.Dispose();
}
}
}
我要做的是提示用户在OpenFileDialog中选择一个图像,并将该图片复制到另一个目录(具体为targetPath)。除了那一行之外,一切似乎都能正常工作:System.IO.File.Copy(sourceFile, destFile, true);
。
它表示该文件仅供另一个进程使用。对于我选择的任何图像都会发生这种情况。
我正在尝试查看其他人对此问题的解决方案 - 我必须终止(或等待)使用我的文件的进程。如果是这样,我该怎么做?或者,如果这不是答案,我该怎么办?请注意,这是在C#解决方案中处理图像文件的唯一代码。
答案 0 :(得分:1)
我认为你的问题涉及不正确处理Bitmap对象。如果您创建一个Bitmap,使其从文件中读取而您没有丢弃它,则该文件将保持打开状态并被锁定。
以下是几个链接:
The dispose of an OpenFileDialog in C#?
C#: Dispose() a Bitmap object after call Bitmap.save()?
正如我在回答https://stackoverflow.com/a/18172367/253938中指出的那样,我使用Bitmap和磁盘文件的经验是,最好永远不要让Bitmap打开文件。相反,将文件读入字节数组并使用ImageConverter将其转换为图像。
答案 1 :(得分:0)
您需要在完成后关闭文件。使用.Close()
属性关闭文件。
打开文件阅读/使用后,它会打开后台进程。要使该过程结束,您还需要使用.Close()
因此,您的代码需要在代码的底部有一个yourFile.Close()
。