0

我遇到了一个奇怪的问题。我正在使用Microsoft .NET Framework 的 Windows API 代码包来显示自定义文件扩展名的自定义缩略图。我使用Microsoft.WindowsAPICodePack.ShellExtensions了文档中提到的命名空间方法,并且可以成功显示缩略图。但是我遇到了一个奇怪的问题。虽然注册了外壳缩略图处理程序,但我无法删除显示缩略图的文件。正常删除该文件正常删除,但使用Shift+del时文件从资源管理器中消失,没有错误,但会当我刷新文件夹时返回.该文件将保留在那里,直到我重新启动 explorer.exe 进程,或者如果我聚焦窗口并等待 60 秒,该文件将自行消失。返回的文件不允许再次删除,给出拒绝访问错误消息。我试过了使用LockHunter ,它显示 explorer.exe 正在锁定文件。我很困惑伙计们。我做错了什么?我怎样才能解决这个问题?。

我正在使用 Windows 7 64 位,Visual Studio 2010

我的代码如下

namespace CustomThumbnail
{
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("CustomThumbnail.XYZThumbnailer")]
    [Guid("439a0bd3-8a44-401d-931c-3021ad8b1ad6")]
    [ThumbnailProvider("XYZThumbnailer", ".xyz", ThumbnailAdornment = ThumbnailAdornment.VideoSprockets)]
    public class MyThumbnailProvider : ThumbnailProvider, IThumbnailFromStream
    {
        public Bitmap ConstructBitmap(System.IO.Stream stream, int sideSize)
        {
            try
            {
                LogMessageToFile("Hello Stream");


                XyzFileDefinition file = new XyzFileDefinition(stream);

                using (MemoryStream mstream = new MemoryStream(Convert.FromBase64String(file.EncodedImage)))
                {
                    LogMessageToFile("using Stream");
                    Bitmap bmp = new Bitmap(mstream);
                    LogMessageToFile(bmp.ToString());
                    return bmp;
                }
            }
            catch (Exception ex)
            {
                LogMessageToFile(ex.ToString());
                throw;
            }

        }

        public void LogMessageToFile(string msg)
        {
            System.IO.StreamWriter sw = System.IO.File.AppendText(@"D:\test\testdoc.txt");
            try
            {
                string logLine = System.String.Format(
                    "{0:G}: {1}.", System.DateTime.Now, msg);
                sw.WriteLine(logLine);
            }
            finally
            {
                sw.Close();
            }
        }
    }
}

新代码

  public Bitmap ConstructBitmap(Stream stream, int sideSize)
    {
        try
        {
            Assembly assembly = Assembly.LoadFile(@"C:\Users\xxxx\Documents\Visual Studio 2010\Projects\MyThumbnailTest\Bin\Data\Data.dll");
            Type type = assembly.GetType("Data.ThumbnailData");


            MethodInfo foo = type.GetMethod("GetThumbnail");
           var c= foo.Invoke(Activator.CreateInstance(type), new object[] { stream });

            return (Bitmap)c;
        }
        catch (Exception ex)
        {
            LogMessageToFile("error "+ex.Message.ToString());
            throw ex;
        }
        finally
        {
            stream.Close();
            stream.Dispose();
        }

    }

我的 GetThumbnail 方法是这样的

 public class ThumbnailData
    {
        public Bitmap GetThumbnail(Stream stream)
        {
            using (ZipFile zip = ZipFile.Read(stream))
            {
                ZipEntry image = zip.Entries.Where(p => p.FileName.ToLower().IndexOf(".png") > 0).FirstOrDefault();
                if (image != null)
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        image.Extract(ms);
                        Bitmap bmp = new Bitmap(ms);
                        return bmp;
                    }
                }
                return new Bitmap(150, 150);
            }
        }
    }
4

1 回答 1

1

没有看到代码,我能想到的只有这些:

您的自定义缩略图代码是否在生成缩略图后没有关闭文件的流?

正如我的评论所建议的那样试试这个:

  public Bitmap ConstructBitmap(System.IO.Stream stream, int sideSize)
    {
        try
        {
            LogMessageToFile("Hello Stream");


            XyzFileDefinition file = new XyzFileDefinition(stream);

            using (MemoryStream mstream = new MemoryStream(Convert.FromBase64String(file.EncodedImage)))
            {
                LogMessageToFile("using Stream");
                Bitmap bmp = new Bitmap(mstream);
                LogMessageToFile(bmp.ToString());
                return bmp;
            }
        }
        catch (Exception ex)
        {
            LogMessageToFile(ex.ToString());
            throw;
        }
        finally 
        {
            stream.Close();
        }
    }
于 2012-01-11T07:06:58.277 回答