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 に答える