回 帖 发 新 帖 刷新版面

主题:路径,真的很难吗?(系列一)

供初学者和爱好者参考

用老狐狸搞开发(哪怕仅仅是学习阶段),往往生成一大堆文件(并且可能需要其它的许多文件,比如图片啊、资源啊、头文件啊等等),这就涉及到这些文件的保存位置的问题。初学者常常遇到找不到文件的事情,我明明做了一个form1,也保存了,文件名是form1.scx,可是我DO FORM form1,竟然说找不到文件;更有甚者,说:我保存了表,但退出VFP后,我不知道表文件哪里去了?老鸟们会觉得可笑,不过当初俺也是经常遇到这样的情况。今天不妨谈谈。

先举个例子。比如你的盘上确实有个表tb1.dbf(假设表tb1.dbf保存在E:\123文件夹中,这个假设在本贴后面仍然有效),当你 Use tb1.dbf 时,VFP却毫不客气弹出对话框“找不到tb1.dbf”。这个“找不到”对话框给我们一些提示,一是你一定使用了这样的命令,该命令要使用一个盘上的文件(比如DO个prg、USE个表);二是VFP去寻找过你要用的文件,只是没找到。为什么找不到,明明有嘛?你这个老狐狸在哪儿找文件的?是不是没有到E:\123文件夹中找?

这就要求我们应该了解VFP寻找文件遵循的规则。那些使用文件的命令在语法上允许文件名带有完整路径(绝对路径),因此如果给出文件完整路径并且文件确实在那里,那么这个“找不到”对话框永远都不会出现。使用 Use E:\123\tb1.dbf 没问题,它直接指明了VFP到E:\123文件夹中找个叫tb1.dbf的文件,这当然OK。看来照猫画虎,如果我有个xxx.scx在F:\test\1文件夹中,那么运行这个表单就用 DO FORM F:\test\1\xxx.scx ,对极了。

不过、不过,不要以为这就一切OK了,那些命令同样允许文件名以相对路径的形式出现(后面将会谈到事实上我们应该采用相对路径),看看 Use tb1.dbf ,仅仅出现文件名(其实隐含着相对路径,就是当前工作路径),换句话说,VFP要到当前的工作路径下去寻找tb1.dbf,那么工作路径是什么?

1.VFP的工作路径(以下提到的工作路径、工作目录、工作文件夹3个概念相同,好比土豆、马铃薯、洋芋)

通俗地讲,工作路径就是一个文件夹(早期称为目录),VFP把生成的文件默认存放到这个文件夹(除非你在保存时指定了其它文件夹),并且当VFP要使用文件时(特别是以相对路径形式写出的命令),也在这个文件夹中找(这个说法不全面,后面补充)。所以工作路径很、十分、非常、very重要,使用VFP时,你应该时刻清楚目前的工作路径是什么。

不管372十1,命令窗口中执行命令 ?SYS(5)+SYS(2003) 总能显示出当前工作路径是什么。假如你执行了该命令,并且假设在主窗口中显示D:\MYPRJ,那说明当前工作路径是D盘的MYPRJ文件夹,这时执行 Use tb1.dbf ,VFP就会在D:\MYPRJ中寻找tb1.dbf。于是,讨厌的“找不到”对话框就来了。

说到这里,你应该有一些想法:“嗯,如果我的表tb1.dbf就保存在D:\MYPRJ中;或者要是工作路径就是E:\123,那么执行 Use tb1.dbf 应该没问题”。Very Good 这样的想法很正确。
这包含两个方面的问题,一是保存文件时应该放到哪里的问题,二是更改工作路径的问题。

这里我们继续谈工作路径。

当你安装VFP时,如果一路“确定”、“OK”、“同意”......(傻瓜式安装),一般的安装于系统盘的Program Files文件夹下的Microsoft Visual FoxPro 9文件夹。这里假设系统盘是C,则完整的安装路径是C:\Program Files\Microsoft Visual FoxPro 9\。按常规方式启动VFP(开始-程序-......),并且没有做过工作路径的更改(怎么改后面说),VFP有个默认的工作路径,就是"我的文档"下面自动建一个Visual FoxPro Projects的文件夹。换句话说,你用VFP生成的项目、表、表单等等,统统往这里存放。你可以用?SYS(5)+SYS(2003)在命令窗口中执行一下看,或者Tools菜单中选择Options,弹出对话框中找到File Locations页面,里面有个Default Directory项,选中它单击Modify按钮,可以看到新弹出的窗口中有灰色的路径,正是"我的文档"下面的Visual FoxPro Projects文件夹。这是个改进,早期版本的默认工作路径就是安装路径,那是比较糟糕的,因为安装路径下面有许多VFP的系统文件,如果直接使用这个工作路径,你自己生成的一大堆文件和这些已有文件混在一起,会很麻烦。9版本的这个改进还算不错,不过,嘿嘿,9版本很容易重犯老毛病(后面说)。

