C++文件拷贝代码
副标题#e#
用C++些文件拷贝措施远远比我想象的要坚苦的多,和C#仅利用的File类和Directory类对比,直接操纵windows api越发有趣。这个进程让我体会到的不只仅是api,更多是编写措施这一个进程的本质。
先和各人分享一下我的代码,还请列位C++前辈们指教。
.h文件
#pragma once
#include <string>
#include "file.h"
using namespace std;
namespace Common
{
namespace File
{
class SyncFolder : public Common::File::FileClass
{
private:
wstring m_sourceDirectory;
wstring m_targetDirectory;
const wstring * m_ext;
const bool * m_reverseExt;
protected:
void FileMethod(const wstring&);
public:
SyncFolder(const wstring &sourceDirectory, const wstring &targetDirectory,const wstring &ext, bool reverseExt):FileClass(),
m_sourceDirectory(Common::File::GetSecurePath(sourceDirectory)),m_targetDirectory(Common::File::GetSecurePath(targetDirectory))
{
m_ext = new wstring(ext);
m_reverseExt = new bool(reverseExt);
}
~SyncFolder(void)
{
delete m_ext;
delete m_reverseExt;
}
void Exec();
};
}
}
#p#副标题#e#
.cpp文件
#include "StdAfx.h"
#include "SyncFolder.h"
#include "File.h"
void Common::File::SyncFolder::Exec()
{
ReadFiles(m_sourceDirectory, *m_ext);
}
void Common::File::SyncFolder::FileMethod(const wstring& fileName)
{
//获取相对路径
wstring offsetPath =
Common::File::GetRelativePath(m_sourceDirectory,
Common::File::GetPathFromFilePath(fileName));
//获取新路径
wstring targetFilePath;
if(offsetPath.empty())
targetFilePath = m_targetDirectory;
else
targetFilePath = m_targetDirectory + L"\\" + offsetPath;
//建设文件夹
Common::File::CreatePath(targetFilePath);
//建设新文件路径
wstring newFileName = targetFilePath + L"\\" + Common::File::GetFileNameFromFilePath(fileName);
//复制文件
CopyFile(fileName.c_str(), newFileName.c_str(), true);
}
其实在之前的一篇blog中,我写了一个遍历文件目次的函数( 文件夹遍历代码C++(win32平台)),在这个函数的参数列表中,有一个函数指针。我的意图是通过这个函数指针,可以或许处理惩罚遍历到的文件。由于在C#中,可以通过delegate来声明一个雷同与函数指针的范例,然后通过该范例来界说一个工具来指向执行要领的地点,所以我也想在C++中如法炮制。但是最后C++编译器汇报我,这种写法是错误的。在C++中,函数指针指向的是一个静态地点,假如我要将指针指向类实例的一个成员要领,这在C++中是不答允的(传闻boost中一个办理要领)。这让我大白了C++和C#中相似的处所并不沟通。不外这也给了我想象的空间:去想象C#编译器是如何用delegate去实现函数指针的成果的可能说它们之间有本质的区别。
别的一个很重要的体验是,C++的开拓情况远没有C#那么智能(VS2008),出格是智能感知那一块。这让我在最开始些代码的时候老是感想不稳,像一个醉汉走路,摇摇晃晃的。厥后我发明,这种担忧源于我本身对C++编译器的范例查抄特性没有充实的认识。我们可以安心斗胆的去写代码,然后compile,假如有问题,编译器会很准确的汇报你。这种认识对重构代码很有辅佐。在之后的事情中,对付那些C#代码,我都感很安心的去重构,因为编译器会汇报我问题出在什么处所。也就是基于这种认识,在写C#代码的时候,只管制止利用像datatable之类的范例,因为编译器不能对个中的数据范例举办范例查抄,这样我们也就享受不到编译器范例查抄这项成果带来的实惠。
尚有就是单位测试的事情方法。最开始写C++代码,每写一行代码我都不敢确定它的输出功效是正确的或是什么样子。为了办理这个问题,我根基上为每个函数编写专门的调试代码。厥后我发明这是一种不错的事情方法,效率很高。这种事情方法就是在.net世界中的单位测试呀。
总之,C++的进修让我受益匪浅。但愿可以或许和各人多多交换。