利用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
- 利用VS根据文件目录结构创建C++工程自己简单实现的方法
- Qt工程的目录结构创建
- vs中工程目录结构出错的解决办法
- 配置一个干净的VS C++工程目录结构
- 如何根据SeetaFaceDetection教程创建自己的工程
- 如何根据Seeta教程创建自己的工程
- 利用C语言创建、删除目录,批量创建文件
- 自动添加当前目录下的文件到vs工程
- VS工程目录下各文件的含义
- 利用一个简单的递归实现打印目录的层次结构
- Eclipse创建Web工程的目录结构及含义
- 一个简单的创建ndk文件目录结构来编译源文件的框架的小脚本
- VS配置头文件目录和库目录的方法
- [C++_Windows]Git 的文件目录结构
- 一种从数据库利用xml创建树型目录的方法(C#)(一)
- 一种从数据库利用xml创建树型目录的方法(C#)
- 【Visual Studio】VS 工程目录与文件
- 利用visual studio创建只有makefile文件的工程文件
- 在linux中添加ftp用户,并设置相应的权限
- Android APP - BlackContact 最后实现
- iOS APP提交上架最新流程 (菜鸟级别的请进)
- C#异常处理和数据类型转换
- sqlalchemy基础
- 利用VS根据文件目录结构创建C++工程自己简单实现的方法
- iptables和tc的使用及开发实例总结
- IOS基础分享
- List与ArrayList起头的区别
- Android中GridView(网格视图)效果源码(十五)
- ios程序打包成ipa包过程
- 五种 SQL on Hadoop 的全面分析,星环让去IOE再非空谈(哈哈)
- [LeetCode] Perfect Squares
- 什么是虚拟主机?