Я думаю, что вам лучше всего связать свойство IsVisible каждого элемента управления в строке с одним свойством в вашей модели представления. Затем все, что вам нужно сделать, это изменить значение свойства модели представления на false
, и вся строка будет скрыта.
Несколько вариантов:
Вы можете проверить расширение файла:
static bool HasJpegExtension(string filename)
{
// add other possible extensions here
return Path.GetExtension(filename).Equals(".jpg", StringComparison.InvariantCultureIgnoreCase)
|| Path.GetExtension(filename).Equals(".jpeg", StringComparison.InvariantCultureIgnoreCase);
}
или проверить правильное магическое число в заголовке файла:
static bool HasJpegHeader(string filename)
{
using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open, FileAccess.Read)))
{
UInt16 soi = br.ReadUInt16(); // Start of Image (SOI) marker (FFD8)
UInt16 marker = br.ReadUInt16(); // JFIF marker (FFE0) or EXIF marker(FFE1)
return soi == 0xd8ff && (marker & 0xe0ff) == 0xe0ff;
}
}
Другой вариант - загрузить изображение и проверить правильность тип. Однако это менее эффективно (если вы все равно не собираетесь загружать изображение), но, вероятно, даст вам наиболее надежный результат (учитывайте дополнительные затраты на загрузку и распаковку, а также возможную обработку исключений):
static bool IsJpegImage(string filename)
{
try
{
using (System.Drawing.Image img = System.Drawing.Image.FromFile(filename))
{
// Two image formats can be compared using the Equals method
// See http://msdn.microsoft.com/en-us/library/system.drawing.imaging.imageformat.aspx
//
return img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
catch (OutOfMemoryException)
{
// Image.FromFile throws an OutOfMemoryException
// if the file does not have a valid image format or
// GDI+ does not support the pixel format of the file.
//
return false;
}
}
Лучше всего попытаться создать из него изображение с помощью конструктора Drawing.Bitmap (string) и посмотреть, он не может этого сделать или выдает исключение. Проблема с некоторыми ответами заключается в следующем: во-первых, расширение является произвольным, это может быть jpg, jpeg, jpe, bob, tim, что угодно. Во-вторых, просто использовать заголовок недостаточно для 100% уверенности. Он может определенно определить, что файл не является JPEG, но не может гарантировать, что файл является JPEG, произвольный двоичный файл может иметь одинаковую последовательность байтов в начале.
Проверка расширения файла недостаточна, поскольку имя файла может быть ложным.
Быстрый и грязный способ - попытаться загрузить изображение с помощью класса Image и перехватить любые исключения:
Image image = Image.FromFile(@"c:\temp\test.jpg");
Это не идеально, как вы могли бы получить любое исключение, такое как OutOfMemoryException, FileNotFoundException и т. д. и т. д.
Наиболее тщательный способ - обработать файл как двоичный файл и убедиться, что заголовок соответствует формату JPG. Я уверен, что это где-то описано.
Это будет циклически проходить через каждый файл в текущем каталоге и выводить, если найденные файлы с расширением JPG или JPEG имеют формат Jpeg. images.
foreach (FileInfo f in new DirectoryInfo(".").GetFiles())
{
if (f.Extension.ToUpperInvariant() == ".JPG"
|| f.Extension.ToUpperInvariant() == ".JPEG")
{
Image image = Image.FromFile(f.FullName);
if (image.RawFormat == ImageFormat.Jpeg)
{
Console.WriteLine(f.FullName + " is a Jpeg image");
}
}
}
В зависимости от контекста, в котором вы ' При просмотре этого файла вам нужно помнить, что вы не можете открыть файл, пока пользователь не скажет вам открыть его.
(Ссылка на запись в блоге Рэймонда Чена.)
Код здесь:
http://mark.michaelis.net/Blog/RetrievingMetaDataFromJPEGFilesUsingC.aspx
Показывает, как получить метаданные. Я полагаю, это приведет к исключению, если ваше изображение не будет правильным JPEG.
Получив расширение, вы можете использовать регулярное выражение для его проверки.
^.*\.(jpg|JPG)$
Прочитать байты заголовка. Эта статья содержит информацию о нескольких распространенных форматах изображений, включая JPEG:
Использование заголовков файлов изображений для проверки формата изображений
Вы можете найти документацию по формату файла jpeg, в частности информацию заголовка. Затем попробуйте прочитать эту информацию из файла и сравнить ее с ожидаемыми байтами заголовка jpeg.
Вы можете попробовать загрузить файл в изображение и затем проверить формат
Image img = Image.FromFile(filePath);
bool isBitmap = img.RawFormat.Equals(ImageFormat.Jpeg);
. Вы можете открыть файл и проверить заголовок, чтобы получить тип
Откройте файл в виде потока и найдите магическое число для JPEG.
Файлы изображений JPEG начинаются с FF D8 и конец с FF D9. Файлы JPEG / JFIF содержит код ASCII для 'JFIF' (4A 46 49 46) как завершенная нулем строка. Файлы JPEG / Exif содержат код ASCII для «Exif» (45 78 69 66) также как строка с нулевым символом в конце