У меня странная проблема. Я использую 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);
}
}
}