利用VS根据文件目录结构创建C++工程自己简单实现的方法
2015-11-06 18:28
1136 查看
相信程序员都有过这样的经历。
一些开源的C、C++代码库大多数是在linux下面开发的。为了能在windows下面用VS方便查看代码,可以利用VS根据已有代码来创建C++项目。简单步骤如下:
第一步:打开VS,点击“文件”菜单,在弹出菜单选择“新建”,最后选择“从现有代码创建项目”;
第二步:根据向导创建VC++项目,
找到已有代码的文件,添加进来
使用VS来生成项目,项目类型这里是控制台应用,最后点击完成就可以生成项目了。
最后生成的项目结构目录如下,一点层次结构都没有了:
第三步:自己写代码来实现自动建立目录结构,这里贴上自己写的代码:
代码中有用到tinyxml来解析xml文件,tinyxml是一个比较简单的解析xml的开源库。
需要解析的xml文件就是创建项目时生成的redis-3.0.3.vcxproj.filters文件(可以用文本编辑器打开)。这个文件就是存放目录结构的。
未修改前的内容如下:
编译运行上面的C++代码,运行后需要输入改xml文件的绝对路径,最后完成转换的结果:
重新打开项目之后的结果如下:
大功告成!!!
一些开源的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> #endif GUID CreateGuid() { GUID guid; #ifdef WIN32 CoCreateGuid(&guid); #else uuid_generate(reinterpret_cast<unsigned char *>(&guid)); #endif return guid; } std::string GuidToString(const GUID &guid) { char buf[64] = { 0 }; #ifdef __GNUC__ snprintf( #else // MSVC _snprintf_s( #endif buf, 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>
重新打开项目之后的结果如下:
大功告成!!!
相关文章推荐
- c++序列容器
- vc++各种文件的作用
- c语言学习之基础知识点介绍(十八):几个修饰关键字和内存分区
- C++ operator关键字(重载操作符)
- 100盏灯的问题(C语言实现)
- C++中不要在写void类型啦
- vs2013 c++小代码运行完了不退出的方法
- C++获取数字证书的序列号
- 一起用C++写个轻量的搜索引擎(一)
- C++学习:模板类学习
- C语言:浮点数在内存中的表示
- c++ inline
- C语言文件与目录(五)移动与复制
- C++进阶学习——单向链表的实现
- 用C语言实现对冗余层发送的数据包进行过滤判断处理
- C++中的友元
- STL容器之map与hash_map
- Ackerman的递归与非递归算法
- C++ explicit关键字
- Java与C/C++互调用法(JNI调用第三方库)