怎么对网页链接是否有效进行判断

如何对网页链接是否有效进行判断?
请提问者看完一下的内容在进行解答,十分感谢。
  最近在忙一个针对指定网址的源代码进行源代码抓取的操作,主要遇到两个问题。1、对指定的网页链接如何判断他是否有效,例如一些链接点开时浏览器会提示“404”的错误。
2、将网页的源文件以txt文本文档的形式保存下来,我想文件名使用网页的网址,但是对于网址中许多的“/”如何处理,听一些人说使用转义字符是可以的。但是主要有两个问题:首先就是我手动的给文件重命名貌似使用转义字符或是“/”都不行。再者链接上的“/”这么多,如果使用写成方法将对每一个“/”进行转义的话,我想会很麻烦。不知道有没有其他简便的方法。
  求教MFC高手指导。

------解决方案--------------------
1、使用"HEAD"方式发送请求,检查URL是否有效
2、“/”是非法的文件命名符号,可以通过转意替换来解决,因为非法的文件名命名符号还不止“/”这一个,比如“?”什么的,那些符号在URL中都是合法的,所以你可能需要制定一个复杂的转意规则,才能部分搞定,对于那些超长的URL,你没有办法这样搞定的:)
------解决方案--------------------
逻辑:通过HTTP建立连接,判断返回值
代码:使用到 ::InternetConnect 即可。
C/C++ code

        ::InternetOpen //初始化网络句柄
    ::InternetSetStatusCallback //设置下载状态回调函数
    ::InternetConnect //建立网络连接
    HttpOpenRequest //请求数据
        ::InternetReadFile //循环读取下载数据

------解决方案--------------------
CHttpFile::QueryInfoStatusCode 

Status code 
 Meaning 
 
200 
 URL located, transmission follows 
 
400 
 Unintelligible request 
 
404 
 Requested URL not found 
 
405 
 Server does not support requested method 
 
500 
 Unknown server error 
 
503 
 Server capacity reached 
 

------解决方案--------------------
探讨

引用:
逻辑:通过HTTP建立连接,判断返回值
代码:使用到 ::InternetConnect 即可。

C/C++ code


::InternetOpen //初始化网络句柄
::InternetSetStatusCallback //设置下载状态回调函数
::InternetConnect //建立网络连接
HttpOpenRequest……

……

------解决方案--------------------
探讨

引用:
1、使用"HEAD"方式发送请求,检查URL是否有效
2、“/”是非法的文件命名符号,可以通过转意替换来解决,因为非法的文件名命名符号还不止“/”这一个,比如“?”什么的,那些符号在URL中都是合法的,所以你可能需要制定一个复杂的转意规则,才能部分搞定,对于那些超长的URL,你没有办法这样搞定的:)

是的,纠结的文件命名。

------解决方案--------------------
用"%"转意很好,理论上可能增加3倍的长度,非法的文件命名符号一共只有9个,加上转意符号"%",你只需要处理10个符号就可以了
------解决方案--------------------
“%”转意是一个标准的算法,按字节对于不安全的字节编码为"%XX","XX"就是该字节值的16进制表示,如上ascii码,也就是ascii码值:)
------解决方案--------------------
由于你只需要处理10个符号
所以,做一个映射表更好,这10个非法字符(包括%),映射为“%x”两个字符就可以了,可以节约一点长度
------解决方案--------------------
帮你写两个小函数

C/C++ code


CString URL2FileName(LPCSTR pszURL)
{
    CString strFileName(pszURL);
    strFileName.Replace(_T("%"),_T("\a"));

    strFileName.Replace(_T("<"),_T("%0"));
    strFileName.Replace(_T(">"),_T("%1"));
    strFileName.Replace(_T("?"),_T("%2"));
    strFileName.Replace(_T(":"),_T("%3"));
    strFileName.Replace(_T("|"),_T("%4"));
    strFileName.Replace(_T("*"),_T("%5"));
    strFileName.Replace(_T("/"),_T("%6"));
    strFileName.Replace(_T("\""),_T("%7"));
    strFileName.Replace(_T("\\"),_T("%8"));

    strFileName.Replace(_T("\a"),_T("%9"));

    return strFileName;
}

CString FileName2URL(LPCSTR pszFileName)
{
    CString strURL(pszFileName);
    
    strURL.Replace(_T("%0"),_T("<"));
    strURL.Replace(_T("%1"),_T(">"));
    strURL.Replace(_T("%2"),_T("?"));
    strURL.Replace(_T("%3"),_T(":"));
    strURL.Replace(_T("%4"),_T("|"));
    strURL.Replace(_T("%5"),_T("*"));
    strURL.Replace(_T("%6"),_T("/"));
    strURL.Replace(_T("%7"),_T("\""));
    strURL.Replace(_T("%8"),_T("\\"));
    
    strURL.Replace(_T("%9"),_T("%"));
    
    return strURL;
}