C struct stat info 不循环更新,给出荒谬的修改日期
C struct stat info not updating in a loop, giving ridiculous modification date
对于代码的一部分,我需要将给定目录中每个文件的名称和统计信息(用户 ID、组 ID、修改时间、权限等)保存到一个自数组中定义的结构。将信息保存到数组中没有问题,因此为了清楚起见,我将这些内容排除在外。我遇到的问题是预定义的 struct stat
:在测试中,它为目录中的每个文件打印出相同的确切修改日期,这是一个问题,日期是从 1969 年开始的,这是另一个问题(考虑到我清楚地记得去年某个时候创建和修改这些文件)。我不确定出了什么问题;一些帮助将不胜感激。
注意:这是我第一次用 C 编写代码,所以如果有任何明显的错误,请告诉我。我的教授非常擅长独立研究,并没有完全涵盖所有需要知道的重要事情。另外,我知道我需要检查错误——这些检查已经写好,稍后会实施。在我担心所有错误检查之前,我只需要修复这段代码的晴天部分,所以请不要告诉我那是我的问题。我总是给它一个普通的可读目录。打开或阅读应该没有问题。
int main ()
{
DIR *myDIR;
struct dirent *mydirent = malloc(sizeof(struct dirent)); //necessary?
struct stat mystat;
myDIR = opendir(pathname);
int count = 0;
while ((mydirent = readdir(myDIR)) != NULL)
count++;
rewinddir(myDIR);
struct file_info **file_info_array = malloc(sizeof(struct file_info*)*(count+1));
int i = 0;
while ((mydirent = readdir(myDIR)) != NULL)
{
stat(mydirent->d_name, &mystat);
printf("name: %s\n", mydirent->d_name);
printf("mod_time: %s\n", ctime(&mystat.st_mtime));
/*
... saving file info into file_info_array
*/
}
int is_closed = closedir(myDIR);
/*
... freeing pointers
*/
return 0;
}
正在将评论转化为答案。
您没有检查 stat()
是否成功;你不能推迟错误检查——它不是 sane/safe。如果失败,则无法保证 stat
结构的内容是合理的。而且您还没有显示 pathname
是如何设置的。如果路径名不是 .
(或 .
的同义词),则 stat()
调用 将 失败;您需要将 readdir()
返回的名称转换为相对于 pathname
的名称——例如:
char path[PATH_MAX]; /* <limits.h> - if it is defined at all */
snprintf(path, sizeof(path), "%s/%s", pathname, mydirent->d_name);
if (stat(path, &mystat) == 0)
{
…go ahead with printing, etc…
}
Oh, goodness, that's why! It needs to be a full path? That makes sense, but for some reason when other classmates coded it, they implemented it the way I originally did, as just mydirent->d_name
, and had no problems. I wonder why?
不一定是完整路径;只是一条可以找到的路径。如果您只是执行 stat(mydirent->d_name, &mystat)
,您将在当前目录中查找具有给定名称的文件,而不是从中读取该名称的目录(除非该目录恰好是 .
)。也许同学用过chdir(pathname)
?或者他们可能只使用 .
(或 .
的同义词)作为路径名?
So then how come it successfully prints out all the names, even though they only exist in the inputted directory and not my current one? I'm not trying to argue with you; I'm just genuinely curious as to how stat()
and dirent
actually work.
readdir()
从 pathname
命名的目录中读取名称(仅;无路径信息)。这样就可以打印了。通常,stat()
会失败,因此您会从中打印出垃圾信息。
On a side note, no, it isn't necessary to malloc() space for a struct dirent just because you declare a variable that can point to such. You do need to assign a valid value to the variable before you can safely dereference it, but you do so by assigning the return value of readdir(), supposing that readdir() succeeds. –
正如 John Bollinger 所说,malloc()
是不必要的,更糟糕的是,它是内存泄漏。
对于代码的一部分,我需要将给定目录中每个文件的名称和统计信息(用户 ID、组 ID、修改时间、权限等)保存到一个自数组中定义的结构。将信息保存到数组中没有问题,因此为了清楚起见,我将这些内容排除在外。我遇到的问题是预定义的 struct stat
:在测试中,它为目录中的每个文件打印出相同的确切修改日期,这是一个问题,日期是从 1969 年开始的,这是另一个问题(考虑到我清楚地记得去年某个时候创建和修改这些文件)。我不确定出了什么问题;一些帮助将不胜感激。
注意:这是我第一次用 C 编写代码,所以如果有任何明显的错误,请告诉我。我的教授非常擅长独立研究,并没有完全涵盖所有需要知道的重要事情。另外,我知道我需要检查错误——这些检查已经写好,稍后会实施。在我担心所有错误检查之前,我只需要修复这段代码的晴天部分,所以请不要告诉我那是我的问题。我总是给它一个普通的可读目录。打开或阅读应该没有问题。
int main ()
{
DIR *myDIR;
struct dirent *mydirent = malloc(sizeof(struct dirent)); //necessary?
struct stat mystat;
myDIR = opendir(pathname);
int count = 0;
while ((mydirent = readdir(myDIR)) != NULL)
count++;
rewinddir(myDIR);
struct file_info **file_info_array = malloc(sizeof(struct file_info*)*(count+1));
int i = 0;
while ((mydirent = readdir(myDIR)) != NULL)
{
stat(mydirent->d_name, &mystat);
printf("name: %s\n", mydirent->d_name);
printf("mod_time: %s\n", ctime(&mystat.st_mtime));
/*
... saving file info into file_info_array
*/
}
int is_closed = closedir(myDIR);
/*
... freeing pointers
*/
return 0;
}
正在将评论转化为答案。
您没有检查 stat()
是否成功;你不能推迟错误检查——它不是 sane/safe。如果失败,则无法保证 stat
结构的内容是合理的。而且您还没有显示 pathname
是如何设置的。如果路径名不是 .
(或 .
的同义词),则 stat()
调用 将 失败;您需要将 readdir()
返回的名称转换为相对于 pathname
的名称——例如:
char path[PATH_MAX]; /* <limits.h> - if it is defined at all */
snprintf(path, sizeof(path), "%s/%s", pathname, mydirent->d_name);
if (stat(path, &mystat) == 0)
{
…go ahead with printing, etc…
}
Oh, goodness, that's why! It needs to be a full path? That makes sense, but for some reason when other classmates coded it, they implemented it the way I originally did, as just
mydirent->d_name
, and had no problems. I wonder why?
不一定是完整路径;只是一条可以找到的路径。如果您只是执行 stat(mydirent->d_name, &mystat)
,您将在当前目录中查找具有给定名称的文件,而不是从中读取该名称的目录(除非该目录恰好是 .
)。也许同学用过chdir(pathname)
?或者他们可能只使用 .
(或 .
的同义词)作为路径名?
So then how come it successfully prints out all the names, even though they only exist in the inputted directory and not my current one? I'm not trying to argue with you; I'm just genuinely curious as to how
stat()
anddirent
actually work.
readdir()
从 pathname
命名的目录中读取名称(仅;无路径信息)。这样就可以打印了。通常,stat()
会失败,因此您会从中打印出垃圾信息。
On a side note, no, it isn't necessary to malloc() space for a struct dirent just because you declare a variable that can point to such. You do need to assign a valid value to the variable before you can safely dereference it, but you do so by assigning the return value of readdir(), supposing that readdir() succeeds. –
正如 John Bollinger 所说,malloc()
是不必要的,更糟糕的是,它是内存泄漏。