C 判斷檔案是否文字檔案

2022-02-24 14:02:19 字數 2059 閱讀 3822

今天fix bugs時,碰到乙個關於上傳檔案格式的問題。系統要求上傳.txt,.csv格式的,這個可以根據檔案字尾名來過濾。但是如果使用者修改了字尾名來欺騙系統的話又該怎麼解決?比如a.jpg格式的改成a.txt,我現在的程式就無法識別了,雖然在後台可以彈出錯誤,但這個錯誤已經不是fs上定義的錯誤了。

怎麼解決呢?

在網上查了好多資料,大部分都是通過將檔案讀成二進位製流,取前兩個位元組判斷,比如.jpg的是255216.**如下:

//////

checks the file is textfile or not.

//////

name of the file.

///public

static

fileextension checktextfile(

string

filename)

catch

return

extension;

}catch

(exception ex)

finally}}

}public

enum

fileextension

經過測試,可以很好的判斷.jpg、.gif格式的檔案,然而對於.txt檔案卻不是102100,每個.txt返回的值也不一樣。顯然,這個方法不能滿足我的需要。

後來看到乙個delphi寫的,這裡有乙個很簡單的方法:把給定的那個檔案看作是無型別的二進位制檔案,然後順序地讀出這個檔案的每乙個位元組,如果檔案裡有乙個位元組的值等於0,那麼這個檔案就不是文字檔案;反之,如果這個檔案中沒有乙個位元組的值是0的話,就可以判定這個檔案是文字檔案了。這是原理,下面看看在delphi 中怎樣程式設計來實現它--

function

istextfile(filename:

string

):boolean;

varfs:tfilestream;

i,size:integer;

istextfile:boolean;

bytedata:byte;

begin

iffileexists(filename)

then

begin

fs:=

tfilestream.create(filename,fmopenread);

istextfile:

=true; i:=

0; size:

=fs.size;

while (i

<

size)

andistextfile

dobegin

fs.read(bytedata,

1);

istextfile:

=bytedata

<>0;

inc(i)

end;

fs.free;

result:

=istextfile

endelse

result:

=false

end;

我把它翻譯成c#**後是這樣的:

//////

checks the file is textfile or not.

//////

name of the file.

///public

static

bool

checkistextfile(

string

filename)

return

istextfile;

}catch

(exception ex)

finally}}

後來經過測試,滿足了我的需求。

附測試**:

bool istextfile 

=utility.checkistextfile(this.openfile.filename);

if(istextfile)

else

判斷文字檔案是否UTF 8編碼

utf 8編碼的文字文件,有的帶有bom byte order mark,位元組序標誌 即0xef,0xbb,0xbf,有的沒有。用windows的notepad編輯的文字儲存是會自動新增bom,我們常用ue編輯器在儲存utf 8編碼的時候也會自動新增bom,notepad 預設設定中儲存utf 8...

Delphi中判斷檔案是否為文字檔案的函式

在自己編寫文字檔案讀取函式的時候,你首先會遇到的第乙個問題就是 對於給定的乙個檔名,怎麼知道它所代表磁碟檔案的確是文字檔案?這裡有乙個很簡單的方法 把給定的那個檔案看作是無型別的二進位制檔案,然後順序地讀出這個檔案的每乙個位元組,如果檔案裡有乙個位元組的值等於0,那麼這個檔案就不是文字檔案 反之,如...

C 處理文字檔案

文字檔案是一種常用的檔案格式,所以如何處理文字檔案也就成為程式設計的乙個重點。本文就來 一下用c 是如何來處理文字檔案。其內容重點就是如何讀取文字檔案內容 如何改變文字檔案的內容,以及如何用c 來實現對讀取後的文字檔案的列印預覽和列印。一 本文程式設計和執行的軟體環境 1 微軟公司視窗2000伺服器...