Chinaunix

标题: rename为什么不执行? [打印本页]

作者: lovebbs    时间: 2003-01-21 14:56
标题: rename为什么不执行?
在Linux环境下编译的这个程序。功能是把某个目录里边文件名大写的字母,变成小写的。
请各位大侠看看,这个程序有什么问题?为什么rename没有执行?而且,每次运行a.out的时候,总有Segmentation fault
哪里溢出了?

#include <sys/types.h>;
#include <unistd.h>;
#include <stdio.h>;
#include <string.h>;
#include <ctype.h>;
#include <dirent.h>;
#include <linux/unistd.h>;

int main(int argc,char *argv[])
{
        const char oldfile[32]={NULL},newfile[32]={NULL};
        const char dirname[64]={};
        int i;
        DIR *dp;
        struct dirent *fn;

        dp=opendir("/home/gzhy/123";
        do
        {
                fn=readdir(dp);
                strcpy(oldfile,fn->;d_name);
                strcpy(newfile,fn->;d_name);
                i=0;
                while(newfile)
                {
                        if(newfile>;64 &amp;&amp; newfile<91)
                                newfile=newfile+32;
                        i++;
                }
                rename(oldfile,newfile);
        }while(fn);
        closedir(dp);
}
作者: zhanggz    时间: 2003-01-21 15:02
标题: rename为什么不执行?
内存操作有问题,可能是你定义的oldfile和newfile的数组小,你试试更改更大,可以分配512等等。
作者: lovebbs    时间: 2003-01-21 15:11
标题: rename为什么不执行?
[quote]原帖由 "zhanggz"]内存操作有问题,可能是你定义的oldfile和newfile的数组小,你试试更改更大,可以分配512等等。[/quote 发表:

不应该吧。文件名(包括扩展名)都是10个字符之内的。

还有,为什么rename没有执行?
作者: zhanggz    时间: 2003-01-21 15:19
标题: rename为什么不执行?
你在strcpy前加上初始化数组的函数例如:memset(oldfille, 0, sizeof(oldfile))
试试
作者: liupch    时间: 2003-01-21 15:41
标题: rename为什么不执行?
const char oldfile[32]={NULL},newfile[32]={NULL};
const char dirname[64]={};

这个定义有问题,你把数组定义成const,而且还初始化。
以后这个数组内容就不能在被更改了。你把const去掉就应该可以了
作者: lovebbs    时间: 2003-01-21 16:04
标题: rename为什么不执行?
原帖由 "zhanggz" 发表:
你在strcpy前加上初始化数组的函数例如:memset(oldfille, 0, sizeof(oldfile))
试试

尝试了,不管用。

原帖由 "liupch" 发表:

这个定义有问题,你把数组定义成const,而且还初始化。
以后这个数组内容就不能在被更改了。你把const去掉就应该可以了


这两个数组内容可以修改。strcpy以后,我printf看过了,结果没问题。while循环结束后,我也用printf看过了。数组内容也被修改了。似乎不是const问题吧。
而且,我就算是把const删除了,一样有Segmentation fault,rename函数一样不管用。
作者: liupch    时间: 2003-01-21 16:13
标题: rename为什么不执行?
那你先看一下你对这个路径("/home/gzhy/123"有没有读写权限。
对这下面的文件有没有读写权限。

感觉你的程序没问题,所以建议你查看一下权限。
另外我在Solaris下测试的,如果定义为const,是会被警告的
作者: zhanggz    时间: 2003-01-21 16:19
标题: rename为什么不执行?
len = strlen(name);
           dirp = opendir(".";
           while ((dp = readdir(dirp)) != NULL)
                   if (dp->;d_namlen == len &amp;&amp; !strcmp(dp->;d_name, name)) {
                           (void)closedir(dirp);
                           return FOUND;
                   }
           (void)closedir(dirp);
           return NOT_FOUND;

以上是我在man里找到的,你的第一while循环有问题,在读取了最后一个文件或目录后还读取了一次,你的退出循环的判断条件有问题,你试着用上面的例子来重新写就可以了。
作者: zhanggz    时间: 2003-01-21 16:22
标题: rename为什么不执行?
Segmentation fault 就是有关指针操作有问题,有许多情况可以出现这种错误,比如使用了非法的野指针,你就是使用了野指针了,fn在为NULL值时,你又使用了,所以就出现了这样的问题。
作者: lovebbs    时间: 2003-01-21 17:12
标题: rename为什么不执行?
原帖由 "liupch" 发表:
那你先看一下你对这个路径("/home/gzhy/123"有没有读写权限。
对这下面的文件有没有读写权限。

感觉你的程序没问题,所以建议你查看一下权限。
另外我在Solaris下测试的,如果定义为const,是会被警告的


对那个目录的权限绝对是有的。/home/gzhy是我的用户的默认目录。
作者: 无双    时间: 2003-01-21 19:06
标题: rename为什么不执行?
原帖由 "zhanggz" 发表:
len = strlen(name);
           dirp = opendir(".";
           while ((dp = readdir(dirp)) != NULL)
                   if (dp->;d_namlen == len &amp;&amp; !strcmp(dp->;d_name, name)) {
       ..........


dirp = opendir(".";

dirp = opendir(".";
应该检查返回值dirp
作者: 无双    时间: 2003-01-21 19:08
标题: rename为什么不执行?
原帖由 "lovebbs" 发表:
                        i++;
                }
                rename(oldfile,newfile);
        }while(fn);
        closedir(dp);
}


dp=opendir("/home/gzhy/123";
do
{
fn=readdir(dp);
strcpy(oldfile,fn->;d_name);
strcpy(newfile,fn->;d_name);
i=0;
while(newfile)
{
if(newfile>;64 &amp;&amp; newfile<91)
newfile=newfile+32;
i++;
}
对函数的返回值应该检查
如readdir
opendir
是不是返回null
作者: flyinghair    时间: 2003-01-21 20:20
标题: rename为什么不执行?
我觉得是循环的问题。
还有请问getcwd和opdir这两个函数的异同点。
作者: flyinghair    时间: 2003-01-21 20:22
标题: rename为什么不执行?
ps:不要意思,打错了。是getcwd 和opendir,readdir的区别。谢谢
作者: 无双    时间: 2003-01-22 08:48
标题: rename为什么不执行?
一个是打开目录
当然可以打开当前路径的
但是你不可能知道当前路径的绝对路径是什么

另一个是返回当前路径
但是不打开目录
你不可能读
作者: lovebbs    时间: 2003-01-22 11:01
标题: rename为什么不执行?
按照楼上的意见修改了代码,没有Segmentation fault了。但是,rename还是不行,我查了返回值,每次都是错误。
#include <sys/types.h>;
#include <unistd.h>;
#include <stdio.h>;
#include <string.h>;
#include <ctype.h>;
#include <dirent.h>;
#include <linux/unistd.h>;

int main(int argc,char *argv[])
{
        char oldfile[64]={},newfile[64]={};
        int i;
        DIR *dp;
        struct dirent *fn;
        memset(oldfile, 0, sizeof(oldfile));
        memset(newfile, 0, sizeof(newfile));
        dp=opendir("/home/gzhy/123";
        do
        {
                fn=readdir(dp);
                if(!fn) break;
                strcpy(oldfile,fn->;d_name);
                strcpy(newfile,fn->;d_name);
                i=0;
                while(newfile)
                {
                        if(newfile>;64 &amp;&amp; newfile<91)
                                newfile=newfile+32;
                        i++;
                }
                printf("%s\t%s\n",oldfile,newfile);
                if(strcmp(newfile,oldfile))
                {
                        if(rename(oldfile,newfile)==-1)
                                printf("error in rename file\n";
                }
        }while(fn);
        closedir(dp);
}


运行结果:
[gzhy@BB4251X gzhy]$ ./a.out
.       .
..      ..
1.JPG   1.jpg
error in rename file
2.JPG   2.jpg
error in rename file
3.JPG   3.jpg
error in rename file
4.jpg   4.jpg
5.jpg   5.jpg
作者: 无双    时间: 2003-01-22 12:19
标题: rename为什么不执行?

  1. if(strcmp(newfile,oldfile))
  2. {
  3. if(rename(oldfile,newfile)==-1)
  4. perror("error in rename file\n");  //改用perror看看错误类型是什么
  5. }
  6. }while(fn);
  7. closedir(dp);
  8. }



复制代码

作者: lovebbs    时间: 2003-01-22 14:14
标题: rename为什么不执行?
原帖由 "无双" 发表:

if(strcmp(newfile,oldfile))
{
if(rename(oldfile,newfile)==-1)
perror("error in rename file\n";  //改用perror看看错误类型是什么
}
}while(fn);
closedir(dp);
}


结果:
[gzhy@BB4251X gzhy]$ ./a.out
.       .
..      ..
2.JPG   2.jpg
error in rename file
: No such file or directory
3.JPG   3.jpg
error in rename file
: No such file or directory
4.jpg   4.jpg
5.jpg   5.jpg
1.jpg   1.jpg
作者: flyinghair    时间: 2003-01-23 09:15
标题: rename为什么不执行?
我觉得加一句
dp=opendir("/home/gzhy/123";
if (dp == NULL)
{
   printf("open directory error\n";
   return;
}
说不定连目录都没大开呢。我瞎想的哦。
作者: 无双    时间: 2003-01-23 10:19
标题: rename为什么不执行?
2.JPG 文件是不是不存在、
如果不存在就没有办法rename了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2