文件未被释放,即使使用 .Dispose()

Files not being released, even with .Dispose()

我有一个简单的 C# 应用程序,用于重命名和调整图像大小,但我有一个小问题 - 当它完成对所有给定文件的处理后,最后一个总是保留在程序的内存或其他任何地方,并且不关闭程序无法删除

如何让我的代码在完成后始终释放它所处理的文件?

这是我的

     private void processFiles() {
        foreach (string oldFileNamePath in fileEntries) {
            ...
            File.Move(oldFileNamePath, newFileNamePath);
            if (isResizeImage) {
                if (!extension.Equals(".gif")) {
                    Image newImage = Image.FromFile(newFileNamePath);
                    int newWidth = (int) (newImage.Width * (1 + ((double) percentageSize / 100)));
                    int newHeight = (int) (newImage.Height * (1 + ((double) percentageSize / 100)));
                    newImage = ResizeImage(newFileNamePath, newWidth, newHeight);
                    newImage.Save(directory + RESIZED_DIRECTORY + "\" + newFileName, ImageFormat.Jpeg);
                    newImage.Dispose();
                } else {
                    // only move
                    File.Move(newFileNamePath, directory + RESIZED_DIRECTORY + "\" + newFileName);
                }
            }
        }
    }

    public static Bitmap ResizeImage(String path, int width, int height) {
        Image image = Image.FromFile(path);
        var destRect = new Rectangle(0, 0, width, height);
        var destImage = new Bitmap(width, height);
        destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
        using (var graphics = Graphics.FromImage(destImage)) {
            // process image
            using (var wrapMode = new ImageAttributes()) {
                wrapMode.SetWrapMode(WrapMode.TileFlipXY);
                graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
            }
        }
        image.Dispose();
        return destImage;
    }
}

原始的newImage没有暴露。您正在重新分配它并处理您从 ResizeImage 收到的新 imageNew。

删除以下内容:

Image newImage = Image.FromFile(newFileNamePath);

并将您的声明移至下一行。这行没有做任何事情,因为你在之后立即替换它并处理新的替换,而不是原来的。

OP编辑后:

你应该这样做:

Image newImage = Image.FromFile(newFileNamePath); 
int newWidth = (int) (newImage.Width * (1 + ((double) percentageSize / 100)));
int newHeight = (int) (newImage.Height * (1 + ((double) percentageSize / 100)));
newImage.Dispose();

Image anotherImage = ResizeImage(newFileNamePath, newWidth, newHeight))
anotherImage.Save(directory + RESIZED_DIRECTORY + "\" + newFileName, ImageFormat.Jpeg);
anotherImage.Dispose();

出于解释的目的,我确实省略了 using 的使用。但通常你应该这样做:

using (Image newImage = Image.FromFile(newFileNamePath))
{
    int newWidth = (int) (newImage.Width * (1 + ((double) percentageSize / 100)));
    int newHeight = (int) (newImage.Height * (1 + ((double) percentageSize / 100)));
    using (Image anotherImage = ResizeImage(newFileNamePath, newWidth, newHeight))
        anotherImage.Save(directory + RESIZED_DIRECTORY + "\" + newFileName, ImageFormat.Jpeg);
    }
}