测试以查看文件夹中的每个文件是否为jpeg

时间:2013-06-28 22:20:01

标签: c# file-io jpeg

我想拥有执行以下操作的代码:

foreach(File in Directory)
{
  test to see if the file is a jpeg
}

但我不熟悉如何从文件中读取。我该怎么做?

3 个答案:

答案 0 :(得分:2)

为什么不使用Directory.GetFiles()来获取您想要的?此代码将返回所有.jpg.jpeg个文件。

Directory.GetFiles("Content/img/", ".jp?g");

答案 1 :(得分:1)

如果您的目标是.NET 4 Directory.EnumerateFiles可能更有效,尤其是对于较大的目录。如果没有,您可以将EnumerateFiles替换为GetFiles以下。

//add all the extensions you want to filter to this array
string[] ext = { "*.jpg", "*.jpeg", "*.jiff"  };
var fPaths = ext.SelectMany(e => Directory.EnumerateFiles(myDir, e, SearchOption.AllDirectories)).ToList();

一旦你有一个具有正确扩展名的文件列表,你可以通过使用{{{{{{{{{{{{{{ 3}}。 (从那篇文章)

.jpg

或者更准确但更慢的方法

static bool HasJpegHeader(string filename)
{
    using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open)))
    {
        UInt16 soi = br.ReadUInt16();  // Start of Image (SOI) marker (FFD8)
        UInt16 jfif = br.ReadUInt16(); // JFIF marker (FFE0)

        return soi == 0xd8ff && jfif == 0xe0ff;
    }
}

如果您的JPEG文件可能没有正确的扩展名,那么您必须遍历目录中的所有文件(使用static bool IsJpegImage(string filename) { try { 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; } } 作为过滤器)并执行其中一个以上方法。

答案 2 :(得分:1)

如果您只想知道哪些文件具有jpeg扩展名,我会这样做:

HashSet<string> JpegExtensions = 
    new HashSet<string>(StringComparer.InvariantCultureIgnoreCase)
        { ".jpg", ".jpe", ".jpeg", ".jfi", ".jfif" }; // add others as necessary

foreach(var fname in Directory.EnumerateFiles(pathname))
{
    if (JpegExtensions.Contains(Path.GetExtension(fname))
    {
        Console.WriteLine(fname); // do something with the file
    }
}