shell 扩展的奇怪问题。删除后文件返回

发布于 2024-12-26 06:01:09 字数 3769 浏览 2 评论 0原文

我遇到了一个奇怪的问题。我正在使用 Windows API Code Pack for Microsoft .NET Framework显示自定义文件扩展名的自定义缩略图。我已使用文档中提到的 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);
            }
        }
    }

I am having a strange problem.I am using the Windows API Code Pack for Microsoft .NET Framework for displaying custom thumbnails for my custom file extensions.I have used the Microsoft.WindowsAPICodePack.ShellExtensions namespace methods as mentioned in the documentation and I can successfully show a thumbnail.But i am encountering a strange problem.While the shell thumbnail handler is registered, I cannot delete the file for which the thumbnail is shown.The file gets deleted alright for normal delete but while using Shift+del the file disappears form explorer without errors but will return when i refresh the folder.The file will stay there until I restart explorer.exe process or if I focus the window and wait for 60secs the file disappears on its own.The returned file doesn't allow to get deleted again giving an access denied error message.I tried using LockHunter and it shows that explorer.exe is locking the file.I am confused guys.What am I doing wrong ?. How can I fix this?.

I am using Windows 7 64 bit,visual studio 2010

My code is as follows

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();
            }
        }
    }
}

New Code

  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();
        }

    }

And my GetThumbnail Method goes like this

 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);
            }
        }
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

娇妻 2025-01-02 06:01:09

在没有看到代码的情况下,这就是我能想到的:

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

正如我的评论建议尝试这个:

  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();
        }
    }

Without seeing the code, this is all I can think of:

Is your custom thumbnail code not closing the Stream for the file after it produces the thumbnail?

As my comment suggested try this:

  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();
        }
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文