今天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 中怎樣程式設計來實現它--
functionistextfile(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伺服器...