Странная проблема с оболочкой extesnsions. Файл возвращается после удаления

У меня странная проблема. Я использую Windows API Code Pack для Microsoft .NET Framework для отображения пользовательских миниатюр для своих пользовательских расширений файлов. Я использовал Microsoft.WindowsAPICodePack.ShellExtensions Методы пространства имен, как упомянуто в документации, и я могу успешно отобразить миниатюру. Но я столкнулся со странной проблемой. Пока зарегистрирован обработчик миниатюр оболочки, я не могу удалить файл, для которого отображается миниатюра. Файл удаляется нормально для обычного удалить, но при использовании Shift+del файл исчезает из проводника форм без ошибок, но возвращается, когда я обновляю папку. Файл будет оставаться там до тех пор, пока я не перезапущу процесс explorer.exe или если я сфокусируюсь на окне и подожду 60 секунд, файл исчезнет с own.The возвращенный файл не позволяет удалить снова, выдавая сообщение об отказе в доступе. Я попытался использовать 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);
            }
        }
    }

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();
        }
    }
Другие вопросы по тегам