现在,你生成任何文件,如果没有在保存对话框中改变文件夹,或者使用命令生成文件,并且命令中文件名都不带路径,那么都会保存到"我的文档"下面的Visual FoxPro Projects文件夹中,那么你DO个FORM、USE个表,VFP会在这个文件夹中找东西,呵呵,都在,那没问题。可问题还是有,试想你在学习阶段今天建个项目、明天又建另一个项目,所有文件都在一起,岂不乱套。所以我们常常一个项目一个文件夹,各自分开,并且不一定非要在Visual FoxPro Projects文件夹中。这就涉及到更改工作路径。

(等等,我刚开始学习不久,还不清楚你说的项目为何物,也要象你说的,得考虑文件保存位置,还有什么工作路径吗?
是的,应该考虑。比如你才开始学习建表建库,必然要生成文件,如果不考虑路径,今天完成实验1,建一个商品库,明天完成实验2,建一个图书资料库,这些文件默认全都放到同一个工作路径下,混杂在一起,是很麻烦的。而且往往初学时喜欢用VFP给的默认文件名table1啊table2啊的,很可能今天建的table1覆盖了昨天建的table1,昨天的实验成果就玩完了。好的方式是针对不同的实验,建不同的文件夹,进行每一个实验时,先把对应的文件夹设置为工作文件夹。)

2.更改工作路径
先说一个不用做任何设置而改变工作路径的懒办法(该办法适用于你没有对工作路径进行过更改,包括使用菜单方式、命令方式以及配置文件的方式更改),不用常规方式启动VFP,直接到保存有VFP文件(dbf啊、prg啊、scx啊、mnu啊等等)的文件夹,双击某个文件,VFP启动并打开该文件,这时工作路径就是该文件夹。比如直接打开E:\123文件夹,双击tb1.dbf,这时工作路径就是E:\123。(特别提醒,不推荐双击dbf文件,原因不在本贴涉及范围,故不讨论,一般去双击项目文件prj)
本段小结:在没有使用菜单方式、命令方式以及配置文件的方式更改工作路径时,从哪个文件夹双击VFP的文件,工作目录就是哪个文件夹。

这个特性可以解释下面的例子:
我没更改过工作路径,我建了一个表单xxxx.scx,保存时我特意在保存对话框中换了一个文件夹(比如D:\myscx),接着在命令窗口执行DO FORM xxxx.scx ,系统说找不到。我关闭VFP,直接打开D:\myscx文件夹,双击xxxx.scx文件,VFP启动并出现表单设计器,这时执行DO FORM xxxx.scx就可以。

下面来说通过设置改变工作路径,其实上面已经说到了3种方法,先看菜单方式,就是Tools菜单中选择Options,弹出对话框中找到File Locations页面,里面有个Default Directory项,选中它单击Modify按钮,新弹出的窗口中选中Use Default Directory,这时可以直接输入路径或者单击3个小点按钮选择某个文件夹,然后确定。接下来你将面临两种选择,一是直接确定,另一个是先Set As Default(设为默认)再确定。第一种选择是短命的,一旦退出VFP,再启动,你的设置就白费了。第二种长命百岁,任何时候启动VFP,工作路径都是那个设置好的路径,除非你又改过。
这里顺便说说刚才提到的老毛病,那就是当你通过菜单又把Use Default Directory改为不使用,并且先Set As Default再确定。看似回到了刚安装时候的状态,不过这时退出再次启动,默认工作路径就成了安装路径了。

再看命令方式,习惯上使用SET DEFAULT TO <路径> 命令,当然还有些命令也会改变工作路径,但不推荐。这种命令更改的方式等效于菜单方式下的短命设置,只要退出VFP,这个设置就玩完了。

