在网上查了好多资料,大部分都是通过将文件读成二进制流,取前两个字节判断,比如.jpg的是255216.代码如下:

/// <summary>
/// Checks the file is textfile or not.
/// </summary>
/// <param name="fileName">Name of the file.</param>
/// <returns></returns>
public static FileExtension CheckTextFile(string fileName)
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
string fileType = string.Empty; ;
try
{
byte data = br.ReadByte();
fileType += data.ToString();
data = br.ReadByte();
fileType += data.ToString();
FileExtension extension;
try
{
extension = (FileExtension)Enum.Parse(typeof(FileExtension), fileType);
}
catch
{

extension=FileExtension.VALIDFILE
}
return extension;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null)
{
fs.Close();
br.Close();
}
}
}
}
public enum FileExtension
{
JPG = 255216,
GIF = 7173,
PNG = 13780,
SWF = 6787,
RAR = 8297,
ZIP = 8075,
_7Z = 55122,
VALIDFILE=9999999
// 255216 jpg;

// 7173 gif;

// 6677 bmp,

// 13780 png;

// 6787 swf

// 7790 exe dll,

// 8297 rar

// 8075 zip

// 55122 7z

// 6063 xml

// 6033 html

// 239187 aspx

// 117115 cs

// 119105 js

// 102100 txt

// 255254 sql

}

经过测试,可以很好的判断.jpg、.gif格式的文件,然而对于.txt文件却不是102100,每个.txt返回的值也不一样。显然,这个方法不能满足我的需要。

后来看到一个delphi写的,这里有一个很简单的方法:把给定的那个文件看作是无类型的二进制文件,然后顺序地读出这个文件的每一个字节,如果文件里有一个字节的值等于0,那么这个文件就不是文本文件;反之,如果这个文件中没有一个字节的值是0的话,就可以判定这个文件是文本文件了。这是原理,下面看看在Delphi 中怎样编程来实现它--
     采集

function IsTextFile(FileName:string):boolean;
var
Fs:TFileStream;
i,size:integer;
IsTextFile:boolean;
ByteData:Byte;
begin
if FileExists(FileName) then
begin
Fs:=TFileStream.Create(FileName,fmOpenRead);
IsTextFile:=true;
i:=0
size:=Fs.Size;
While (i<size) and IsTextFile do
begin
Fs.Read(ByteData,1);
IsTextFile:=ByteData<>0
inc(i)
end
Fs.Free;
Result:=IsTextFile
end
else
Result:=false
end;

我把它翻译成C#代码后是这样的:

/// <summary>
/// Checks the file is textfile or not.
/// </summary>
/// <param name="fileName">Name of the file.</param>
/// <returns></returns>
public static bool CheckIsTextFile(string fileName)
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
bool isTextFile=true;
try
{
int i = 0;
int length = (int)fs.Length;
byte data;
while (i < length && isTextFile)
{
data = (byte)fs.ReadByte();
isTextFile = (data != 0);
i++;
}
return isTextFile;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null)
{
fs.Close();
}
}
}

后来经过测试,满足了我的需求。

附测试代码:

bool isTextFile = Utility.CheckIsTextFile(this.openFile.FileName);
if (isTextFile)
{
this.richTxtContent.AppendText(openFile.FileName + "是文本文件");
}
else
{
this.richTxtContent.AppendText(openFile.FileName + "不是文本文件!");
}

C# 判断文件是否文本文件的更多相关文章

  1. 使用feof()函数判断文件是否结束

    课本上时这样写的:(用putchar(ch);代表对取出来的字符的处理.) while(!feof(fp)) { ch=fgetc(fp); putchar(ch); } 但是,这样写的话,fgetc ...

  2. centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课

    centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法  shell中的逻辑判断  if 判断文件.目录属性  shell数组简单用法 $( ) 和$ ...

  3. perl判断文件是否存在 perl -e

    perl 有很多的命令  其中有  -e   是判断文件和目录是否存在 代码如下: #!/usr/bin/perl $fileExist = -e "/var/log/messages&qu ...

  4. 2019-9-2-C#判断文件属于文本或二进制

    title author date CreateTime categories C#判断文件属于文本或二进制 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 1 ...

  5. C语言中如何判断文件是否存在

    方法一:access函数判断文件夹或者文件是否存在 函数原型: int access(const char *filename, int mode); 所属头文件:io.h filename:可以填写 ...

  6. JavaScript根据文件名判断文件类型

    //JavaScript根据文件名判断文件类型 var imgExt = new Array(".png",".jpg",".jpeg",& ...

  7. PHP判断文件或者目录是否可写

    在PHP中,可用is_writable()函数来判断一个 文件/目录 是否可写,详情如下: 参考 is_writable (PHP 4, PHP 5) is_writable — 判断给定的文件名是否 ...

  8. python os 命令,及判断文件夹是否存在

    使用前 import os导入模块   os模块: os.sep     可以取代操作系统特定的路径分割符 os.linesep  字符串给出当前平台使用的行终止符.例如,Windows使用'\r\n ...

  9. C# 判断文件有没占用

    C# 判断文件有没占用 using System; using System.Collections.Generic; using System.Text; using System.Runtime. ...

随机推荐

  1. jQuery中的常用内容总结(二)

    jQuery中的常用内容总结(二) 转载请注明地址: http://www.cnblogs.com/funnyzpc/p/7571993.html 前言 距离上次博客更新已经有二十来天了(●′ω`●) ...

  2. 【DP】捡苹果

    #include<stdio.h> int max(int a,int b) { int c; if(a>b) c=a; else c=b; return c; } int main ...

  3. Java历程-初学篇 Day07 循环结构2 for循环

    一,格式 for(赋值语句//为循环变量赋初值;条件语句//循环结构的循环条件;赋值语句//迭代,修改循环变量的值){ //循环体; } 二,简单举例 for(int i=1;i<=10;i++ ...

  4. Python实战之双向队列deque/queue学习笔记及简单练习

    ['__add__', '__bool__', '__class__', '__contains__', '__copy__', '__delattr__', '__delitem__', '__di ...

  5. HDU1085 多重背包

    Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

  6. Linq常见操作示例

    static void DeferredQuery() { var names = new List<string> { "Nino", "Alberto&q ...

  7. ICommand.CanExecuteChanged事件订阅对象的变化

    public class DelegateCommand : ICommand { Func<object, bool> canExecute; Action<object> ...

  8. WPF DataGrid 样式设置

    隔行换色,鼠标单击,悬浮样式都有,其具体效果如图 1 所示. 图 1 WPF DataGrid 样式设置效果图 其中: 界面设计代码下所示 ? + 查看代码 1 2 3 4 5 6 7 8 9 10 ...

  9. python使用装饰器@函数式化django开发

    django是一个python web开发的框架.作为一个框架MVC的架构已经实现起来了.但是编码的时候你经常要进行进一步的抽象. AOP是一种称为面向切面的开发思想,意思是将部分功能代码在运行时动态 ...

  10. 【转载】jQuery全屏滚动插件fullPage.js

    文章转载自dowebok http://www.dowebok.com/ 原文链接:http://www.dowebok.com/77.html 简介 如今我们经常能见到全屏网站,尤其是国外网站.这些 ...