【问题标题】:C# File.Delete, file being used by another processC# File.Delete,文件正被另一个进程使用
【发布时间】:2009-05-01 14:06:16
【问题描述】:

我在尝试删除图像文件时遇到问题。 我总是收到一条错误消息:IOExeption 未处理。访问被拒绝,因为该文件正被另一个进程使用。

我不知道这可能是什么过程以及如何解决它。

private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
        {
            专辑专辑 = GetAlbum(comboBox1.SelectedIndex);
            照片照片 = GetPhoto(comboBox1.SelectedIndex, comboBox3.SelectedIndex);

            txtPhotoPath.Text = Directory.GetCurrentDirectory() + "\\" + photo.SPath;

            lblExtention.Text = 照片.SExtention;
            txtPhotoTitle.Text = 照片.STitle;
            pctrbFoto.Image = Image.FromFile(foto.SPath).GetThumbnailImage(GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)), GetfHeight(photo.SPath, 150), null, new IntPtr());
        }

私人无效btnChangePhoto_Click(对象发送者,EventArgs e)
{
            专辑专辑 = GetAlbum(comboBox1.SelectedIndex);
            照片照片 = GetPhoto(comboBox1.SelectedIndex, comboBox3.SelectedIndex);

            File.Delete("相册\\图片\\" + photo.STitle + foto.SExtention);

            photo.SExtention = lblExtention.Text;
            photo.STitle = txtPhotoTitel.Text;
            Photo.SPath = txtPath.Text;

            File.Copy(photo.SPath, "Albums\\Images\\" + photo.STitle + photo.SExtention);

}

谢谢, 文森特


感谢大家的帮助。

我用过这个,现在效果很好


您的进程是使用文件的进程,您需要将 image 设置为 null 使用类似这样的东西:

var img = Image.FromFile(foto.SPath).GetThumbnailImage(GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)), GetfHeight(photo.SPath, 150), null, new IntPtr());

pctrbFoto.Image = img;

img = null;

GC.Collect();

【问题讨论】:

    标签: c# error-handling


    【解决方案1】:

    我要查看的第一个区域是您的 GetPhoto 方法。您是否有尚未关闭的 StreamReader?确保如果您在删除之前对文件执行任何类型的 I/O,请先关闭这些连接。 GetPhoto() 方法有什么作用?

    【讨论】:

      【解决方案2】:

      您在哪里获取缩略图使用:

      using(Image img = Image.FromFile(foto.SPath))
      {
        pctrbPhoto. Image = img.GetThumbnailImage(
        GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)), 
        GetfHeight(photo.SPath, 150), null, new IntPtr()); 
      }
      

      而是确保源图像在您完成后被释放(关闭)。

      按照你的方式,从文件加载的图像会一直存在,直到垃圾收集器决定释放它,这可能需要一段时间。

      使用 FromFile 加载的图像保存它们从打开时加载的文件。

      【讨论】:

        【解决方案3】:

        首先,您需要确定是您的应用程序还是打开了文件的其他应用程序。

        您可以使用 Mark Russinovich 的 Process Explorer 查看打开特定文件或目录的程序。它是 Windows Sysinternals 系列优秀实用程序的一部分,每个程序员/IT 专业人员都应该使用(或至少知道)。

        您可以在这里获取:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

        【讨论】:

        • 我同意。但我没有看到显示程序正在使用的文件的选项。
        【解决方案4】:

        您的进程是使用文件的进程,您需要将 image 设置为 null 使用这样的东西:

        using(var img = Image.FromFile(foto.SPath).GetThumbnailImage(GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)), GetfHeight(photo.SPath, 150), null, new IntPtr()))
          pctrbFoto.Image = img;
        

        【讨论】:

        【解决方案5】:

        当您在comboBox3_SelectedIndexChanged 中调用Image.FromFile 时,可能还会在其他地方调用Image 对象。因此,您的程序正在使用该文件。

        每次打开图像时都需要 Dispose。

        【讨论】:

          【解决方案6】:

          当所有其他方法都失败时,您可以使用MoveFileEx 在下次重新启动时删除该文件。

          【讨论】:

            【解决方案7】:

            您可以使用 Unlocker 程序告诉您哪些程序已锁定文件

            注意:已删除 Unlocker 程序的链接 - 包含恶意软件。

            【讨论】:

            【解决方案8】:

            ...但是,如果您的应用程序在网络托管计划上运行?您不能在共享服务器中运行任何软件。

            我尝试过使用 dispose() 和其他选项,但我无法删除像 Vinzcent 这样的文件。

            马尔迪托 IIS :@

            【讨论】:

              【解决方案9】:

              尝试从同一软件删除/修改以前保存的文件时会出现此问题。 我通过添加以下代码解决了它:

              System.GC.Collect(); 
              System.GC.WaitForPendingFinalizers();
              
              
              File.Delete(MyFile);
              

              【讨论】:

                【解决方案10】:

                我曾经使用过类似 thestarSadegh 的帖子 但在某些情况下它没有工作/帮助所以我找到了一个不同的解决方案 我已经发了here

                代码还是在这里(看了链接和问题后你可能会更好地理解它):

                   var imageAsByteArray = File.ReadAllBytes(imagePath);
                
                   // I use as example a pictureBox:
                   pictureBox1.Image = byteArrayToImage(imageAsByteArray);
                
                   // Or/and safe/copy/replace it:
                   File.WriteAllBytes(picture_Path, imageAsByteArray);
                

                您也可以立即删除(新)图片! (如果你愿意)

                【讨论】:

                • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效
                • Ty 表示双重提示呵呵 :)
                猜你喜欢
                • 2014-05-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-04-13
                • 1970-01-01
                相关资源
                最近更新 更多