cmd文件的写法
rem 更新服务器
icepatch2calc.exe .\patch
icepatch2server.exe --IcePatch2.Endpoints="tcp -h 127.0.0.1 -p 8000" .\patch
pause
cmd所在的的文件夹里面放有:
1、patch文件夹主要放要更新的文件!
2、icepatch2calc.exe文件(计算文件,压缩)
icepatch2calc 使用如下句法
icepatch2calc [option] data_dir [file...]
一般来说,你会简单指定一个数据目录来运行icepatch2calc,这样程序就会在数据目录中压缩所有的文件,和在创建的校验和文件为每一个文件或者目录创建一项纪录。
你同样可以在命令行中指定文件和目录,在这种情况下,icepatch2calc仅为指定的文件或者目录压缩和计算校验和。这对你拥有非常大的文件树而只对其中做了很小一部分更新时
非常有用。你指定的文件名或者目录名必须是相对于数据目录,如果你使用绝对路径,路径名必须使用数据目录作为前缀。
命令支持以下选项
--h, --help
--v, --version
--z, --compress
通常,icepatch2calc仅仅在文件没有压缩版本存在或者文件压缩版本的修改时间早于没有没有压缩版本才扫描数据目录和压缩一个文件。如果你指定--z,这个工组将会重新扫描和压缩整个数据目录而不管文件的时间戳,这对怀疑数据目录的时间戳可能出错的情况下很有用。
--Z, --no-compress
这个选项允许你创建一个客户端校验和文件。
不要使用这个选项为服务器创建校验和文件。这个选项是为创建客户端 IcePatch.sum文件,用来在分发版本中更新软件。
--i, --case-insensitive
这个选项仅对禁用文件名不同,
--V, --verbose
这个选项将输出每个被压缩和计算校验和的消息。
3、icepatch2server.exe文件(运行服务器)
一旦你在数据目录上行了icepatch2calc命令,你可以启动icepatch2server了。
$ icepatch2server
服务器期待数据目录作为唯一的命令行参数,如果你忽略指定目录,服务器将使用配置文件中 IcePatch2.directory属性值来决定使用哪个目录。
服务器有两个不同的endpoint,一个是常规操作,一个是用来管理
IcePatch2.Endpoints
这个属性决定服务器在哪个endpoint监听客户端请求,必须指定。
IcePatch2.Admin.Endpoints
如果这个属性没有指定,关掉服务器只能使用kill命令。如果指定,服务器就提供了附加的IcePatch2::Admin接口:
interface Admin{
void shutdowm();
};
默认情况下,这个对象的标识为 IcePatch2/admin,你可以通过设定IcePatch2.InstanceName属性来更改标识的类别。
调用shutdown操作来关掉服务器,注意任意访问到admin接口端点的客户端都能关掉服务,一般你需要设定这个属性来组织怀有敌意的客户端访问。
icepatch2server 选项
-h, --help
-v, --version
4、cmd命令,path=;看看需要什么ice文件,找到并放在其中!
客户端
1、Ice::CommunicatorPtr communicator;
communicator = Ice::initialize();
通过调用Ice.initialize()初始化Ice run time状态,传递sys.argv参数是因为服务器要接受一些命令行参数,调用initialize返回的结果是一个Ice::Communicator的引用。这是Ice run time 的主句柄。
2、properties->setProperty("IcePatch2.Endpoints", 端口名字toStdString());
主要给客户端Endpoints赋值
3开始打补丁
properties->setProperty("IcePatch2.Directory", "./update");
string thorough = "0";
properties->setProperty("IcePatch2.Thorough", thorough);
properties->setProperty("IcePatch2.Remove", remove);
remove为0是不删除,为1时全部删除!
ObjectPatcherFeedbackPtr feedback = new ObjectPatcherFeedback(this);
IcePatch2::PatcherPtr patcher = new IcePatch2::Patcher(_communicator, feedback);
如果端点的格式有问题,或者指定了未知的协议,应用会收到Ice::EndpointParseException。
bool aborted = !patcher->prepare();
if(!aborted)
{
aborted = !patcher->patch("");
}
if(!aborted)
{
patcher->finish();
}
4、对比客户端和服务器端*。sum文件是否一样
bool AutoUpdater::isSame()const
{
std::ifstream in("./update/IcePatch2.sum");
std::istreambuf_iterator<char> beg(in),end;
std::string updatefile(beg,end);//将文件内容全部读入内存
in.close();
std::ifstream curent_in("./IcePatch2.sum");
std::istreambuf_iterator<char> curent_beg(curent_in),curent_end;
std::string curentfile(curent_beg,curent_end);//将文件内容全部读入内存
return updatefile==curentfile;//比较文件内容是否相等
}
5、启动拷贝程序进程,返回值指示启动是否成功
a、//启动拷贝程序进程
bool AutoUpdater::startUpdateProcess()const//启动拷贝程序进程
{
QStringList arg;
arg.append("./update");
arg.append(".");
DWORD id=GetCurrentProcessId();
arg.append(QString::number(id));
return QProcess::startDetached("./update/updater.exe",arg);
}