删除图片框中显示的文件我从openfiledialoge中选择文件并将其显示在图片框中,当我单击删除按钮时它显示在文本框中我收到异常进程无法访问文件,因为它正在被另一个进程使用。我搜索了很多关于此异常的解决方案,但是当我尝试使用图像名称关闭文件时,我显示在图像框中;使用IsFileLocked方法,这将关闭并删除特定目录路径的所有文件,但是如何删除图片框中显示的唯一文件,我错了publicpartialclassRemoveAds:Form{OpenFileDialogofd=null;stringpath=@"C:UsersMonikaDocumentsVisualStudio2010ProjectsOnlineExamOnlineExamImage";//这是你正在检查的路径。publicRemoveAds(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){if(System.IO.Directory.Exists(path)){ofd=newOpenFileDialog();ofd.InitialDirectory=路径;DialogResultdr=newDialogResult();如果(ofd.ShowDialog()==System.Windows.Forms.DialogResult.OK){Imageimg=newBitmap(ofd.FileName);字符串imgName=ofd.SafeFileName;txtImageName.Text=imgName;pictureBox1.Image=img.GetThumbnailImage(350,350,null,newIntPtr());ofd.RestoreDirectory=true;}}else{返回;}}privatevoidbutton2_Click(objectsender,EventArgse){//Imageimg=newBitmap(ofd.FileName);字符串imgName=ofd.SafeFileName;if(Directory.Exists(path)){vardirectory=newDirectoryInfo(path);foreach(FileInfofileindirectory.GetFiles()){if(!IsFileLocked(file))file.Delete();}}}publicstaticBooleanIsFileLocked(FileInfopath){FileStreamstream=null;try{//不要将FileAccess更改为ReadWrite,//因为如果文件处于只读状态,它将失败。stream=path.Open(FileMode.Open,FileAccess.Read,FileShare.None);}catch(IOException){//文件不可用,因为它://仍在写入或正在被另一个线程处理//或不存在(已被处理)returntrue;}finally{if(stream!=null)stream.Close();}//文件没有被锁定returnfalse;}}在此先感谢您的帮助(先)接受的这个问题的答案是非常糕点的做法如果您阅读有关System.Drawing.Bitmap的文档,尤其是从文件创建位图的重载,您会发现:文件保持锁定状态,直到位图被处理掉。在您的代码中,您创建了位图并将其存储在局部变量中,但您永远不会在完成后丢弃它。这意味着您的图像对象已超出范围,但尚未释放对您尝试删除的图像文件的锁定。对于所有实现IDisposable的对象(如Bitmap),您必须自己处理它们。例如,查看此问题(或搜索其他问题-这是一个非常重要的概念!)。要正确更正问题,您只需在完成后处理图像://创建位图字符串imgName=ofd.SafeFileName;txtImageName.Text=imgName;pictureBox1.Image=img.GetThumbnailImage(350,350,null,newIntPtr());ofd.RestoreDirectory=true;img.Dispose();//处理位图对象}请不要接受下面答案中的建议-你几乎不需要调用GC.Collect,如果你需要这样做才能让事情正常进行,那么这应该是一个非常强烈的信号,表明你做错事了。另外,如果你只想删除一个文件(你显示的位图),你的删除代码是错误的,将删除目录中的每个文件(这只是重复Adel的观点)。另外,我建议不要只保留一个全局OpenFileDialog对象来存储文件名,而是要去掉它并保存文件信息:FileInfoimageFileinfo;//添加这个//OpenFileDialogofd=null;去掉这个privatevoidbutton1_Click(objectsender,EventArgse){if(System.IO.Directory.Exists(path)){OpenFileDialogofd=newOpenFileDialog();//使ofd本地化ofd.InitialDirectory=path;DialogResultdr=newDialogResult();if(ofd.ShowDialog()==System.Windows.Forms.DialogResult.OK){Imageimg=newBitmap(ofd.FileName);imageFileinfo=newFileInfo(ofd.FileName);//保存文件名stringimgName=ofd.SafeFileName;txtImageName.Text=imgName;pictureBox1.Image=img.GetThumbnailImage(350,350,null,newIntPtr());ofd.RestoreDirectory=true;img.Dispose();}ofd.Dispose();//不要忘记处理它!}else{返回;然后在第二个按钮处理程序中,您可以删除您感兴趣的文件。privatevoidbutton2_Click(objectsender,EventArgse){if(!IsFileLocked(imageFileinfo)){imageFileinfo.Delete();}}使用此代码stringimgName=ofd.SafeFileName;if(Directory.Exists(path)){vardirectory=newDirectoryInfo(path);foreach(FileInfofileindirectory.GetFiles()){GC.Collect();GC.WaitForPendingFinalizers();文件.删除();您的button2_Click事件处理程序遍历目录的所有文件并删除它们。您需要更改以下代码:publicpartialclassRemoveAds:Form{OpenFileDialogofd=null;stringpath=@"C:UsersMonikaDocumentsVisualStudio2010ProjectsOnlineExamOnlineExamImage";//这是你正在检查的路径。字符串完整文件路径;publicRemoveAds(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){if(System.IO.Directory.Exists(path)){ofd=newOpenFileDialog();ofd.InitialDirectory=路径;DialogResultdr=newDialogResult();如果(ofd.ShowDialog()==System.Windows.Forms.DialogResult.OK){Imageimg=newBitmap(ofd.FileName);字符串imgName=ofd.SafeFileName;txtImageName.Text=imgName;pictureBox1.Image=img.GetThumbnailImage(350,350,null,newIntPtr());fullFilePath=ofd.FilePath;ofd.RestoreDirectory=true;}}else{返回;}}privatevoidbutton2_Click(objectsender,EventArgse){FileInfofile=newFileInfo(fullFilePath);如果(!IsFileLocked(文件))文件。删除();}}公共静态布尔nIsFileLocked(FileInfopath){FileStreamstream=null;try{//不要将FileAccess更改为ReadWrite,//因为如果文件处于只读状态,它将失败。stream=path.Open(FileMode.Open,FileAccess.Read,FileShare.None);}catch(IOException){//文件不可用,因为它://仍在写入或正在被另一个线程处理//或不存在(已被处理)returntrue;}finally{if(stream!=null)stream.Close();}//文件没有被锁定returnfalse;通过使用GetThumnailImage,您必须指定静态宽度和高度,请改用Load方法。例如:pictureBox1.Load(图片路径);通过使用此功能,在关闭应用程序之前删除图像或文件夹没有任何问题。不需要创建其他方法。希望这对我有同样的问题有帮助:我在PictureBox中加载了一个文件,当我试图删除它时,我遇到了同样的异常。这仅在显示图像时发生。我尝试了所有这些:picSelectedPicture.Image.Dispose();picSelectedPicture.Image=null;picSelectedPicture.ImageLocation=null;并且仍然有相同的例外。然后我在CodeProject上找到了这个:[c#]Deleteimageopenedinpicturebox。它不使用PictureBox.Load(),而是从文件创建一个图像并将其设置为PictureBox.Image:...//从文件创建图像并将其显示在PictureBox图像中image=GetCopyImage(imagePath);picSelectedPicture.Image=图片;...privateImageGetCopyImage(stringpath){using(Imageimage=Image.FromFile(path)){Bitmap位图=newBitmap(image);返回位图;删除文件时不再有异常。恕我直言,这是最合适的解决方案。EDIT忘了说可以安全的在显示文件后立即删除:以上是C#学习教程:删除图片框显示的文件的全部内容,如果对大家有用需要了解更多关于C#学习教程,希望大家多多关注——...//从文件创建图片并显示在PictureBox中Imageimage=GetCopyImage(imagePath);picSelectedPicture.Image=图片;System.IO.File.Delete(图像路径);...本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
