<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>








  <meta http-equiv="Content-Language" content="zh-cn">
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  <meta name="GENERATOR" content="Microsoft FrontPage 5.0">
  <meta name="ProgId" content="FrontPage.Editor.Document"><title>Linux thread operations</title>
  
  <style>
<!--
	table td.head{ 
		background-color: #3a6ba5;
		border: 1px #000000 solid;
		font-family: Verdana;
		font-weight: bold;
		font-size: 14px;
		color: #f79c19;
		padding: 6px;
	}

	table td.body{ 
		border-bottom: 1px #6699CC dotted;
		text-align: left;
		font-family: Verdana, sans-serif, Arial;
		font-weight: normal;
		font-size: 14px;
		color: #3A6BA5;
		background-color: #fafafa;
		padding: 6px;
	}
	
-->
  </style></head><body>
<p align="left"><font color="#ff0000" size="6"><span lang="en-ca"><b>&nbsp;
</b></span><b>&nbsp;&nbsp;&nbsp; <span lang="en-ca">&nbsp;&nbsp; File
List</span></b></font></p>
<div align="left">
<pre><b><font color="#ff0000" size="5">A. <span lang="en-ca">Second </span>Edition</font></b></pre>
</div>
<div align="left">
<pre><span lang="en-ca"><b>Little tools to publish all my file list as table.</b></span></pre>
</div>
<div align="left">
<pre><b><font color="#ff0000" size="5"><span lang="en-ca">B</span>.<span lang="en-ca"><a name="problem"></a>The problem</span></font></b></pre>
<b><font color="#ff0000" size="5"><span lang="en-ca">C</span>.<span lang="en-ca">The </span></font></b><span lang="en-ca"><font color="#ff0000" size="5"><b>idea of program</b></font></span></div>
<pre><b><font color="#ff0000" size="5">D.<span lang="en-ca"><a name="Method"></a>The </span>major functions</font></b></pre>
<br>
<div align="left">
<pre><b><font color="#ff0000" size="5"><span lang="en-ca">E</span>.</font></b><span lang="en-ca"><font color="#ff0000" size="5"><b>Further improvement</b></font></span></pre>
</div>
<div align="left">
<pre>กก</pre>
</div>
<div align="left">
<pre><b><font color="#ff0000" size="5"><span lang="en-ca">F</span>.</font></b><span lang="en-ca"><font color="#ff0000" size="5"><b>File listing</b></font></span></pre>
</div>
#include &lt;windows.h&gt;<br>
#include &lt;TCHAR.h&gt;<br>
#include &lt;stdio.h&gt;<br>
<br>
<br>
#define MY_MAX_PATH (4*MAX_PATH)<br>
<br>
typedef bool (* HandleFileCallBack)(LPTSTR fullName, LPTSTR fileName,
void* pUser);<br>
<br>
int pathLength = 0;<br>
int counter = 1;<br>
DWORD numberToWrite;<br>
DWORD number = 0;<br>
<br>
int genericFind(LPCTSTR dir, HandleFileCallBack handleFileCallBack,
LPTSTR filter=NULL, void* pUser=NULL);<br>
<br>
<br>
LPSTR header="&lt;html&gt;&lt;head&gt;&lt;meta
http-equiv=\"Content-Type\" content=\"text/html;
charset=gb2312\"&gt;\n&lt;title&gt;My All File List&lt;/title&gt;
\n&lt;meta name=\"GENERATOR\" content=\"Microsoft FrontPage
6.0\"&gt;&lt;/head&gt; \n &lt;body&gt;&lt;p&gt;&lt;font
color=\"#FF0000\"&gt;\n &lt;font color=\"#FF0000\"&gt;&lt;font
size=\"7\"&gt;\nAll File List\n&lt;/font&gt;&lt;/p&gt;\n";<br>
<br>
LPCSTR bottom="&lt;/table&gt; &lt;/body&gt;&lt;/html&gt;";<br>
<br>
LPSTR table="&lt;table border=\"1\" cellpadding=\"5\" cellspacing=\"5\"
width=\"100%\"&gt;\n&lt;tr&gt; &lt;th&gt; file index &lt;/th&gt;&nbsp;
&lt;th&gt;\n file name \n&lt;/th&gt;&nbsp; &lt;/tr&gt;\n"; <br>
<br>
LPSTR linkPrefix="&lt;tr&gt;&lt;td width=20&gt;%d&lt;/td&gt;\n
&lt;td&gt; &lt;a href=\"http://www.staroceans.net/%s\"&gt;";<br>
LPSTR linkPosfix="&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;";<br>
<br>
bool createListHelper(LPTSTR fullName, LPTSTR fileName, void* pUser)<br>
{<br>
&nbsp;&nbsp;&nbsp; char buffer[1024];&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; char linkBuffer[256];<br>
&nbsp;&nbsp;&nbsp; HANDLE hFile = (HANDLE)pUser;<br>
&nbsp;&nbsp;&nbsp; LPTSTR relativePath = fullName + pathLength;<br>
&nbsp;&nbsp;&nbsp; LPTSTR src = relativePath;<br>
&nbsp;&nbsp;&nbsp; PSTR dst = linkBuffer;<br>
&nbsp;&nbsp;&nbsp; bool bResult = false;<br>
&nbsp;&nbsp;&nbsp; int i=0;<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; if (*src == _T('\\'))<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //bypass the first "\\";<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; src ++;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; do<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (*src == _T('\\'))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *dst = '/';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *dst = *src;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (*src == _T('\0'))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; src ++;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dst ++;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; while (true);&nbsp;&nbsp;&nbsp; <br>
<br>
&nbsp;&nbsp;&nbsp; sprintf(buffer, linkPrefix, counter, linkBuffer);<br>
&nbsp;&nbsp;&nbsp; numberToWrite = strlen(buffer);<br>
&nbsp;&nbsp;&nbsp; if (WriteFile(hFile, buffer, numberToWrite,
&amp;number, NULL)&amp;&amp; numberToWrite==number)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; numberToWrite =
_tcslen(fileName)*sizeof(TCHAR);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (WriteFile(hFile, fileName,
numberToWrite, &amp;number, NULL)&amp;&amp; numberToWrite==number)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; numberToWrite
= strlen(linkPosfix);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if
(WriteFile(hFile, linkPosfix, numberToWrite, &amp;number,
NULL)&amp;&amp; numberToWrite==number)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; bResult = true;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; counter ++;<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; return bResult;<br>
}<br>
&nbsp;&nbsp;&nbsp; <br>
<br>
void createList(LPTSTR path, LPTSTR fileName)<br>
{<br>
&nbsp;&nbsp;&nbsp; HANDLE hFile = INVALID_HANDLE_VALUE;<br>
&nbsp;&nbsp;&nbsp; if ((hFile = CreateFile(fileName,
GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL))!= INVALID_HANDLE_VALUE)<br>
&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; numberToWrite = strlen(header);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pathLength = _tcslen(path);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (WriteFile(hFile, header,
numberToWrite, &amp;number, NULL) &amp;&amp; number == numberToWrite)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; numberToWrite
= strlen(table);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if
(WriteFile(hFile, table, numberToWrite, &amp;number, NULL) &amp;&amp;
number == numberToWrite)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
{&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; genericFind(path, createListHelper, NULL, hFile);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; numberToWrite =strlen(bottom);<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WriteFile(hFile, bottom,
numberToWrite, &amp;number, NULL);<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CloseHandle(hFile);<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
<br>
int genericFind(LPCTSTR dir, HandleFileCallBack handleFileCallBack,
LPTSTR filter, void* pUser)<br>
{<br>
&nbsp;&nbsp;&nbsp; HANDLE handle;<br>
&nbsp;&nbsp;&nbsp; int nCounter = 0;<br>
&nbsp;&nbsp;&nbsp; TCHAR curFileName[MY_MAX_PATH];<br>
&nbsp;&nbsp;&nbsp; TCHAR wildFileName[MY_MAX_PATH];<br>
&nbsp;&nbsp;&nbsp; LPTSTR strFileName;<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; WIN32_FIND_DATA ffd;<br>
<br>
&nbsp;&nbsp;&nbsp; if (filter == NULL)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; strFileName = _T("*.*");<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; strFileName = filter;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
<br>
&nbsp;&nbsp;&nbsp; _sntprintf(wildFileName, MY_MAX_PATH, _T("%s\\%s"),
dir, strFileName);<br>
&nbsp;&nbsp;&nbsp; handle = FindFirstFile(wildFileName, &amp;ffd);<br>
&nbsp;&nbsp;&nbsp; if (handle==INVALID_HANDLE_VALUE)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; _tprintf(_T("findfirst failed of
error code =%d\n"), GetLastError());<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; do<br>
&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (_tcsicmp(ffd.cFileName,
_T("."))!=0 &amp;&amp; _tcsicmp(ffd.cFileName, _T(".."))!=0)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
_stprintf(curFileName, _T("%s\\%s"), dir, ffd.cFileName);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if&nbsp;
(GetFileAttributes(curFileName)&amp;FILE_ATTRIBUTE_DIRECTORY)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; // filter my personal folder<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; if (_tcsicmp(ffd.cFileName, _T("personal")) !=0)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; genericFind(curFileName,
handleFileCallBack, filter, pUser);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; if (!handleFileCallBack(curFileName, ffd.cFileName,
pUser))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; nCounter ++;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; while (FindNextFile(handle,
&amp;ffd));&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; FindClose(handle);<br>
&nbsp;&nbsp;&nbsp; return nCounter;<br>
}<br>
<br>
<br>
<br>
int _tmain(int argc, LPTSTR* argv)<br>
{<br>
&nbsp;&nbsp;&nbsp; //I:\MyWeb\diabloforum mylist.htm<br>
&nbsp;&nbsp;&nbsp; if (argc == 3)<br>
&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; createList(argv[1], argv[2]); <br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
}<br>
<br>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////<br>
// This is the latest version by using boost as there are some nasty thing about language encoding problem with windows<br>
// api. It is said, in windows, you should always use wide-char api and widestring, but in linux, you should almost never<br>
// use wide char. Till now, I don't really understand this but it works.<br>
<br>
#include &lt;iostream&gt;<br>
#include &lt;boost/filesystem/path.hpp&gt;<br>
#include &lt;boost/filesystem/operations.hpp&gt;<br>
#include &lt;string&gt;<br>
#include &lt;map&gt;<br>
#include &lt;algorithm&gt;<br>
#include &lt;cstdio&gt;<br>
<br>
using namespace std;<br>
using namespace boost::filesystem;<br>
<br>
typedef multimap&lt;string, string&gt; StringMap;<br>
<br>
string prefix = "http://www.staroceans.net";<br>
<br>
string header1="&lt;html&gt;&lt;head&gt;&lt;meta
http-equiv=\"Content-Type\" content=\"text/html;
charset=UTF-8\"&gt;&lt;title&gt;My All File List&lt;/title&gt;";<br>
string header2="&lt;meta name=\"GENERATOR\" content=\"Microsoft
FrontPage 6.0\"&gt;&lt;/head&gt;&nbsp; &lt;body&gt;&lt;p&gt;&lt;font
color=\"#FF0000\"&gt;";<br>
string header3="&lt;font color=\"#FF0000\"&gt;&lt;font size=\"7\"&gt;All File List&lt;/font&gt;&lt;/p&gt;";<br>
<br>
string comment1="This is a list of all files in this website and to
make it easy for searching, the they are sorted by file name"<br>
&nbsp;&nbsp;&nbsp; " and here is &lt;a href=\"";<br>
string comment2="/myListTool.html\"&gt; the source code &lt;/a&gt; of file how it is generated.";<br>
<br>
string tableHeader1="&lt;table border=\"1\" cellpadding=\"5\" cellspacing=\"5\" width=\"100%\"&gt;";<br>
string tableHeader2="&lt;tr&gt; &lt;th&gt; file index &lt;/th&gt;&nbsp;
&lt;th&gt; file name &lt;/th&gt;&nbsp;&nbsp; &lt;/tr&gt;";<br>
string bottom="&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;";<br>
<br>
string tableColumn1 = "&lt;tr&gt; &lt;td width=20&gt;";<br>
string tableColumn2 = "&lt;/td&gt;&nbsp; &lt;td&gt; &lt;a href=\"";<br>
string tableColumn3 = "\"&gt;";<br>
string tableColumn4 = "&lt;/a&gt; &lt;/td&gt; &lt;/tr&gt;";<br>
<br>
<br>
<br>
string urlEncode(const string&amp; str)<br>
{<br>
&nbsp;&nbsp;&nbsp; string result;<br>
&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; str.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (str[i]&gt;='0' &amp;&amp;
str[i] &lt;='9' || str[i]&gt;='A' &amp;&amp; str[i] &lt;='Z' || str[i]
&gt;= 'a' &amp;&amp; str[i] &lt;= 'z')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result+= str[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const unsigned char MASK1 = 0xF0;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const unsigned char MASK2 = 0x0F;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char ch;<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch (str[i])<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '-':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '_':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '.':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '!':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '~':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '*':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '\'':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '(':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ')':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '"':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += str[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = (str[i] &amp; MASK1) &gt;&gt; 4;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += '%';<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (ch &gt; 9)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = ch - 10 + 'A';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = ch + '0';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += ch;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = str[i] &amp; MASK2;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (ch &gt; 9)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = ch - 10 + 'A';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = ch + '0';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += ch;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; return result;<br>
}<br>
<br>
<br>
void doFile(const string&amp; filePath, StringMap&amp; stringMap, const string&amp; prefix)<br>
{<br>
&nbsp;&nbsp;&nbsp; //cout&lt;&lt;filePath.file_string()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; //cout&lt;&lt;filePath.filename()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; string str = prefix + "/" + urlEncode(filePath);<br>
<br>
&nbsp;&nbsp;&nbsp; if (stringMap.insert(make_pair&lt;string, string&gt;(filePath, str)) == stringMap.end())<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout&lt;&lt;"error"&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
void doDir(const path&amp; thePath, StringMap&amp; stringMap, const string&amp; prefix)<br>
{<br>
&nbsp;&nbsp;&nbsp; directory_iterator it(thePath), dirEnd;<br>
&nbsp;&nbsp;&nbsp; while (it != dirEnd)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout&lt;&lt; it-&gt;filename()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (is_directory(*it))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout&lt;&lt; it-&gt;filename()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // check if it has white space in between.<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string subPrefix = prefix + "/" + urlEncode(it-&gt;filename());<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (it-&gt;filename().compare("personal") != 0)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; doDir(*it, stringMap, subPrefix);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (is_regular_file(*it))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //string str = urlEncode(it-&gt;filename());<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; doFile(it-&gt;filename(), stringMap, prefix);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; //cout&lt;&lt;"file is not
regular:"&lt;&lt;it-&gt;filename()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; it ++;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
<br>
}<br>
<br>
struct ShowStringPair<br>
{<br>
&nbsp;&nbsp;&nbsp; void showString(const string&amp; str) const<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; str.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char ch = str[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout&lt;&lt;ch;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout.flush();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; void operator()(const pair&lt;string, string&gt;&amp; strPair) const<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout&lt;&lt;"key:";<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; showString(strPair.first);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout&lt;&lt;"; value:";<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; showString(strPair.second);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout
&lt;&lt;tableColumn1&lt;&lt;total&lt;&lt;tableColumn2&lt;&lt;str&lt;&lt;tableColumn3&lt;&lt;subDir&lt;&lt;tableColumn4&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
};<br>
<br>
void showString(const string&amp; str)<br>
{<br>
&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; str.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char ch = str[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout&lt;&lt;ch;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout.flush();<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
void showMap(const StringMap&amp; stringMap)<br>
{<br>
&nbsp;&nbsp;&nbsp; cout&lt;&lt;header1&lt;&lt;header2&lt;&lt;header3&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; cout&lt;&lt;tableHeader1&lt;&lt;tableHeader2&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; cout&lt;&lt;comment1&lt;&lt;prefix&lt;&lt;comment2&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; int counter = 1;<br>
&nbsp;&nbsp;&nbsp; for (StringMap::const_iterator it =&nbsp; stringMap.begin(); it != stringMap.end(); it ++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn1 &lt;&lt; counter &lt;&lt; tableColumn2;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; showString(it-&gt;second);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn3;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; showString(it-&gt;first);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn4;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; counter ++;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; cout&lt;&lt; bottom&lt;&lt;endl;<br>
}<br>
<br>
<br>
<br>
int main()<br>
{<br>
&nbsp;&nbsp;&nbsp; path srcPath("/media/unused/diabloforum");<br>
&nbsp;&nbsp;&nbsp; //path srcPath("/media/unused/diabloforum/DC/HWBooks/Serial Communications Dev guide");<br>
&nbsp;&nbsp;&nbsp; //path srcPath("/media/unused/USB Design By Example");<br>
<br>
&nbsp;&nbsp;&nbsp; //path dstPath = srcPath.parent_path() / "dst";<br>
&nbsp;&nbsp;&nbsp; StringMap stringMap;<br>
<br>
&nbsp;&nbsp;&nbsp; doDir(srcPath, stringMap, prefix);<br>
<br>
&nbsp;&nbsp;&nbsp; //for_each(stringMap.begin(), stringMap.end(), ShowStringPair());<br>
&nbsp;&nbsp;&nbsp; showMap(stringMap);<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
}<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
/*<br>
void copy_directory(const path&amp; src, const path&amp; dst)<br>
{<br>
&nbsp;&nbsp;&nbsp; if (is_directory(src) &amp;&amp; is_directory(dst))<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; directory_iterator srcIt(src), itEnd;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while (srcIt != itEnd)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; path dstPath = dst / srcIt-&gt;filename();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
//cout&lt;&lt;"src="&lt;&lt;srcIt-&gt;filename()
&lt;&lt;endl&lt;&lt;"dst="&lt;&lt;dstPath-&gt;filename()&lt;&lt;endl;<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (is_regular_file(*srcIt))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; copy_file(*srcIt, dstPath);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (is_directory(*srcIt))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; create_directory(dstPath);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; copy_directory(*srcIt, dstPath);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; srcIt ++;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
<br>
int main()<br>
{<br>
&nbsp;&nbsp;&nbsp; path srcPath("/home/nick/myprojects/mytest");<br>
&nbsp;&nbsp;&nbsp; path dstPath = srcPath.parent_path() / "dst";<br>
&nbsp;&nbsp;&nbsp; cout&lt;&lt;srcPath.filename().c_str()&lt;&lt;endl;<br>
<br>
&nbsp;&nbsp;&nbsp; //doDir(srcPath);<br>
&nbsp;&nbsp;&nbsp; if (! exists(dstPath))<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; create_directory(dstPath);<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; if (is_directory(dstPath))<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; copy_directory(srcPath, dstPath);<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; //copy_directory(srcPath, dstPath);<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
}<br>
*/<br>
///////////////////////////////////////////////////////////////////////////////////<br>
// made some trivial changes...<br>
/*<br>
&nbsp;* myListTool.cpp<br>
&nbsp;*<br>
&nbsp;*&nbsp; Created on: Feb 23, 2013<br>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Author: nick<br>
&nbsp;*/<br>
<br>
<br>
// This is the latest version by using boost as there are some nasty thing about language encoding problem with windows<br>
// api. It is said, in windows, you should always use wide-char api and widestring, but in linux, you should almost never<br>
// use wide char. Till now, I don't really understand this but it works.<br>
<br>
#include &lt;iostream&gt;<br>
#include &lt;boost/filesystem/path.hpp&gt;<br>
#include &lt;boost/filesystem/operations.hpp&gt;<br>
#include &lt;string&gt;<br>
#include &lt;map&gt;<br>
#include &lt;algorithm&gt;<br>
#include &lt;cstdio&gt;<br>
<br>
using namespace std;<br>
using namespace boost::filesystem;<br>
<br>
typedef multimap&lt;string, string&gt; StringMap;<br>
<br>
string prefix = "http://www.staroceans.net";<br>
<br>
string header1="&lt;html&gt;&lt;head&gt;&lt;meta
http-equiv=\"Content-Type\" content=\"text/html;
charset=UTF-8\"&gt;&lt;title&gt;My All File List&lt;/title&gt;";<br>
string header2="&lt;meta name=\"GENERATOR\" content=\"Microsoft
FrontPage 6.0\"&gt;&lt;/head&gt;&nbsp; &lt;body&gt;&lt;p&gt;&lt;font
color=\"#FF0000\"&gt;";<br>
string header3="&lt;font color=\"#FF0000\"&gt;&lt;font size=\"7\"&gt;All File List&lt;/font&gt;&lt;/p&gt;";<br>
<br>
string comment1="This is a list of all files in this website and to
make it easy for searching, the they are sorted by file name"<br>
&nbsp;&nbsp;&nbsp; " and here is &lt;a href=\"";<br>
string comment2="/myListTool.html\"&gt; the source code &lt;/a&gt; of file how it is generated.";<br>
<br>
string tableHeader1="&lt;table border=\"1\" cellpadding=\"5\" cellspacing=\"5\" width=\"100%\" table-layout=\"fixed\""<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&nbsp;&nbsp; &lt;colgroup&gt;"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "&lt;col span=\"1\" style=\"width: 15%;\"&gt;"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "&lt;col span=\"1\" style=\"width: 70%;\"&gt;"<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "&lt;col span=\"1\" style=\"width: 15%;\"&gt;"<br>
&nbsp;&nbsp;&nbsp; "&lt;/colgroup&gt;&gt;";<br>
string tableHeader2="&lt;tr&gt; &lt;th&gt; file index &lt;/th&gt;&nbsp;
&lt;th&gt; file name &lt;/th&gt;&nbsp; &lt;th&gt; file path &lt;/th&gt;
&lt;/tr&gt;";<br>
string bottom="&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;";<br>
<br>
string tableColumn1 = "&lt;tr&gt; &lt;td style=\"width: 5%;\"&gt;";<br>
string tableColumn2 = "&lt;/td&gt;&nbsp; &lt;td style=\"width: 20%;\" &gt; &lt;a href=\"";<br>
string tableColumn3 = "\"&gt;";<br>
string tableColumn4 = "&lt;/a&gt; &lt;/td&gt; &lt;td style=\"width: 75%;\"&gt;";<br>
string tableColumn5 = "&lt;/td&gt;&lt;/tr&gt;";<br>
<br>
<br>
<br>
string urlEncode(const string&amp; str)<br>
{<br>
&nbsp;&nbsp;&nbsp; string result;<br>
&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; str.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (str[i]&gt;='0'
&amp;&amp; str[i] &lt;='9' || str[i]&gt;='A' &amp;&amp; str[i] &lt;='Z'
|| str[i] &gt;= 'a' &amp;&amp; str[i] &lt;= 'z')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result+= str[i];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const unsigned char MASK1 = 0xF0;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const unsigned char MASK2 = 0x0F;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char ch;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (str[i])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '-':<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '_':<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '.':<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '!':<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '~':<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '*':<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '\'':<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '(':<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case ')':<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '"':<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += str[i];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = (str[i] &amp; MASK1) &gt;&gt; 4;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += '%';<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ch &gt; 9)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ch = ch - 10 + 'A';<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ch = ch + '0';<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += ch;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch = str[i] &amp; MASK2;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ch &gt; 9)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ch = ch - 10 + 'A';<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ch = ch + '0';<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += ch;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; return result;<br>
}<br>
<br>
<br>
void doFile(const string&amp; fileName, StringMap&amp; stringMap, const string&amp; prefix, const string&amp; filePath)<br>
{<br>
&nbsp;&nbsp;&nbsp; //cout&lt;&lt;filePath.file_string()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; //cout&lt;&lt;filePath.filename()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; string str = prefix + "/" + urlEncode(fileName);<br>
<br>
&nbsp;&nbsp;&nbsp; if (stringMap.insert(make_pair&lt;string, string&gt;(filePath+"/"+fileName, str)) == stringMap.end())<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cout&lt;&lt;"error"&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
void doDir(const path&amp; thePath, StringMap&amp; stringMap, const string&amp; prefix, const string&amp; filePath)<br>
{<br>
&nbsp;&nbsp;&nbsp; directory_iterator it(thePath), dirEnd;<br>
&nbsp;&nbsp;&nbsp; while (it != dirEnd)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cout&lt;&lt; it-&gt;filename()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (is_directory(*it))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cout&lt;&lt; it-&gt;filename()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // check if it has white space in between.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
string subPrefix = prefix + "/" + urlEncode(it-&gt;filename());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string subFilePath = filePath + "/" + it-&gt;filename();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
(it-&gt;filename().compare("personal") != 0 &amp;&amp;
it-&gt;filename()[0] != '.')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
doDir(*it, stringMap, subPrefix, subFilePath);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (is_regular_file(*it))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//string str = urlEncode(it-&gt;filename());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // bypass hiden files<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (it-&gt;filename()[0] != '.')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; doFile(it-&gt;filename(),
stringMap, prefix, filePath);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//cout&lt;&lt;"file is not
regular:"&lt;&lt;it-&gt;filename()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it ++;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
<br>
}<br>
<br>
struct ShowStringPair<br>
{<br>
&nbsp;&nbsp;&nbsp; void showString(const string&amp; str) const<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (unsigned int i = 0; i &lt; str.size(); i ++)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char ch = str[i];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;ch;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout.flush();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; void operator()(const pair&lt;string, string&gt;&amp; strPair) const<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cout&lt;&lt;"key:";<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showString(strPair.first);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"; value:";<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showString(strPair.second);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cout
&lt;&lt;tableColumn1&lt;&lt;total&lt;&lt;tableColumn2&lt;&lt;str&lt;&lt;tableColumn3&lt;&lt;subDir&lt;&lt;tableColumn4&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
};<br>
<br>
void showString(const string&amp; str)<br>
{<br>
&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; str.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char ch = str[i];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;ch;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cout.flush();<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
void showMap(const StringMap&amp; stringMap)<br>
{<br>
&nbsp;&nbsp;&nbsp; cout&lt;&lt;header1&lt;&lt;header2&lt;&lt;header3&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; cout&lt;&lt;tableHeader1&lt;&lt;tableHeader2&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; cout&lt;&lt;comment1&lt;&lt;prefix&lt;&lt;comment2&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; int counter = 1;<br>
&nbsp;&nbsp;&nbsp; for (StringMap::const_iterator it =&nbsp; stringMap.begin(); it != stringMap.end(); it ++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size_t pos = it-&gt;first.find_last_of('/');<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn1 &lt;&lt; counter &lt;&lt; tableColumn2;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showString(it-&gt;second);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn3;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showString(it-&gt;first.substr(pos+1));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn4;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;&nbsp; it-&gt;first;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn5;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; counter ++;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; cout&lt;&lt; bottom&lt;&lt;endl;<br>
}<br>
<br>
<br>
<br>
int main()<br>
{<br>
&nbsp;&nbsp;&nbsp; path srcPath("/media/FLASH32G/MyWeb/diabloforum");<br>
&nbsp;&nbsp;&nbsp; //path srcPath("/media/unused/diabloforum/DC/HWBooks/Serial Communications Dev guide");<br>
&nbsp;&nbsp;&nbsp; //path srcPath("/media/unused/USB Design By Example");<br>
<br>
&nbsp;&nbsp;&nbsp; //path dstPath = srcPath.parent_path() / "dst";<br>
&nbsp;&nbsp;&nbsp; StringMap stringMap;<br>
<br>
&nbsp;&nbsp;&nbsp; doDir(srcPath, stringMap, prefix, "");<br>
<br>
&nbsp;&nbsp;&nbsp; //for_each(stringMap.begin(), stringMap.end(), ShowStringPair());<br>
&nbsp;&nbsp;&nbsp; showMap(stringMap);<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
}<br>
<br>
<br>
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br><a name="url-encoding"></a>
/****************************************************************************************************************************************/<br>/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br>
/****************************************************************************************************************************************/<br>
// Add file size to file path...<br>
/*<br>
&nbsp;* myListTool.cpp<br>
&nbsp;*<br>
&nbsp;*&nbsp; Created on: Sep 1, 2013<br>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Author: nick<br>
&nbsp;*&nbsp;&nbsp;&nbsp; Boost is really a headache as the version is keep upgrading and the interace is<br>
&nbsp;*&nbsp;&nbsp;&nbsp; changed constantly according to developer's personal favorite.<br>
&nbsp;*&nbsp;&nbsp;&nbsp; This is compiled under boost1.46<br>
&nbsp;*/<br>
<br>
// This is the latest version by using boost as there are some nasty thing about language encoding problem with windows<br>
// api. It is said, in windows, you should always use wide-char api and widestring, but in linux, you should almost never<br>
// use wide char. Till now, I don't really understand this but it works.<br>
#include &lt;iostream&gt;<br>
#include &lt;boost/filesystem/path.hpp&gt;<br>
#include &lt;boost/filesystem/operations.hpp&gt;<br>
#include &lt;string&gt;<br>
#include &lt;map&gt;<br>
#include &lt;algorithm&gt;<br>
#include &lt;cstdio&gt;<br>
<br>
using namespace std;<br>
using namespace boost::filesystem;<br>
<br>
typedef multimap&lt;string, string&gt; StringMap;<br>
<br>
string prefix = "http://www.staroceans.net";<br>
<br>
string header1 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;html&gt;&lt;head&gt;&lt;meta
http-equiv=\"Content-Type\" content=\"text/html;
charset=UTF-8\"&gt;&lt;title&gt;My All File List&lt;/title&gt;";<br>
string header2 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;meta name=\"GENERATOR\"
content=\"Microsoft FrontPage 6.0\"&gt;&lt;/head&gt;&nbsp;
&lt;body&gt;&lt;p&gt;&lt;font color=\"#FF0000\"&gt;";<br>
string header3 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;font
color=\"#FF0000\"&gt;&lt;font size=\"7\"&gt;All File
List&lt;/font&gt;&lt;/p&gt;";<br>
<br>
string comment1 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "This is a list of all files in
this website and to make it easy for searching, the they are sorted by
file name"<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " and here is &lt;a href=\"";<br>
string comment2 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "/myListTool.html\"&gt; the source code &lt;/a&gt; of file how it is generated.";<br>
<br>
string tableHeader1 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;table border=\"1\"
cellpadding=\"5\" cellspacing=\"5\" width=\"100%\"
table-layout=\"fixed\""<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&nbsp;&nbsp; &lt;colgroup&gt;"<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;col span=\"1\" style=\"width: 15%;\"&gt;"<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;col span=\"1\" style=\"width: 70%;\"&gt;"<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;col span=\"1\" style=\"width: 15%;\"&gt;"<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;/colgroup&gt;&gt;";<br>
string tableHeader2 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;tr&gt; &lt;th&gt; file index
&lt;/th&gt;&nbsp; &lt;th&gt; file name &lt;/th&gt;&nbsp; &lt;th&gt;
file path &lt;/th&gt; &lt;/tr&gt;";<br>
string bottom = "&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;";<br>
<br>
string tableColumn1 = "&lt;tr&gt; &lt;td style=\"width: 5%;\"&gt;";<br>
string tableColumn2 = "&lt;/td&gt;&nbsp; &lt;td style=\"width: 20%;\" &gt; &lt;a href=\"";<br>
string tableColumn3 = "\"&gt;";<br>
string tableColumn4 = "&lt;/a&gt; &lt;/td&gt; &lt;td style=\"width: 75%;\"&gt;";<br>
string tableColumn5 = "&lt;/td&gt;&lt;/tr&gt;";<br>
<br>
string urlEncode(const string&amp; str)<br>
{<br>
&nbsp;&nbsp;&nbsp; string result;<br>
&nbsp;&nbsp;&nbsp; for (size_t i = 0; i &lt; str.size(); i++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ((str[i] &gt;= '0' &amp;&amp;
str[i] &lt;= '9') || (str[i] &gt;= 'A' &amp;&amp; str[i] &lt;= 'Z')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; || (str[i] &gt;= 'a' &amp;&amp; str[i] &lt;= 'z'))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += str[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const unsigned char MASK1 = 0xF0;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const unsigned char MASK2 = 0x0F;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char ch;<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch (str[i])<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '-':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '_':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '.':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '!':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '~':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '*':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '\'':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '(':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ')':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '"':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += str[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = (str[i] &amp; MASK1) &gt;&gt; 4;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += '%';<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (ch &gt; 9)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = ch - 10 + 'A';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = ch + '0';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += ch;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = str[i] &amp; MASK2;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (ch &gt; 9)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = ch - 10 + 'A';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = ch + '0';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += ch;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; return result;<br>
}<br>
<br>
void doFile(const string&amp; fileName, StringMap&amp; stringMap, const string&amp; prefix,<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const string&amp; filePath, const string&amp; fileSizeStr)<br>
{<br>
&nbsp;&nbsp;&nbsp; //cout&lt;&lt; "dofile: " &lt;&lt; filePath.string()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; //cout&lt;&lt;filePath.filename()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; string str = prefix + "/" + urlEncode(fileName);<br>
<br>
&nbsp;&nbsp;&nbsp; if (stringMap.insert(<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
make_pair&lt;string, string&gt;(filePath + "/" + fileName + fileSizeStr,<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; str)) == stringMap.end())<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout&lt;&lt;"error"&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
string getFileSizeStr(const path&amp; p)<br>
{<br>
&nbsp;&nbsp;&nbsp; char buf[64];<br>
&nbsp;&nbsp;&nbsp; uintmax_t size = file_size(p);<br>
&nbsp;&nbsp;&nbsp; char unit_str = 'B';<br>
&nbsp;&nbsp;&nbsp; if (size &gt;= 1024)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // in k<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size = size / 1024;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unit_str = 'K';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (size &gt;= 1024)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // in M<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size = size / 1024;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unit_str = 'M';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (size &gt;= 1024)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // in G<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size = size / 1024;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unit_str = 'G';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; sprintf(buf, "[%lu%c]", (unsigned long) size, unit_str);<br>
&nbsp;&nbsp;&nbsp; //printf("filename=%s has size of %s\n", p.filename().c_str(), buf);<br>
&nbsp;&nbsp;&nbsp; return string(buf);<br>
}<br>
<br>
void doDir(const path&amp; thePath, StringMap&amp; stringMap, const string&amp; prefix,<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const string&amp; filePath)<br>
{<br>
&nbsp;&nbsp;&nbsp; directory_iterator it(thePath), dirEnd;<br>
&nbsp;&nbsp;&nbsp; while (it != dirEnd)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const string str = it-&gt;path().filename().string();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (is_symlink(it-&gt;symlink_status()))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout &lt;&lt; "symlink: " &lt;&lt; str &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout&lt;&lt; it-&gt;filename()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (is_directory(*it))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout&lt;&lt; "dir: " &lt;&lt; str&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // check if it has white space in between.<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //string str = it-&gt;path().string();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string subPrefix = prefix + "/" + urlEncode(str);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string subFilePath = filePath + "/" + str;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; if (str.compare("personal") != 0 &amp;&amp; str[0]
!= '.')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; doDir(*it, stringMap, subPrefix,
subFilePath);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (is_regular_file(*it))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //string str =
urlEncode(it-&gt;filename());<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // bypass hiden files<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout &lt;&lt; "file: " &lt;&lt;
str &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (str[0] != '.')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string
fileSizeStr = getFileSizeStr(*it);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; doFile(str,
stringMap, prefix, filePath, fileSizeStr);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout&lt;&lt;"file is not
regular:"&lt;&lt; str &lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; it++;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
}<br>
<br>
struct ShowStringPair<br>
{<br>
&nbsp;&nbsp;&nbsp; void showString(const string&amp; str) const<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (unsigned int i = 0; i &lt; str.size(); i++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char ch = str[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; ch;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout.flush();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; void operator()(const pair&lt;string, string&gt;&amp; strPair) const<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout&lt;&lt;"key:";<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; showString(strPair.first);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "; value:";<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; showString(strPair.second);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout
&lt;&lt;tableColumn1&lt;&lt;total&lt;&lt;tableColumn2&lt;&lt;str&lt;&lt;tableColumn3&lt;&lt;subDir&lt;&lt;tableColumn4&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
};<br>
<br>
void showString(const string&amp; str)<br>
{<br>
&nbsp;&nbsp;&nbsp; for (size_t i = 0; i &lt; str.size(); i++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char ch = str[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; ch;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout.flush();<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
void showMap(const StringMap&amp; stringMap)<br>
{<br>
&nbsp;&nbsp;&nbsp; cout &lt;&lt; header1 &lt;&lt; header2 &lt;&lt; header3 &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; cout &lt;&lt; tableHeader1 &lt;&lt; tableHeader2 &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; cout &lt;&lt; comment1 &lt;&lt; prefix &lt;&lt; comment2 &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; int counter = 1;<br>
&nbsp;&nbsp;&nbsp; for (StringMap::const_iterator it = stringMap.begin();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; it != stringMap.end(); it++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size_t pos = it-&gt;first.find_last_of('/');<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn1 &lt;&lt; counter &lt;&lt; tableColumn2;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; showString(it-&gt;second);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn3;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string str = it-&gt;first.substr(pos + 1);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pos = str.find_last_of('[');<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; showString(str.substr(0, pos));<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn4;<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; it-&gt;first;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn5;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; counter++;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; cout &lt;&lt; bottom &lt;&lt; endl;<br>
}<br>
<br>
int main()<br>
{<br>
&nbsp;&nbsp;&nbsp; path srcPath("/mnt/BigDisk/nick/Downloads/FLASH32G/MyWeb/diabloforum");<br>
&nbsp;&nbsp;&nbsp; //path srcPath("/media/unused/diabloforum/DC/HWBooks/Serial Communications Dev guide");<br>
&nbsp;&nbsp;&nbsp; //path srcPath("/media/unused/USB Design By Example");<br>
<br>
&nbsp;&nbsp;&nbsp; //path dstPath = srcPath.parent_path() / "dst";<br>
&nbsp;&nbsp;&nbsp; StringMap stringMap;<br>
<br>
&nbsp;&nbsp;&nbsp; doDir(srcPath, stringMap, prefix, "");<br>
<br>
&nbsp;&nbsp;&nbsp; //for_each(stringMap.begin(), stringMap.end(), ShowStringPair());<br>
&nbsp;&nbsp;&nbsp; showMap(stringMap);<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
}<br>
<br>
////////////////////////////////////////////////////////////////////////////////////////////////////////////<br>
// I don't like boost any more, using linux api to make life easier.<br>
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br>
/****************************************************************************************************************************************/<br>
// Add file size to file path...<br>
/*<br>
&nbsp;* myListTool.cpp<br>
&nbsp;*<br>
&nbsp;*&nbsp; Created on: Sep 1, 2013<br>
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Author: nick<br>
&nbsp;*&nbsp;&nbsp;&nbsp; Boost is really a headache as the version is keep upgrading and the interace is<br>
&nbsp;*&nbsp;&nbsp;&nbsp; changed constantly according to developer's personal favorite.<br>
&nbsp;*&nbsp;&nbsp;&nbsp; This is compiled under boost1.46<br>
&nbsp;*/<br>
<br>
// This is the latest version by using boost as there are some nasty thing about language encoding problem with windows<br>
// api. It is said, in windows, you should always use wide-char api and widestring, but in linux, you should almost never<br>
// use wide char. Till now, I don't really understand this but it works.<br>
#include &lt;iostream&gt;<br>
#include &lt;string&gt;<br>
#include &lt;map&gt;<br>
#include &lt;algorithm&gt;<br>
#include &lt;cstdio&gt;<br>
#include &lt;cstdlib&gt;<br>
#include &lt;sys/types.h&gt;<br>
#include &lt;dirent.h&gt;<br>
#include &lt;sys/stat.h&gt;<br>
#include &lt;unistd.h&gt;<br>
<br>
<br>
using namespace std;<br>
<br>
<br>
typedef multimap&lt;string, string&gt; StringMap;<br>
<br>
string prefix = "http://www.staroceans.org";<br>
<br>
string header1 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;html&gt;&lt;head&gt;&lt;meta
http-equiv=\"Content-Type\" content=\"text/html;
charset=UTF-8\"&gt;&lt;title&gt;My All File List&lt;/title&gt;";<br>
string header2 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;meta name=\"GENERATOR\"
content=\"Microsoft FrontPage 6.0\"&gt;&lt;/head&gt;&nbsp;
&lt;body&gt;&lt;p&gt;&lt;font color=\"#FF0000\"&gt;";<br>
string header3 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;font
color=\"#FF0000\"&gt;&lt;font size=\"7\"&gt;All File
List&lt;/font&gt;&lt;/p&gt;";<br>
<br>
string comment1 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "This is a list of all files in
this website and to make it easy for searching, the they are sorted by
file name"<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " and here is &lt;a href=\"";<br>
string comment2 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "/myListTool.html\"&gt; the source code &lt;/a&gt; of file how it is generated.";<br>
<br>
string tableHeader1 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;table border=\"1\"
cellpadding=\"5\" cellspacing=\"5\" width=\"100%\"
table-layout=\"fixed\""<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&nbsp;&nbsp; &lt;colgroup&gt;"<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;col span=\"1\" style=\"width: 15%;\"&gt;"<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;col span=\"1\" style=\"width: 70%;\"&gt;"<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;col span=\"1\" style=\"width: 15%;\"&gt;"<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;/colgroup&gt;&gt;";<br>
string tableHeader2 =<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;tr&gt; &lt;th&gt; file index
&lt;/th&gt;&nbsp; &lt;th&gt; file name &lt;/th&gt;&nbsp; &lt;th&gt;
file path &lt;/th&gt; &lt;/tr&gt;";<br>
string bottom = "&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;";<br>
<br>
string tableColumn1 = "&lt;tr&gt; &lt;td style=\"width: 5%;\"&gt;";<br>
string tableColumn2 = "&lt;/td&gt;&nbsp; &lt;td style=\"width: 20%;\" &gt; &lt;a href=\"";<br>
string tableColumn3 = "\"&gt;";<br>
string tableColumn4 = "&lt;/a&gt; &lt;/td&gt; &lt;td style=\"width: 75%;\"&gt;";<br>
string tableColumn5 = "&lt;/td&gt;&lt;/tr&gt;";<br>
<br>
string urlEncode(const string&amp; str)<br>
{<br>
&nbsp;&nbsp;&nbsp; string result;<br>
&nbsp;&nbsp;&nbsp; for (size_t i = 0; i &lt; str.size(); i++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ((str[i] &gt;= '0' &amp;&amp;
str[i] &lt;= '9') || (str[i] &gt;= 'A' &amp;&amp; str[i] &lt;= 'Z')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; || (str[i] &gt;= 'a' &amp;&amp; str[i] &lt;= 'z'))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += str[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const unsigned char MASK1 = 0xF0;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const unsigned char MASK2 = 0x0F;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char ch;<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch (str[i])<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '-':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '_':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '.':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '!':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '~':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '*':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '\'':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '(':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case ')':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '"':<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += str[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = (str[i] &amp; MASK1) &gt;&gt; 4;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += '%';<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (ch &gt; 9)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = ch - 10 + 'A';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = ch + '0';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += ch;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = str[i] &amp; MASK2;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (ch &gt; 9)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = ch - 10 + 'A';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ch = ch + '0';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; result += ch;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; return result;<br>
}<br>
<br>
void doFile(const string&amp; strFileName, StringMap&amp; stringMap,
const string&amp; strUrl, const string&amp; strRelativePath, const
string&amp; strFileSizeStr)<br>
{<br>
&nbsp;&nbsp;&nbsp; //cout&lt;&lt; "dofile: " &lt;&lt; filePath.string()&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; //cout&lt;&lt;filePath.filename()&lt;&lt;endl;<br>
<br>
&nbsp;&nbsp;&nbsp; if (stringMap.insert(<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; make_pair&lt;string, string&gt;(strRelativePath + strFileSizeStr,<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; strUrl)) == stringMap.end())<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout&lt;&lt;"error"&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
string getFileSizeStr(size_t size)<br>
{<br>
&nbsp;&nbsp;&nbsp; char buf[64];<br>
<br>
&nbsp;&nbsp;&nbsp; char unit_str = 'B';<br>
&nbsp;&nbsp;&nbsp; if (size &gt;= 1024)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // in k<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size = size / 1024;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unit_str = 'K';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (size &gt;= 1024)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // in M<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size = size / 1024;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unit_str = 'M';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (size &gt;= 1024)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // in G<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size = size / 1024;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unit_str = 'G';<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; sprintf(buf, "[%lu%c]", (unsigned long) size, unit_str);<br>
&nbsp;&nbsp;&nbsp; //printf("filename=%s has size of %s\n", p.filename().c_str(), buf);<br>
&nbsp;&nbsp;&nbsp; return string(buf);<br>
}<br>
<br>
size_t getFileSize(const string&amp; subFilePath)<br>
{<br>
&nbsp;&nbsp;&nbsp; struct stat st;<br>
&nbsp;&nbsp;&nbsp; size_t size = 0;<br>
&nbsp;&nbsp;&nbsp; if (stat(subFilePath.c_str(), &amp;st) == 0)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size = st.st_size;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; return size;<br>
}<br>
<br>
void doDir(const string&amp; strRootPath,&nbsp; const string&amp;
strUrl, const string&amp; strRelativePath, StringMap&amp; stringMap)<br>
{<br>
&nbsp;&nbsp;&nbsp; string strPath = strRootPath + "/" + strRelativePath;<br>
&nbsp;&nbsp;&nbsp; DIR* pDir = opendir(strPath.c_str());<br>
&nbsp;&nbsp;&nbsp; if (pDir)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; struct dirent* pEnt;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while ((pEnt = readdir(pDir))!= NULL)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string strFileName = pEnt-&gt;d_name;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string strSubPath = strPath + "/" + strFileName;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string strSubUrl = strUrl + "/" + urlEncode(strFileName);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string strSubRelativePath = strRelativePath + "/" + strFileName;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch (pEnt-&gt;d_type)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case DT_REG:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // I don't want to add hidden files now...<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (strFileName[0] != '.')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size_t size =
getFileSize(strSubPath);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string strFileSizeStr =
getFileSizeStr(size);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; doFile(strFileName, stringMap,
strSubUrl, strSubRelativePath, strFileSizeStr);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case DT_DIR:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; if (strFileName.compare("personal") != 0 &amp;&amp;
strFileName[0] != '.')<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; doDir(strRootPath, strSubUrl,
strSubRelativePath, stringMap);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; cout&lt;&lt;"file is not regular:"&lt;&lt;
strFileName &lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; closedir(pDir);<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
struct ShowStringPair<br>
{<br>
&nbsp;&nbsp;&nbsp; void showString(const string&amp; str) const<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (unsigned int i = 0; i &lt; str.size(); i++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char ch = str[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; ch;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout.flush();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; void operator()(const pair&lt;string, string&gt;&amp; strPair) const<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout&lt;&lt;"key:";<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; showString(strPair.first);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "; value:";<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; showString(strPair.second);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout
&lt;&lt;tableColumn1&lt;&lt;total&lt;&lt;tableColumn2&lt;&lt;str&lt;&lt;tableColumn3&lt;&lt;subDir&lt;&lt;tableColumn4&lt;&lt;endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
};<br>
<br>
void showString(const string&amp; str)<br>
{<br>
&nbsp;&nbsp;&nbsp; for (size_t i = 0; i &lt; str.size(); i++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char ch = str[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; ch;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //cout.flush();<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
void showMap(const StringMap&amp; stringMap)<br>
{<br>
&nbsp;&nbsp;&nbsp; cout &lt;&lt; header1 &lt;&lt; header2 &lt;&lt; header3 &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; cout &lt;&lt; tableHeader1 &lt;&lt; tableHeader2 &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; cout &lt;&lt; comment1 &lt;&lt; prefix &lt;&lt; comment2 &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; int counter = 1;<br>
&nbsp;&nbsp;&nbsp; for (StringMap::const_iterator it = stringMap.begin();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; it != stringMap.end(); it++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size_t pos = it-&gt;first.find_last_of('/');<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn1 &lt;&lt; counter &lt;&lt; tableColumn2;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; showString(it-&gt;second);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn3;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string str = it-&gt;first.substr(pos + 1);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pos = str.find_last_of('[');<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; showString(str.substr(0, pos));<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn4;<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; it-&gt;first;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; tableColumn5;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; counter++;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; cout &lt;&lt; bottom &lt;&lt; endl;<br>
}<br>
<br>
int main()<br>
{<br>
&nbsp;&nbsp;&nbsp; string srcPath("/home/nick/diabloforum");<br>
<br>
&nbsp;&nbsp;&nbsp; //path dstPath = srcPath.parent_path() / "dst";<br>
&nbsp;&nbsp;&nbsp; StringMap stringMap;<br>
<br>
&nbsp;&nbsp;&nbsp; doDir(srcPath, prefix, "", stringMap);<br>
<br>
&nbsp;&nbsp;&nbsp; //for_each(stringMap.begin(), stringMap.end(), ShowStringPair());<br>
&nbsp;&nbsp;&nbsp; showMap(stringMap);<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
}<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<pre></pre>
<pre></pre>
<pre></pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; <a href="PocketRuler.htm"> <img src="picture/back.gif" style="border: medium none ;" alt="back.gif (341 bytes)" height="35" width="32"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="index.htm"><img src="picture/up.gif" style="border: medium none ;" alt="up.gif (335 bytes)" height="32" width="35"></a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="picture/next.gif" style="border: medium none ;" alt="next.gif (337 bytes)" height="35" width="32"> </p>
</body></html>