您的位置:首页 > 编程语言 > C语言/C++

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

2015-11-06 18:28 1136 查看
相信程序员都有过这样的经历。

一些开源的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>


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



大功告成!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: