我从openfiledialoge中选择文件,并在pictureBox中显示它,并在文本框中显示它,当我点击删除按钮我正在获得异常该进程无法访问该文件,因为它被另一个进程使用.
我搜索了很多这个异常得到解决,但我没有任何工作,当我试图关闭文件中的imagename的文件,即我在图片框中显示的文件;使用IsFileLocked方法,这会关闭和删除特定目录路径的所有文件,但是如何删除在pictureBox中显示的唯一文件,我将出错
public partial class RemoveAds : Form
    {
        OpenFileDialog ofd = null;
        string path = @"C:\Users\Monika\Documents\Visual Studio 2010\Projects\OnlineExam\OnlineExam\Image\"; // this is the path that you are checking.

        public RemoveAds()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender,EventArgs e)
        {
            if (System.IO.Directory.Exists(path))
            {
                 ofd = new OpenFileDialog();
                ofd.InitialDirectory = path;
                DialogResult dr = new DialogResult();
                if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Image img = new Bitmap(ofd.FileName);
                    string imgName = ofd.SafeFileName;
                    txtimageName.Text = imgName;
                    pictureBox1.Image = img.GetThumbnailImage(350,350,null,new IntPtr());
                    ofd.RestoreDirectory = true;
                }
            }
            else
            {
                return;
            } 
        }
private void button2_Click(object sender,EventArgs e)
        {
            //Image img = new Bitmap(ofd.FileName);
            string imgName = ofd.SafeFileName;  
             if (Directory.Exists(path))
             {

                 var directory = new DirectoryInfo(path);
                 foreach (FileInfo file in directory.GetFiles())
                 { if(!IsFileLocked(file))
                     file.Delete(); 
                 }
             }


        }
        public static Boolean IsFileLocked(FileInfo path)
        {
            FileStream stream = null;   
            try
            { //Don't change FileAccess to ReadWrite,//because if a file is in readOnly,it fails.
                stream = path.Open ( FileMode.Open,FileAccess.Read,FileShare.None ); 
            } 
            catch (IOException) 
            { //the file is unavailable because it is:
                //still being written to or being processed by another thread
                //or does not exist (has already been processed)
                return true;
            } 
            finally
            { 
                if (stream != null)
                    stream.Close();
            }   
            //file is not locked
            return false;
        }
    }

提前感谢任何帮助

解决方法

(以前)接受的这个问题的答案是很差的做法.如果您在System.Drawing.Bitmap上使用 read the documentation,特别是为从文件创建位图的重载,您会发现:

The file remains locked until the Bitmap is disposed.

在您的代码中,您创建位图并将其存储在本地变量中,但在完成后您永远不会处理它.这意味着您的图像对象已超出范围,但尚未释放其对要删除的图像文件的锁定.对于实现Idisposable的所有对象(如Bitmap),您必须自己处理它们.例如参见this question(或搜索其他人 – 这是一个非常重要的概念!).

要正确解决问题,您只需要处理完成后的图像:

if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
 {
      Image img = new Bitmap(ofd.FileName);  // create the bitmap
      string imgName = ofd.SafeFileName;
      txtimageName.Text = imgName;
      pictureBox1.Image = img.GetThumbnailImage(350,new IntPtr());
      ofd.RestoreDirectory = true;
      img.dispose();  // dispose the bitmap object
 }

请不要在下面的答案中采取建议 – 你几乎不需要调用GC.Collect,如果你需要做它来使事情工作,它应该是一个非常强大的信号,你正在做其他错误.

此外,如果您只想删除一个文件(您显示的位图),您的删除代码是错误的,并将删除目录中的每个文件(这只是重复Adel的要点).此外,与其保留一个全局的OpenFileDialog对象只是存储文件名,我建议摆脱那个,只保存文件信息:

FileInfo imageFileinfo;           //add this
//OpenFileDialog ofd = null;      Get rid of this

private void button1_Click(object sender,EventArgs e)
{
     if (System.IO.Directory.Exists(path))
     {
         OpenFileDialog ofd = new OpenFileDialog();  //make ofd local
         ofd.InitialDirectory = path;
         DialogResult dr = new DialogResult();
         if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
         {
              Image img = new Bitmap(ofd.FileName);
              imageFileinfo = new FileInfo(ofd.FileName);  // save the file name
              string imgName = ofd.SafeFileName;
              txtimageName.Text = imgName;
              pictureBox1.Image = img.GetThumbnailImage(350,new IntPtr());
              ofd.RestoreDirectory = true;
              img.dispose();
         }
         ofd.dispose();  //don't forget to dispose it!
     }
     else
     {
         return;
     }
 }

