1

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

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

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

4

3 回答 3

2

为什么不使用Directory.GetFiles()只得到你想要的?此代码将返回所有.jpg文件.jpeg

Directory.GetFiles("Content/img/", ".jp?g");
于 2013-06-28T22:24:43.593 回答
1

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

//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();

获得具有正确扩展名的文件列表后,您可以使用此答案.jpg中提到的两种不同方法中的一种来检查文件是否实际上是 JPEG(而不是仅仅被重命名) 。(来自那个帖子)

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;
    }
}

或者更准确但更慢的方法

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;
    }
}

如果您的 JPEG 文件有可能没有正确的扩展名,那么您必须遍历目录中的所有文件(*.*用作过滤器)并对其执行上述两种方法之一。

于 2013-06-28T22:45:00.100 回答
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
    }
}
于 2013-06-29T03:50:25.770 回答