最后说说配置文件,你可以自行建立一个文本文件,命名为config.fpw,文件中可以来一句: DEFAULT=<路径>,并把它保存到VFP的安装路径下,那么VFP正常启动时就会把你写的路径设置为工作路径。(配置文件绝对是个好东东,很有用,不过下文不再出现它,因为和本贴涉及的路径内容关系不算特别铁)

不管怎样,现在你应该知道工作路径的概念——VFP工作时使用的一个文件夹,你可以把自己的文件夹设置为工作路径,VFP把生成的文件默认存放到这个文件夹,并且当VFP要使用文件时,也在这个文件夹中找(除非你给出了文件的绝对路径)。这样,你能回答下列常见问题:

(1)我用命令Create tb2生成表文件tb2.dbf,请问我的这个表文件保存到哪里去了?
答:当然保存在工作路径下面(没给路径、直接表名)

(2)我怎么知道当前工作路径?
答:如果你自己设置的,你当然自己清楚;否则......不管怎样都能用命令 ?SYS(5)+SYS(2003) 看到

(3)我想把C:\MyFile\VfpTest文件夹设为工作路径,怎么做?
答:Tools菜单中选择Options(见上文);或者用命令 SET DEFAULT TO "C:\MyFile\VfpTest" 

(4)我的菜单程序mymenu.mpr文件放在工作路径D:\MYPRJ下面的MENU文件夹中,我用DO mymenu.mpr 它说找不到,原因是什么?该怎么办?
答:原因是DO mymenu.mpr没给路径,VFP在D:\MYPRJ中找不到,它不会主动在下级文件夹MENU中找。
解决办法:<1>把D:\MYPRJ\MENU设置为工作路径 然后就能DO mymenu.mpr    &&严重不推荐
          <2>DO D:\MYPRJ\MENU\mymenu.mpr   &&绝对路径形式,严重不推荐
          <3>DO MENU\mymenu.mpr            &&相对路径形式,推荐使用
             这个说明一下:文件名前面有文件夹,但不是完整路径,所以VFP仍旧到工作路径下寻找,不过这回先找MENU文件夹再到里面找文件。
          <4>                               &&暂空,系列二补充 
          <5>                               &&暂空,系列二补充

系列二 内容预告 3.文件应该保存在哪里?
                4.VFP怎么找文件?
                5.相对路径还是绝对路径?

回复列表 (共11个回复)

沙发

我也想过要写一个相关的帖子,这对电脑初学,对路径概念不太了解的朋友有很大帮助。

感谢楼住!

板凳

路径,真的很难吗? 系列二

这几天忙,今天发帖,呵呵

3.文件应该保存在哪里?

一般说来,当我们开发一个项目(或者仅仅是学习阶段的某一个实验练习),都应该先建一个文件夹,并且设置它为工作路径。目的很明确,就是要把文件保存在这个文件夹中。一来便于我们管理这些文件;二来可以用相对路径的形式写命令,这会大大简化编程工作量(一个例子如:表单MainForm.scx保存在C:\Program Files\MyVfpPrj文件夹中,如果MyVfpPrj是工作文件夹,就可以DO FORM MainForm.scx,否则写成DO FORM C:\Program Files\MyVfpPrj\MainForm.scx,麻烦!)。因此除了特殊目的,所有生成的文件都应该在这个文件夹下。这个说法可能有歧义,请不要误会为我所有的scx、mnu、dbf、cdx、prg等等等等都在工作文件夹中,一打开文件夹,哈哈,五花八门,各种文件都看到了。对于实验练习和极简单的项目开发,这样做完全可以。不过对于稍大的项目,应该这样,工作路径下可以有多个下级文件夹。VFP在示例Tastrade中为我们展示了一个项目应该具有什么样的文件夹结构(9版本竟然偷懒了,示例Tastrade文件夹仅仅只给了数据库和表文件,至少我的系统是这样。而Tastrade原本是一个较为详细的开发项目示例,在早期版本中很全面。不过这不影响俺继续谈下去)。一般的,一个项目具有如下文件夹结构:

<项目文件夹>         
     xxx.prj         --项目文件一般直接位于项目文件夹下
     xxx.PJT
     <DATA>          --该文件夹保存数据库、表文件、索引等
     <FORMS>         --该文件夹保存表单文件
     <PRGS>          --该文件夹保存主程序、过程等等.prg文件
     <MENUS>         --该文件夹保存菜单
     <GRAPHICS>      --该文件夹保存用到的图片
     <LIBS>          --该文件夹保存类库
     <REPORTS>       --该文件夹保存报表等
     <HELP>          --该文件夹保存帮助文件
     <INCLUDE>       --该文件夹保存头文件.h

