在工程中积累经验 之 程序目录使用二三事

最近做工程比较多,其实也就是实验室的事吧,以后工作了也是会工程任务比较多吧。

为了方便自己积累经验,有很多工程性的东西是需要注意的,这些经验性的东西积累起来应该会给以后的工作带来很多好处。就像设计模式一样,都是一些处理相关问题的经验型方法,如果能很好地整理并且掌握这些经验,对很好的提高自己的工程能力吧。

    这次要讲述程序工作目录相关问题,不注意的话可能会出问题哦。

比如说现在让你完成一个组件,如果用C++的方式来描述,就是说你要完成一个库,这个库可以是静态库也可以是动态库,让别人调用你。正好你的库程序需要读取配置文件,当然这个配置文件是你自己定义的。

那么这个时候问题来了,你往往会喜欢使用相对目录作为寻找这些文件的路径。但是你的库如果被挪了位置呢?比如说同事把你的静态库文件挪到了他自己的lib目录下,而没有把你的库需要读取的配置文件一并挪过去,于是你的程序就无法定位到那些文件,于是出问题了。

这个时候你的同事可能会要求你改,他希望你改成不依赖库所在位置,还能正常读取配置文件。

不好的解决方法:

这个时候你可能会想那好办,我在程序里面加一句程序,将当前工作目录指向我之前放置这些配置文件的目录不就解决问题了嘛。比如说在C++中,你可以使用unistd.h头文件下的chdir来改变当前工作目录。

仔细想想,为什么说这个方法不好?你想,别人调用你的静态库,那么很有可能他自己维护了一套相对路径。那么这个时候好了,你把整个程序的当前工作目录改变了,那完了,对方的那一套路径都乱掉了。于是调用你程序的人一牵涉到读取文件的地方,统统出问题了。

其实就是说,被调用者的程序,最好是不要改变当前整个程序的工作状态,包括当前工作目录呀,至少如果改变了要通知调用者。

你可能会想,那好吧,我每次修改当前工作目录之前,把原来的工作目录保存下来,等我执行完了我的程序再把当前工作目录改回去。当然如果你能保证这样调用不出问题,那也算是勉强可行吧,只要你愿意在你调用的地方都这样做。

一种妥协的解决方法:

    其实这个方法也没有什么特别的,但是从个人经验和可扩展性上来讲,我觉得都是不错的解决方法。

首先你自己在写程序的时候,你要明确你的库有一个运行时目录,也就是你要读取的配置文件、程序运行的log或者其他程序依赖的东西都应该在这个目录下。那么好了,当别人调用你的库,你要让对方指定你的运行目录,也就是传递给你一个路径,你的模块运行的需要的东西都应该在这个目录下。

于是好了,你的同事可以把你的库放到任何位置,只需要调用你函数时,正确指定你的模块运行时路径就行了。这样他就可以安心的把你的.so或.a文件移到他工程目录的lib目录下,并且另外指定一个目录作为该模块的运行时目录。这样你的模块的输入输出,写文件、读文件就都指向到了这个目录,有什么问题也能很好的排查了。

结束语

这个问题你们有的人应该也碰到过,如果还没碰到的朋友,可以稍稍留心一下这种解决方法,就避免后面来回修改程序。

当然这种经验的总结算不上什么高大上的算法,然而实际上在工程中,正是这一点点的经验,大大的提高了开发效率,帮助我们设计出更好的程序。

如果朋友们有什么更好的方法来解决这个问题,欢迎一起讨论。谢谢。

时间: 2024-10-11 09:01:18

在工程中积累经验 之 程序目录使用二三事的相关文章

程序员英语二三事(4) - 应聘外企常用英语(1) - 从投简历开始

这是<程序员英语二三事>系列文章之一. 应聘外企会有如下几个环节: 投递简历 电话通知或电话面试 现场面试. 拿到Offer入职. 先从投简历开始说起. Resume:你的简历 CV / Cover Letter: 很久很久以前,外国在没有互联网的时候,因为地广人稀,是用传统的信件来应聘.那时候会针对具体每个职位写一封应聘信,附在简历上面.这就是Cover Letter,简称CV.这个传统在互联网时代延续下来了. 那么Resume和CV的区别是什么呢?Resume是通用的简历,每个职位你都可以

