Странная проблема с оболочкой extesnsions. Файл возвращается после удаления - PullRequest
0 голосов
/ 11 января 2012

У меня странная проблема. Я использую Windows API Code Pack для Microsoft .NET Framework для отображения пользовательских миниатюр для своих пользовательских расширений файлов. Я использовал методы пространства имен Microsoft.WindowsAPICodePack.ShellExtensions, как упомянуто в документации, и я могу успешно показать миниатюру. Но я столкнулся со странной проблемой. Пока обработчик миниатюр оболочки зарегистрирован, Я не могу удалить файл, для которого отображается миниатюра . Файл удаляется нормально для обычного удаления, но при использовании Shift + del файл исчезает из проводника форм без ошибок, но вернется, когда я обновлю папку . Файл будет оставаться там до тех пор, пока я не перезапущу процесс explorer.exe или если я фокусирую окно и жду 60 секунд, файл исчезает сам по себе. Возвращенный файл не позволяет удалить его снова, выдавая сообщение об отказе в доступе. Я попытался использовать LockHunter , и он показывает этот проводник. exe блокирует файл. Я в замешательстве, ребята. Что я делаю не так? , Как я могу это исправить?

Я использую 64-разрядную версию Windows 7, 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 Ответ

1 голос
/ 11 января 2012

Не видя код, это все, что я могу придумать:

Ваш пользовательский код миниатюры не закрывает поток для файла после того, как он создает миниатюру?

Как подсказал мой комментарийпопробуйте это:

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