
訳:優婆塞宮(うばそくのみや)たん萌え萌え
IEのキャッシュフォルダにあるHTMLファイルからメールアドレスをあつめるサンプルです。
メアド収集車もこれと同じ技術を使っています。
IEのキャッシュフォルダはぱっと見では、フォルダ以下にすべてのファイルがあるように見えますが実際はそうではないので、再帰的に検索をする必要があります。
よってFindFile()が検索用の関数だとすると、以下のようになります。
int FindFile()
{
// IEのキャッシュフォルダを取得する
char chPath[MAX_PATH];
::SHGetSpecialFolderPath(NULL,chPath,CSIDL_INTERNET_CACHE,0);
// 検索開始
return FindFile(chPath);
}
int FindFile(const CString& cPath)
{
CFileFind cFind;
// 検索を開始する
if(cFind.FindFile(cPath + _T("\\*.*")) != 0)
{
int i = 1;
while(i)
{
i = cFind.FindNextFile();
// ドットは無視
if(cFind.IsDots()){continue;}
if(cFind.IsDirectory())
{
// フォルダなら、再起処理
FindFile(cFind.GetFilePath());
}else{
// ファイルなか解析する
Analysis(cFindFile.GetFilePath());
}
}
return 0;
}
return -1;
}
面倒くさいのでmailto:以降を取得するだけです。
#include "map"
using namespace std;
map m_mAddress;
void Analysis(CString cPath)
{
CStdioFile cFile;
if(cFile.Open(cPath,CFile::modeRead) != 0)
{
CString cBuf,cAddress;
while(cFile.ReadString(cBuf))
{
int i = cBuf.Find(_T("<"));
// mailto:までの文字数を取得
int nStart = cBuf.Find(_T("mailto:"),i);
if(nStart == -1){continue;} // エラー
// "(ダブルコーテーション)までの文字列を取得
int nEnd = cBuf.Find(_T("\""),nStart);
if(nEnd == -1){continue;} // エラー
cAddress = cBuf.Mid(nStart + strlen(_T("mailto:")),nEnd - nStart - strlen(_T("mailto:")));
m_mAddress[cAddress] = 0;
}
}
cFile.Close();
}
あとはm_mAddressの内容を表示するればオッケーです。
©2002 knothole All Right Reserved.