Board logo

标题: DOS下DIR命令的修改,那位高手帮帮忙啊 [打印本页]

作者: 飘水     时间: 2004-6-14 00:00    标题: DOS下DIR命令的修改,那位高手帮帮忙啊

遇到了一个问题,请教各位高手:如果我要修改DOS下的DIR命令。使用高级语言编写和调试一个MYDIR命令。要求是:在信息多屏时,信息满一屏自动停止;可以控制前后翻屏查看文件信息;保留DOS的DIR命令的全部参数功能。
哪位高手指点一二,不胜感激啊![em27]
作者: 晓欣     时间: 2004-6-15 00:00
为什么要自己写呢?本来就有一个外部命令MORE可以实现这个功能啊
作者: bush     时间: 2004-6-15 00:00
可以考虑建一个字符串数组,大小为屏幕显示的行数的N倍,(recalloc函数解决)
信息满一屏,就保存到数组一次,前后翻屏时,就是重新显示若干行的字符串。
自动停止;可以控制前后翻屏查看文件信 就是一个读键盘输入函数,根据读入的值取上翻或下翻。

大概如此!
作者: 飘水     时间: 2004-6-15 00:00
请问晓欣,是哪个外部命令more实现这个功能,能具体点么?谢了
作者: 飘水     时间: 2004-6-15 00:00
请问bush,你所说的建一个字符串数组,就是用recalloc函数解决么?这是turbo c 的库函数么?你能不能具体指点一二。谢谢!
作者: bush     时间: 2004-6-18 00:00    标题: try!

字符串数组:实际上是字符指针的指针。
因为字符型指针可以表示字符串,
字符型指针的指针就可以表示字符串数组了,
一屏显25行,因此可以定义大小为25的串数组
每增加一屏多25行,数组的大小也就增加25
realloc函数就是改变数组的大小,用法: void realloc (void* p,unsigned size) 把p指针所指的区域大小改为size;返回指向该内存区的指针。

不过,仔细想一下,这好像有点问题,过两天我写一试试看……


[此贴子已经被作者于2004-6-18 下午 11:40:10编辑过]



作者: bush     时间: 2004-6-19 00:00
我用TC写了一个,mydir命令程序,只是大概演示了输出信息时上翻滚屏等操作,目前只能列表文件名,没有大小、时间等信息,(加上去并不难),
目前的问题是:
我是采用findfirst() findnext()两个函数来模仿DIR命令的作用的。
但是发现其局限性很大,也许是我的方法不对,还请各位点评一下。
#include
#include
int main(int argc,char*argv[])
{
unsigned short p,line,r,i,j,maxrow=20;
struct ffblk *fp;
char** row=(char**)malloc(20*4);
if(!row)
        {
        printf("out of memory!";
        exit(1);
        }
fp=(struct ffblk*)malloc(sizeof(struct ffblk));
if(!fp)
        {
        printf("out of memory!";
        exit(1);
        }
for(r=0;r<20;r++)
        {
        row[r]=(char*)malloc(80);
        if(!row[r])
                {
                printf("out of memory!";
                exit(1);
                }
        for(i=0;iff_name;i++)row[0]=fp->ff_name;
while(!findnext(fp))
        {
        if(r++==maxrow-1)
                {
                j=0;
                maxrow+=20;
                row=(char**)realloc(row,maxrow*4);
                if(!row)
                        {
                        printf("out of memory!";
                        exit(1);
                        }
                for(j=0;j<20;j++)
                        {
                        row[r+j]=(char*)malloc(80);
                        for(i=0;iff_name;i++)row[r]=fp->ff_name;

        }
p=maxrow/20;

for(j=0;j<p-1
        {
        printf("Display page: %d\n",j+1);
        for(i=0;i<20;i++)
                printf("%s\n",row[j*20+i]);
        printf("press U to uppage, E to end;other key continue..\n";
        switch(i=getch())
        {
        case 'U':
        case 'u':
                if(j)j--;
                break;
        case 'E':
        case 'e':
                j=p-1;break;
        default :
                j++;
        }
        }
line=r%20;
printf("Display page: %d\n",j+1);
for(i=0;i<=line;i++)
        printf("%s\n",row[j*20+i]);
printf("Total %d files in this folder.\n",r+1);
for(j=0;j<maxrow;j++)
        free(row[j]);
free(row);
free(fp);
return 0;
}