然后在您的第二个按钮处理程序中,您可以删除您感兴趣的一个文件.

private void button2_Click(object sender,EventArgs e)
        {                
           if (!IsFileLocked(imageFileinfo))
            {                 
                imageFileinfo.Delete();
            }
        }

c# – 删除在picturebox中显示的文件的更多相关文章

  1. ios – iPhone崩溃日志不能正确地符号化并且是双重间隔的

    任何建议超过欢迎.谢谢.解决方法当这件事发生在我身上时,它只是我通过电子邮件收到的日志.如果我记得,至少有一些是在.msg文件中,我不得不把它们拿出来.它可能是Exchange编码更改.如果你显示不可见的字符,你可能会看到每个字符之间的东西.您可以找到并替换它们以删除它们或更改编辑器中的编码.

  2. xamarin.ios – 没有找到ViewController ::.ctor(System.IntPtr)的构造函数

    我有一个问题,我的Monotouch应用程序有时在收到内存警告后才会崩溃.请参见下面的堆栈跟踪.堆栈跟踪是正确的,因为指定的类缺少构造函数获取IntPtr参数.但是这是有意的,因为我在应用程序中根本不使用InterfaceBuilder.那为什么会这样呢?

  3. ios – 在/usr/lib/system/libcache.dylib中,缺少必需的架构armv6

    在试图为iphoneos编写一个虚拟程序时,Xcode4,gcc似乎没有超出初始的sysroot目录如果我把sysroot,以下作品,但感觉非常干酪,而且不可伸缩.这里发生了什么?

  4. ios – Iphone / Ipad在缩放时崩溃

    i=hUb1GHJ6有没有人有什么可能出错的线索?解决方法我们正在做很多调试,我们终于找到了一个解决方案.我们有一个“跳过导航”链接,只有在您的键盘上按“标签”时才显示.这最初设置为“text-indent:-10000px”.这可能导致视口宽度超过10000像素,然后导致手机使用太多内存,然后最终崩溃.我们已经通过删除这个CSS规则来解决这个问题,所以blush.no不会崩溃那么多了.Iphone仍然有内存泄漏的问题,直到他们解决这个问题,网站有时会崩溃,但不会像以前那样接近.

  5. xamarin.ios – 如何使用System.Drawing.Color?

    我昨天遇到了问题.我想在Android和iOS项目中使用System.Drawing.Color结构.Xamarin文档声称MonoTouch框架具有System.Drawing.Color结构(link-http://iosapi.xamarin.com/?link=T:System.Drawing.Color).但是在monotouch.dll命名空间中,System.Drawing没有名称为

  6. ios – 异常类型:EXC_CRASH(SIGABRT)

    有没有人知道这次崩溃?解决方法这不是崩溃,因异常而中止.这意味着您的应用程序正在将错误数据传递给系统例程,并且例程说它很糟糕且无法继续,因此它会杀死您的应用程序.控制台应该显示出错的地方.可能发生的一个常见异常是尝试从一个只有n个对象的数组中获取第一个对象.控制台将显示一条消息.因此,请检查控制台以查看可能发生的情况.

  7. 企业发行版在Swift App中与iOS8不相称

    我在使用我的swift应用程序在iOS8设备上运行Enterprise构建时遇到问题.如果我使用非企业帐户进行代码签名,它似乎工作正常.有人遇到过这个问题吗?

  8. Glassware auth:android.accounts.OperationCanceledException“不允许共享凭据:取消.”

    MirrorPOSTURL末尾的用户名是否应该与特定内容匹配,或者我们可以自由使用我们自己的东西吗?解决方法要检查几件事:>您的应用程序的软件包名称是否与提交Glassware时提供的软件包名称完全匹配?>您是否通过MyGlass至少安装了一次提交的APK,而不是总是用adb侧载它?确保卸载APK,然后通过在MyGlass中打开它来安装它,以便正确设置权限;从那时起,您可以通过将ad替换为adb来继续开发.

  9. Android模拟器挂起启动?

    我一直在修改/编辑Android平台的部分内容,但在尝试测试我的编辑时遇到了问题.在对平台源进行更改后,我能够成功编译源代码–从而创建system.img,ramdisk.img和userdata.img.当我在模拟器中测试它时,模拟器只是挂在“ANDROID_”屏幕上,下划线闪烁,但似乎永远不会加载.有什么建议?

  10. android – File.renameTo()返回true,但文件尚未重命名

    我正在尝试为我的录音机创建一个文件,但是这个文件不断获得一个随机名称.因为这很难处理,所以我希望在使用更有意义的名称创建文件后重命名该文件.但是,即使renameto返回true,该文件仍未重命名.我在这里做错了吗?

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部