利用VS根据文件目录结构创建C++工程自己简单实现的方法

来源:互联网 发布:mac中ssh客户端 编辑:程序博客网 时间:2024/05/06 18:43

相信程序员都有过这样的经历。

一些开源的C、C++代码库大多数是在linux下面开发的。为了能在windows下面用VS方便查看代码,可以利用VS根据已有代码来创建C++项目。简单步骤如下:

第一步:打开VS,点击“文件”菜单,在弹出菜单选择“新建”,最后选择“从现有代码创建项目”;


第二步:根据向导创建VC++项目,

找到已有代码的文件,添加进来

使用VS来生成项目,项目类型这里是控制台应用,最后点击完成就可以生成项目了。


最后生成的项目结构目录如下,一点层次结构都没有了:


第三步:自己写代码来实现自动建立目录结构,这里贴上自己写的代码:

#include <stdio.h>#include "tinyxml/tinyxml.h"#include <iostream>#include <vector>#include <set>using namespace std;#ifdef WIN32//guid#include <objbase.h>#else#include <uuid/uuid.h>#endifGUID CreateGuid(){GUID guid;#ifdef WIN32CoCreateGuid(&guid);#elseuuid_generate(reinterpret_cast<unsigned char *>(&guid));#endifreturn guid;}std::string GuidToString(const GUID &guid){char buf[64] = { 0 };#ifdef __GNUC__snprintf(#else // MSVC_snprintf_s(#endifbuf,sizeof(buf),"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",guid.Data1, guid.Data2, guid.Data3,guid.Data4[0], guid.Data4[1],guid.Data4[2], guid.Data4[3],guid.Data4[4], guid.Data4[5],guid.Data4[6], guid.Data4[7]);return std::string(buf);}void subDir(vector<string>& arr,string str,char sp){arr.push_back(str);for (size_t pos = str.find_last_of(sp); pos != string::npos; pos = str.find_last_of(sp)){str = str.substr(0, pos);arr.push_back(str);}}int main(){set<string> OldDirset;set<string> NewDirset;char tmp[256];cout << "输入文件名!" << endl;cin >> tmp;string filepath = tmp;TiXmlDocument doc(filepath.c_str());bool b=doc.LoadFile();if (!b) {printf("Error: 加载文件失败!!");}printf("文件加载成功!\n");//std::cout<<doc.Value()<<std::endl;TiXmlElement* project= doc.FirstChildElement();//第一个Project元素//cout << project->Value() << project->Attribute("xmlns")<<endl;//cout << project->FirstChild()->NextSibling()->Value();//获取第二个TiXmlElement* FirstItemGroup = project->FirstChildElement();//查找已有信息{TiXmlElement* Filter = FirstItemGroup->FirstChildElement();//cout << Filter->Value() << endl;for (; Filter != NULL; Filter = Filter->NextSiblingElement()){string dir = Filter->Attribute("Include");OldDirset.insert(dir);}}//查找未添加的TiXmlElement* ItemGroup = FirstItemGroup->NextSiblingElement();for (int i=0; ItemGroup != NULL && i<2;ItemGroup=ItemGroup->NextSiblingElement(),i++){TiXmlElement* ClCompile = ItemGroup->FirstChildElement();for (; ClCompile != NULL; ClCompile = ClCompile->NextSiblingElement()){string dir = ClCompile->Attribute("Include");TiXmlElement* Filter = ClCompile->FirstChildElement();dir = dir.substr(0, dir.find_last_of('\\'));Filter->FirstChild()->ToText()->SetValue(dir.c_str());//cout << dir.c_str() << endl;vector<string> arr;subDir(arr, dir, '\\');for (int i = 0; i < arr.size(); i++){if (OldDirset.insert(arr[i]).second){NewDirset.insert(arr[i]);}}}}//add set<string>::iterator itset = NewDirset.begin();for (; itset != NewDirset.end(); itset++){GUID guid = CreateGuid();//cout << GuidToString(guid).c_str() << endl;TiXmlElement Filter("Filter");Filter.SetAttribute("Include", itset->c_str());TiXmlElement UniqueIdentifier("UniqueIdentifier");TiXmlText text(GuidToString(guid).c_str());UniqueIdentifier.InsertEndChild(text);Filter.InsertEndChild(UniqueIdentifier);FirstItemGroup->InsertEndChild(Filter);}//filepath += ".new";doc.SaveFile(filepath.c_str());cout << "修改完成!" << endl;return 0;}