瞧,你应该在开始一个项目时提前生成类似这样的文件夹结构。之所以说类似,是因为我们编程时可能会用“数据”来代替“DATA”、用“表单”来代替"FORMS"...即用汉字命名位于项目文件夹下的各个子文件夹(当然也有用拼音命名的,或者按自己意愿取名的如“信息”、“资料库”等等),并且根据项目的规模,可能用不到上面列出的某些下级文件夹或者需要更多文件夹。你完全可以不用一下子把这个文件夹结构全部建出来,但至少先有一个项目文件夹,并且把它设置为工作路径。之后如果你建一个项目文件,就直接保存到工作路径下,当你建了一个库或者其它文件时请保存到对应的下级文件夹中(没有就在保存时立即生成该文件夹,这是很简单的事)。于是整个文件夹结构很整洁,文件分门别类、条理清晰。进一步的,整个系统开发结束,要发布时,可以轻松地剔除那些不该发布的文件,比如scx啊、mnu啊、prg啊等等等等(什么是发布、哪些文件不该发布不在本贴谈论范围,故不说明了)

如果你正如我上面所言,比如:你有个文件夹D:\test,并打算在这个文件夹下使用VFP做些东西,你把该文件夹设置为工作路径,建了一个表tb1.dbf,保存到下级DATA文件夹中,即这个表的路径是D:\test\DATA\tb1.dbf,当你直接Use tb1.dbf时,VFP极有可能毫不客气弹出对话框“找不到tb1.dbf”。这和我们的意愿(命令能写得简单同时文件保存有条理)不符,要解决这个问题,请看下一节。

4.VFP怎么找文件?

我们先根据上一节的说明作一个假设,比如建一个XX信息管理系统,习惯上我们先建立一个文件夹"XX信息管理系统"作为项目文件夹并且设置为工作路径(假设是E:\XX信息管理系统),该文件夹下面具有上一节描述的文件夹结构,我们生成的文件分门别类保存在对应的文件夹中。

<XX信息管理系统>         
     xx.prj         --项目文件
     xx.PJT
     <DATA>          
            MyDBC.dbc
            tb1.dbf
            tb2.dbf
            ......
     <FORMS>
            frm1.scx
            frm2.scx
            ......
     <PRGS>          
     ......

当我们用命令DO FORM frm1.scx运行表单时,VFP按照如下规则寻找文件:
(1)检查文件名是否采用绝对路径描述,如果是,则直接到那个路径下找文件(本例这里用了相对路径),否则进入下一步;
(2)在工作路径中找文件,如果命令中的文件名前面有部分路径描述,则先在工作路径下找那个部分路径(显然我们的文件frm1.scx不在工作文件夹下,而是在工作文件夹的下一级文件夹中;并且文件名前面没有部分路径描述),找不到则进入下一步;
(3)检查是否设置了搜索路径(后面讲如何设置搜索路径),如果有提供的搜索路径,则在搜索路径中寻找。找不到就弹出“找不到”对话框。当然如果没有设置搜索路径,立刻弹出“找不到”对话框。

上述是老狐狸找文件的一般规则,根据我们写的命令DO FORM frm1.scx,可以清楚老狐狸要进入到第3步规则,能不能找到就看有没有设置正确的搜索路径。

现在我们来看实现运行表单frm1.scx可以采用的方法。其实满足上述3条中任何一条即可。

方法1:DO FORM E:\XX信息管理系统\FORMS\frm1.scx 老狐狸按规则1就能找到,但不推荐
方法2:DO FORM FORMS\frm1.scx                   老狐狸按规则2就能找到
方法3:先把FORMS文件夹设置为搜索路径,然后 
       DO FORM frm1.scx                         老狐狸按规则3就能找到

