掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
中身がテキストのファイルを文字列検索するには? (ID:63834)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
私もテキストファイルかバイナリファイルの判定はよく処理します。 そこで、普段利用している判定用の関数をご紹介します。参考にしてね。 なお、ファイルの先頭 1024 バイトだけで判定しています。 /* このファイルで使用する関数 */ #define MacroLoadFile(s,a) CreateFile((LPCTSTR)(s),(GENERIC_READ|GENERIC_WRITE),(FILE_SHARE_READ|FILE_SHARE_WRITE),NULL,OPEN_EXISTING,a,NULL) /* このファイルで使用する定数 */ #define BEL (0x07) #define BS (0x08) #define ESC (0x1B) /* バイナリ・ファイルの判別関数 */ extern BOOL CheckBinFile( LPCTSTR lpBuff, DWORD dwSize ) { DWORD dwData; for ( dwData = 0 ; dwSize != 0 ; dwSize--, lpBuff++ ){ if ( iscntrl(*lpBuff) && !isspace(*lpBuff) ){ if ( (*lpBuff != BS) && (*lpBuff != BEL) && (*lpBuff != ESC) ){ dwData++; } } } return( dwData ? TRUE : FALSE ); } /* ●引数/戻り値 ①lpBuff には、判定するデータ領域を指定する。 ②dwSize には、判定するデータ容量を指定する。 ③戻り値は、バイナリ・ファイルなら TRUE を、そうでなければ FALSE を返す。 ※制御文字の範囲で、空白文字と BS / BEL / ESC 文字以外ならバイナリと判定する。 ※空白文字とは、TAB LF VT FF CR の 5 つです(^I ^J ^K ^L ^M) ※BS 文字とは、0x08 のバックスペースです。 ※BEL 文字とは、0x07 のベルコードです。 ※ESC 文字とは、0x1B のエスケープシーケンスです。 ※BS / BEL / ESC 文字があってもバイナリとは判定しないのは、バッチファイルで よく利用されるためです。それ以外は、バイナリファイルの可能性が高いです。 */ /* ファイル・データの種類をチェック */ extern INT FileCheck( LPCTSTR lpFname, DWORD dwAttrib ) { INT nSuccess = 0; TCHAR szBuff[ 1024 ]; ←先頭 1024 バイトで判断(可変可能) DWORD dwSize; HANDLE hFile; if ( (hFile = MacroLoadFile(lpFname,dwAttrib)) != INVALID_HANDLE_VALUE ){ if ( (dwSize = GetFileSize(hFile,NULL)) > sizeof(szBuff) ){ dwSize = sizeof( szBuff ); } if ( ReadFile(hFile,szBuff,dwSize,&dwSize,NULL) != FALSE ){ if ( CheckBinFile(szBuff,dwSize) ){ nSuccess = -1; // バイナリファイル } else{ nSuccess = +1; // テキストファイル } } CloseHandle( hFile ); } return( nSuccess ); } /* ●引数/戻り値 ①lpFname には、ファイル名の文字列を指定する。 ②dwAttrib には、ファイルの属性を指定する。(通常は FILE_ATTRIBUTE_NORMAL を指定) ③戻り値は、テキストファイルなら +1、バイナリファイルなら -1、そしてファイルが 読み込めなければエラーとして 0 を返す。 */
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.