python中常用的文件和目录操作(二)

OS模块 一. 概述 python os模块提供了非常丰富的方法用来处理文件和目录 二. 导入:import os 三. 常用方法 1. os.name 输出字符串表示正在使用的平台,如果是windows则用"nt"表示,如果是Linux/Unix,是"posix" import os print(os.name) 结果: nt 2. os.getcwd()  得到当前的工作目录,即当前python脚本工作的目录路径 import os print(os.getcw

Java中的匿名内部类及内部类的二三事

匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用. 定义匿名类的格式如下: new 实现接口() |父类构造器(实参列表){ //匿名内部类的类体部分 } 从定义来看,匿名内部类必须继承一个父类,或者实现一个接口,但是最多只能继承一个父类或者实现一个接口. 关于匿名内部类,还有如下两条规则: 匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象.因此不允许将匿名内部类定义成抽象类. 匿

分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据

原文:分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据 分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据 今天开发找我,说数据库insert不进数据,叫我看一下 他发了一个截图给我 然后我登录上服务器,发现了可疑的地方,而且这个数据库之前有一段经历 在月初的时候这个数据库曾经置疑过,启动不起来 Could not redo log record (163041:116859:5), for transaction ID (0:-1175226963), on

VS2010应用程序工程中文件的组成结构

  用应用程序向导生成框架程序后,我们可以在之前设置的Location下看到以解决方案名命名的文件夹,此文件夹中包含了几个文件和一个以工程名命名的子文件夹,这个子文件夹中又包含了若干个文件和一个res文件夹,创建工程时的选项不同,工程文件夹下的文件可能也会有所不同. 如果已经以Debug方式编译链接过程序,则会在解决方案文件夹下和工程子文件夹下各有一个名为“Debug”的文件夹,而如果是Release方式编译则会有名为“Release”的文件夹.这两种编译方式将产生两种不同版本的可执行程序:De

VS2013 MFC应用程序工程中文件的组成

 前言: Debug文件  Release文件 Debug版本的可执行文件中包含了用于调试的信息和代码,而Release版本则没有调试信息,不能进行调试,但可执行文件比较小 1.解决方案相关文件 解决方案相关文件包括解决方案文件夹下的.sdf文件..sln文件..suo文件和ipch文件夹. .sdf文件和ipch目录一般占用空间比较大,几十兆甚至上百兆,与智能提示.错误提示.代码恢复和团队本地仓库等相关. .sln文件和.suo文件为MFC自动生成的解决方案文件,它包含当前解决方案中的工程

VS2010-MFC(VS2010应用程序工程中文件的组成结构)

转自:http://www.jizhuomi.com/software/143.html 用应用程序向导生成框架程序后,我们可以在之前设置的Location下看到以解决方案名命名的文件夹,此文件夹中包含了几个文件和一个以工程名命名的子文件夹,这个子文件夹中又包含了若干个文件和一个res文件夹,创建工程时的选项不同,工程文件夹下的文件可能也会有所不同. 如果已经以Debug方式编译链接过程序,则会在解决方案文件夹下和工程子文件夹下各有一个名为"Debug"的文件夹,而如果是Release

SCCM2012软件中心的“从应用程序目录中查找其他应用程序”打不开的解决方法

软件中心的"从应用程序目录中查找其他应用程序"处可以打开部署的应用程序,刚部署完后打开怎么没反应呢? IIS在SCCM服务器上,登到服务器从本地打开提示错误 Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

通过assets像安卓程序目录中导入数据库文件出现错误的解决办法

错误提示如下,下面的错误信息 08-13 07:36:31.396: W/System.err(9814): java.io.IOException 08-13 07:36:31.416: W/System.err(9814):  at android.content.res.AssetManager.readAsset(Native Method) 08-13 07:36:31.416: W/System.err(9814):  at android.content.res.AssetMana