好,接下来的问题就是如何设置搜索路径
还是两种方法,菜单和命令
菜单方式:Tools菜单中选择Options,弹出对话框中找到File Locations页面,里面有个Search Path(搜索路径)项,选中它单击Modify按钮,新弹出的窗口中可以直接输入路径或者单击3个小点按钮选择,对于初学者建议单击按钮选定,这可以体会语法,你可以多次单击选择不同的路径,注意到那些路径之间用分号隔开,现在你就知道可以设置多个搜索路径并且它们之间用分号分隔,老狐狸在进入规则3时就会按照这些路径一个一个寻找。设置好了然后确定。下面同样有短命和长命问题,请参考系列一,这里不再赘述。(一直没有说明为何长命、短命,啰嗦一下,长命设置会写入系统注册表,每次启动都从注册表读取设置,所以长命)
命令方式:用SET PATH TO <路径列表> ,这个命令等效于菜单方式的短命设置

针对本节的例子,用命令方式设置搜索路径,命令如下:
SET PATH TO DATA;FORMS;PRGS    &&此处设置了3个,你可根据需要添加更多

注意,这个命令中写的3个文件夹又是仅有文件夹名,没有说明哪里的这3个文件夹,同样隐含相对路径,告诉老狐狸这3个文件夹是工作路径下的。
当然了你完全可以写成
SET PATH TO E:\XX信息管理系统\DATA;E:\XX信息管理系统\FORMS;E:\XX信息管理系统\PRGS  
用绝对路径形式告诉老狐狸这3个文件夹在哪里,俺是不愿这样写的。呵呵。

如果你设置了正确的搜索路径,现在Open database MyDBC啊、use tb2啊、do form frm1啊......没问题,我们和“找不到”对话框说拜拜。

上面多次提到绝对路径啊相对路径啊,下一节谈谈这些问题。

5.相对路径还是绝对路径?
当然应该使用相对路径,首先至少命令得到简化,不用写一长串路径描述。另外重要的是保证我们开发的系统拿到其他机器上照样能准确无误的找到文件。比如上一节的XX信息管理系统,开发时文件保存在开发机的E盘下的“XX信息管理系统”文件夹,你使用Use E:\XX信息管理系统\DATA\tb1打开表,没问题。但你不能要求其他机器非要按照开发机一样,可能那个机器根本就没有E盘,或者用户把XX信息管理系统装到C盘某个文件夹下,这样“找不到”对话框就来了。

当我们明白工作路径的概念、找文件的规则后,反而可以不用太过关心路径了。有些初学者和爱好者遇到“找不到”对话框太多了,进而总是担心路径找不到,于是在主程序中还写上 set default to sys(5)+sys(2003),但从命令执行效果看,sys(5)+sys(2003)取得当前工作路径,然后把它设置为工作路径,这完全多余。好比问:“李先生,您贵姓啊?”在开发阶段,我们用菜单设置好长命的工作路径和搜索路径,接下来就不必管它们了,只管去do个prg、use个表......最后打包生成exe之前,可以在主程序中加入搜索路径的设置命令(如果是按照常规项目文件夹结构来的,也可以用配置文件来完成;如果你所有文件都在一起、都在项目文件夹下不含下级文件夹,则连这个命令都可以免了),因为生成exe后,当然通过exe启动系统,exe一般生成在项目文件夹中,则启动后该文件夹就是工作文件夹。你的命令都是相对路径形式,并且搜索路径设置也以相对路径写出,则老狐狸怎么会找不到?

到这里,这个路径系列基本上可以结束了,当然有些特殊目的需要特殊的操作,由于本贴针对初学者和部分爱好者,就不再涉及特殊情况了,有问题论坛提问。

3 楼

晕菜,紧急补充和修正

当路径中包含空格时,应该用引号括起来。
DO FORM C:\Program Files\MyVfpPrj\MainForm.scx 改为
DO FORM "C:\Program Files\MyVfpPrj\MainForm.scx"

写糊涂了,见谅。

4 楼

5 楼


顶一下,有收益!

6 楼

是啊,我觉得这个帖子应该对好多人有用的才对, 怎么回的人那么少?

或许这部分人不知道先看这个帖子

7 楼

收获~

8 楼

看到楼主的文章,思路非常清晰。
不必长命设置

也可以在主程序中加入:
gcDirectory = SYS(5) + SYS(2003) + "\"            
SET DEFAULT TO (gcDirectory)
set path to data;form...

9 楼

顶了,我们需要楼主这样的无私奉献精神!!!

10 楼

赵老师的文件真是精品!思路清晰、浅显易懂、分析透彻。读后仍觉余音绕梁、不绝于耳呀。
虽然早就不再为路径的问题困扰了,但是认真的读一下还是受益匪浅。

我来回复

您尚未登录,请登录后再回复。点此登录或注册