private static ImageSource GetFileIcon(string fileName) { // if file does not exist, create a temp file with the same file extension var isTemp = false; if (!File.Exists(fileName) && !Directory.Exists(fileName)) { isTemp = true; fileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + Path.GetExtension(fileName)); File.WriteAllText(fileName, string.Empty); } var shinfo = new Natives.SHFILEINFO(); var flags = Natives.SHGFI_SYSICONINDEX; if (fileName.IndexOf(":", StringComparison.Ordinal) == -1) { flags = flags | Natives.SHGFI_USEFILEATTRIBUTES; } flags = flags | Natives.SHGFI_ICON | Natives.SHGFI_SMALLICON; Natives.SHGetFileInfo(fileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), flags); var icon = Icon.FromHandle(shinfo.hIcon); var bitmap = icon.ToBitmap(); var hBitmap = bitmap.GetHbitmap(); try { return(Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions())); } finally { Natives.DeleteObject(hBitmap); if (isTemp) { File.Delete(fileName); } } }