代码中有用到tinyxml来解析xml文件,tinyxml是一个比较简单的解析xml的开源库。

需要解析的xml文件就是创建项目时生成的redis-3.0.3.vcxproj.filters文件(可以用文本编辑器打开)。这个文件就是存放目录结构的。

未修改前的内容如下:

<?xml version="1.0" encoding="utf-8"?><Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  <ItemGroup>    <Filter Include="Source Files">      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>    </Filter>    <Filter Include="Header Files">      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>    </Filter>    <Filter Include="Resource Files">      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>    </Filter>  </ItemGroup>  <ItemGroup>    <ClCompile Include="deps\hiredis\async.c">      <Filter>Source Files</Filter>    </ClCompile>    <ClCompile Include="deps\hiredis\dict.c">      <Filter>Source Files</Filter>    </ClCompile>    <ClCompile Include="deps\hiredis\hiredis.c">      <Filter>Source Files</Filter>    </ClCompile>    <ClCompile Include="deps\hiredis\net.c">      <Filter>Source Files</Filter>    </ClCompile>    <ClCompile Include="deps\hiredis\sds.c">      <Filter>Source Files</Filter>    </ClInclude>  </ItemGroup>  <ItemGroup>    <None Include="deps\jemalloc\doc\jemalloc.html" />    <None Include="deps\lua\doc\contents.html" />    <None Include="deps\lua\doc\lua.html" />    <None Include="deps\lua\doc\luac.html" />    <None Include="deps\lua\doc\manual.html" />    <None Include="deps\lua\doc\readme.html" />  </ItemGroup></Project>

编译运行上面的C++代码,运行后需要输入改xml文件的绝对路径,最后完成转换的结果:

<?xml version="1.0" encoding="utf-8" ?><Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">    <ItemGroup>        <Filter Include="Source Files">            <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>            <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>        </Filter>        <Filter Include="Header Files">            <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>            <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>        </Filter>        <Filter Include="Resource Files">            <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>            <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>        </Filter>        <Filter Include="deps">            <UniqueIdentifier>{D34CA6D3-DD88-4FA7-B52A-BDC0480F1FB1}</UniqueIdentifier>        </Filter>        <Filter Include="deps\hiredis">            <UniqueIdentifier>{5FCE7BC3-C054-45B2-81E0-EF29C4AF240C}</UniqueIdentifier>        </Filter>        <Filter Include="deps\hiredis\adapters">            <UniqueIdentifier>{9DB48CBC-F7AC-406F-A70A-235C5D5FC916}</UniqueIdentifier>        </Filter>        <Filter Include="deps\hiredis\examples">            <UniqueIdentifier>{B299793D-0095-45F8-BCBA-C11844B3CFB6}</UniqueIdentifier>        </Filter>        <Filter Include="deps\jemalloc">            <UniqueIdentifier>{93F4662C-C059-4BB8-8381-062EB1A4B12E}</UniqueIdentifier>        </Filter>        <Filter Include="deps\jemalloc\include">            <UniqueIdentifier>{9E64DE79-62CC-4CE3-9271-9908F388D4BB}</UniqueIdentifier>        </Filter>        <Filter Include="deps\jemalloc\include\jemalloc">            <UniqueIdentifier>{DE8EDE81-603D-4CF9-9885-3AE3380860FB}</UniqueIdentifier>        </Filter>        <Filter Include="deps\jemalloc\include\jemalloc\internal">            <UniqueIdentifier>{4AF6EA5B-2DFA-4965-B1D8-7442119B7755}</UniqueIdentifier>        </Filter>        <Filter Include="deps\jemalloc\include\msvc_compat">            <UniqueIdentifier>{7F160533-EBE4-4F9A-80A5-49F888D9033F}</UniqueIdentifier>        </Filter>        <Filter Include="deps\jemalloc\src">            <UniqueIdentifier>{5E7A71E6-291E-4A32-98B2-04F2FEB347CE}</UniqueIdentifier>        </Filter>        <Filter Include="deps\jemalloc\test">            <UniqueIdentifier>{FD7A2F3C-C10C-4463-B4AF-41EF52B7F141}</UniqueIdentifier>        </Filter>        <Filter Include="deps\jemalloc\test\include">            <UniqueIdentifier>{29307E19-750E-4509-B239-3281203C9CC4}</UniqueIdentifier>        </Filter>        <Filter Include="deps\jemalloc\test\include\test">            <UniqueIdentifier>{636661AB-0845-47C2-B7EE-D667C829F421}</UniqueIdentifier>        </Filter>        <Filter Include="deps\jemalloc\test\integration">            <UniqueIdentifier>{C63C02A4-6A78-48BD-ABEC-C7197F14BBE9}</UniqueIdentifier>        </Filter>        <Filter Include="deps\jemalloc\test\src">            <UniqueIdentifier>{BEFDC11B-D0DA-4581-A452-3746B13BD988}</UniqueIdentifier>        </Filter>        <Filter Include="deps\jemalloc\test\unit">            <UniqueIdentifier>{4AEF0C3E-0EFE-4472-BD20-CD7CF6958FC8}</UniqueIdentifier>        </Filter>        <Filter Include="deps\linenoise">            <UniqueIdentifier>{A0077467-15B9-4E7E-8E9D-731843C11318}</UniqueIdentifier>        </Filter>        <Filter Include="deps\lua">            <UniqueIdentifier>{E10A0597-470C-4CC2-9FAE-F6E75EB1C218}</UniqueIdentifier>        </Filter>        <Filter Include="deps\lua\etc">            <UniqueIdentifier>{D60673A9-E0E9-43BF-B4A5-6023E54DC8C8}</UniqueIdentifier>        </Filter>        <Filter Include="deps\lua\src">            <UniqueIdentifier>{583E2353-9523-4B95-92D3-CE839EB520C4}</UniqueIdentifier>        </Filter>        <Filter Include="src">            <UniqueIdentifier>{48284D98-9517-4DB8-9AB4-B8DAFA01F816}</UniqueIdentifier>        </Filter>    </ItemGroup>    <ItemGroup>        <ClCompile Include="deps\hiredis\async.c">            <Filter>deps\hiredis</Filter>        </ClCompile>        <ClCompile Include="deps\hiredis\dict.c">            <Filter>deps\hiredis</Filter>        </ClCompile>        <ClCompile Include="deps\hiredis\hiredis.c">            <Filter>deps\hiredis</Filter>        </ClCompile>        <ClCompile Include="deps\hiredis\net.c">            <Filter>deps\hiredis</Filter>        </ClCompile>        <ClCompile Include="deps\hiredis\sds.c">            <Filter>deps\hiredis</Filter>        </ClCompile>    </ItemGroup>    <ItemGroup>        <None Include="deps\jemalloc\doc\jemalloc.html" />        <None Include="deps\lua\doc\contents.html" />        <None Include="deps\lua\doc\lua.html" />        <None Include="deps\lua\doc\luac.html" />        <None Include="deps\lua\doc\manual.html" />        <None Include="deps\lua\doc\readme.html" />    </ItemGroup></Project>

重新打开项目之后的结果如下:


大功告成!!!

0 1
原创粉丝点击