收藏家的struct
//added by kongyang 2006-06-28
struct boardcollection
{
int subnum;//the number of subdirectories not includes dirs in extends
int boardnum;//the number of boards
int isextends;//0 stands for being not an extends,1 not
char subdirsfile[20][32];//one dir can have 20 sub dirs, this stores the
filename of each subs
char subdirname[20][32];//names
char boards[20][32];//can have 20 boards
char dirname[32];//filename of current dir
char updir[32];//the filename of father dir
char extends[32];//extends of subdirectories.
};
subnum是当前文件的子目录数目,但是不包含扩展目录下面的子目录数目
也就是说,当前文件的子目录总数应该是它现在的包含的子目录数目还有扩展
以及可能的扩展的扩展的包含的子目录数目总和。
boardnum是当前文件的版面数目,当然也不包含扩展文件下的字文件夹数目
也就是说,如果要统计当前的总目录或者文件夹数目的话,用这个函数:
int getgood_dirnum(struct boardcollection currentdir)
{
int i=0;
i+=currentdir.subnum;
while(currentdir.extends[0]!=0)
{
f_get_file(currentdir.extends, ¤tdir, 1);
i+=currentdir.subnum;
}
return i;
}
isextends代表当前的这个文件是否是某一个文件的扩展
f_get_file为从一个文件中获得一个结构体
subdirsfile为对应子目录名字的文件名
subdisname为子目录的显示给用户的名字
boards是讨论区的名字
dirname是当前文件所在的文件名
updir是父文件夹的文件名
extends为除了20各目录和20各讨论区后,是否要添加扩展,以实现任意多的讨论区
和任意多的文件夹
这只是一个实现策略,没有去参考别人的,本来水母也实现了这个功能,但是还是想有点自己的知识产权,所以全部自己来构造。一开始思维会比较混乱,觉得extends的文件和当前目录的关系不好把握。
后来慢慢写得多了,思路也清晰了。目录确定了以后,就是来进行添加删除目录了。其实添加也很简单,看看当前目录有没有空余的空间,有的话就直接架上,没有的话就放到extends里面,extends满了再放到
extends的extends里面...贴一段函数如下
int do_adddir(char *boardfile,char* newdir)
{
char boardfilename[80];
struct boardcollection currentdir;
struct boardcollection newstruct;
time_t now;
get(boardfilename);
f_get_file(boardfile, ¤tdir, 1);
if(currentdir.subnum<20)
{
now=getfilename();
currentdir.subnum++;
snprintf(currentdir.subdirsfile[currentdir.subnum-1],80,"%d",now);
snprintf(currentdir.subdirname[currentdir.subnum-1],80,"%s",newdir);
f_replace_file(currentdir);
init_dir(&newstruct,currentdir.subdirsfile[currentdir.subnum-1],boardfile);
f_replace_file(newstruct);
}
else
{
if(currentdir.extends[0]==0)
{
now=getfilename();
snprintf(currentdir.extends,80,"%d",now);
f_replace_file(currentdir);
init_dir(&newstruct,currentdir.extends,boardfile);
newstruct.isextends=1;
f_replace_file(newstruct);
do_adddir(currentdir.extends,newdir);
}
else
{
do_adddir(currentdir.extends,newdir);
}
}
return 0;
}
写起来的一个很大的感觉就是要多用函数,把相同的操作尽量封装到汉书里面,这样写起程序来也会感觉很帅,而且也很容易定位错误。更重要的是大大的降低了代码的复杂度,提高了代码的可读性。
然后删除的时候会比较麻烦一点,因为删除一个目录,已开始想得很多,结果走了半个小时的弯路,后来猛一回神,发现是如此简单,只要把想删除的文件里的信息读出来,然后删除子目录对应的文件,
当然在芟除这些文件之前,要先读出子目录对应的文件里包含的子目录的文件,如此下去,就ok了,已开始总是在想,删除了子目录,父目录会受到什么影响?比如是extends的话有可能不包含子目录了那么这个extends
的生命就结束了等等,后来才发现不需要每个删除都要考虑这一点的,已开始得知需要删除no care就好了,要考虑的只是最上层这个的情况,贴函数如下
int do_deldir(struct boardcollection updir,char *deldir)
{
struct boardcollection dirr;
struct boardcollection upupdir;
f_get_file(deldir, &dirr,1);
do_del_nocare(dirr);
struct_del_dir(&updir,deldir);
if(updir.isextends==1&&updir.boardnum==0&&updir.subnum==0)
{
if(updir.extends[0]==0)
{
f_get_file(updir.updir,&upupdir,1);
upupdir.extends[0]=0;
f_replace_file(upupdir);
}
else
{
f_get_file(updir.updir,&upupdir,1);
snprintf(upupdir.extends,80,"%s",updir.extends);
f_replace_file(upupdir);
}
removefile(updir.dirname);
}
else
{
f_replace_file(updir);
}
return 0;
}
大体来说就是这些了,其他的如果要向编写一个好的程序的话,良好的编程风格是需要的,还有,头脑一定要清楚你干的是什么?要多思考,因为,很有可能,某些架构已开始就错误了,后来有可能就走不下去了
一定要想得细致周到
大概就获得这些经验吧,对了,还研究了一些javascript的语法,php的相关知识,配置了一下apache服务器,感觉还是蛮清楚地