【问题标题】:Check if file is a media file in C#检查文件是否是 C# 中的媒体文件
【发布时间】:2009-12-29 16:19:29
【问题描述】:

我需要一种可以告诉我文件是图像、音频还是视频文件的方法。我可以用 C# 做到这一点吗?

【问题讨论】:

  • 澄清点 - 您想知道它是否属于 any 类别(“是媒体文件”),还是 which 类别它属于(“是图像/是音频/是视频”)?
  • 其实没什么区别。
  • @SLaks:正确,这几乎只是语义,但解决方案需要比仅仅扩展集合更智能一些。它必须将该扩展映射到一些更高层次的含义。

标签: c#


【解决方案1】:

这取决于您希望它有多强大。

最简单的方法是检查扩展名,如下所示:

static string[] mediaExtensions = {
    ".PNG", ".JPG", ".JPEG", ".BMP", ".GIF", //etc
    ".WAV", ".MID", ".MIDI", ".WMA", ".MP3", ".OGG", ".RMA", //etc
    ".AVI", ".MP4", ".DIVX", ".WMV", //etc
};

static bool IsMediaFile(string path) {
    return -1 != Array.IndexOf(mediaExtensions, Path.GetExtension(path).ToUpperInvariant());
}

编辑:对于那些真正想要 LINQ 的人,这里是:

return mediaExtensions.Contains(Path.GetExtension(path), StringComparer.OrdinalIgnoreCase);

请注意,文件的扩展名并不是其内容的可靠指标;任何人都可以重命名文件并更改其扩展名。

如果您没有扩展名,或者您不信任它,您可以读取文件的开头并查看它是否与常见媒体格式的文件签名匹配。

【讨论】:

  • 也许人们不喜欢字符串数组?或者也许你可以使用 Contains ?我赞成..
  • Array 没有 Contains 方法。 (通过 LINQ 除外)
  • mediaExtensions.Contains ...是的,通过LINQ ..我不知道为什么有人不赞成,我只是在抛出想法。就像我说的,我投了赞成票。
  • 很高兴看到 LINQ 解决方案
  • 这可能是一个不错的第一次检查,直到你得到将 mov 编码为 avi 或 ogg 为 avi 等的 skmonone,检查文件头,例如探测并选择可能为文件数据提供服务的实现
【解决方案2】:

方法 1: 最简单 - 文件名解析。如果文件名匹配已知的媒体文件类型列表(即 jpg gif wmv avi mp4 等),则它匹配视频、音频或图像文件。这不是那么健壮,因为我可以很容易地用扩展名 .avi 或 .jpg 命名一个文本文件,但这并不一定使它成为一个媒体文件。

方法 2: 更难 - 解析文件头。例如,在 CodeProject 有一个 C# RIFF ParserExtracting IPTC header information from JPEG images 上的这篇 CodeProject 文章

您最终将不得不同时使用这两种方法。您所询问的大部分内容已内置于 .NET 框架中。

【讨论】:

  • 方法2的另一个问题是你必须为每种文件类型都有一个解析器,而其他文件类型在你实现它们的解析器之前不会被识别......
【解决方案3】:

是的,您可以,但除非您使用组件来执行此操作,否则您需要编写代码以至少加载这些文件的标头,以检查它们是否未损坏。如果文件以可靠的方式存储,您可能只需检查其文件扩展名

foreach(string file in Directory.GetFiles("c:\\MyDir\\")
{
   if(file.EndsWith("jpg", false, null))
      //treat as image file
   else if(file.EndsWith("avi", false, null))
      //treats as avi video
   //and so on
}

【讨论】:

  • 我认为解释为什么投反对票应该是一个好习惯。如果预期的是一个简单的幼稚实现,那么答案很简单。但是,如果有人更改了您文件的扩展名并弄乱了他们的名字怎么办?你相信圣诞老人爪吗?
  • 我没有投反对票。但对于初学者来说,并不是每个扩展都是小写的,想象一下这种巨大的 if 语句必须是捕获所有媒体类型..
  • 好的,这就是 EndsWith 有第二个参数告诉忽略字符大小写的原因。现在我认为其他答案也应该被否决,因为它们的含义与我的相似
  • 显然他们都被否决了(基于 cmets),尽管每个人基本上都说了同样的话并且都是正确的。也许有人不想听到给出的答案?
【解决方案4】:

此代码验证文件是否为媒体文件。 mediaExtensions 一组众所周知的媒体文件扩展名。 path.Substringpath.IndexOf 方法的组合提取文件扩展名。然后Array.IndexOf 告诉提取的扩展是否匹配mediaExtensions 数组的任何元素。如果不是,Array.IndexOf 返回-1(未找到),导致IsMediaFile 返回false。否则,Array.IndexOf 返回匹配扩展的数组索引,表示找到媒体文件扩展名,IsMediaFile 返回true

Private Shared Function IsMediaFile(ByVal path As String) As Boolean
    Try
        Dim mediaExtensions As String() = {".PNG", ".JPG", ".JPEG", ".BMP", ".GIF", ".WAV", ".MID", ".MIDI", ".WMA", ".MP3", ".OGG", ".RMA", ".AVI", ".MP4", ".DIVX", ".WMV"}
        Return -1 <> Array.IndexOf(mediaExtensions, path.Substring(path.IndexOf("."), path.Length - path.IndexOf(".")).ToUpper)
    Catch ex As Exception
        Throw ex
    End Try
End Function

【讨论】:

  • 在 vb 中完美运行
  • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。
【解决方案5】:

您可以随时检查文件扩展名。

【讨论】:

  • 为什么这被否决了?尽管缺少代码示例,但这是一个完全可以接受的答案。
  • @Thomas:分数表明这是一个极端情况,这似乎是有效的:Any answer that gets the asker going in the right direction is helpful, but do try to mention any limitations, assumptions or simplifications in your answer. Brevity is acceptable, but fuller explanations are better.stackoverflow.com/help/how-to-answer
猜你喜欢
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
相关资源
最近更新 更多