stat() 返回现有文件不存在 (C)
stat() is returning that existing files don't exist (C)
我遇到了一个我似乎无法解决的非常奇怪的问题。
我正在尝试统计我的 C 程序目录中的文件,但有效文件返回 -1(该文件不存在)。问题是,这些文件是有效的并且里面确实有一些数据。
另一个有趣的事情是默认目录。和 .. 返回 0.
下面是我的代码:
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <locale.h>
#include <langinfo.h>
#include <stdint.h>
#include <stdlib.h>
int main(int c, char *v[])
{
int len;
struct dirent *pDirent;
DIR *pDir;
char buffer[500] = {'[=10=]'};
char *files[10000];
struct stat statbuf;
int i = 0;
int status;
if (c < 2)
{
printf("Usage: testprog <dirname>\n");
return 1;
}
pDir = opendir(v[1]);
if (pDir == NULL)
{
printf("Cannot open directory '%s'\n", v[1]);
return 1;
}
// http://pubs.opengroup.org/onlinepubs/9699919799/functions/fstatat.html
while ((pDirent = readdir(pDir)) != NULL)
{
strcpy(buffer, (const char *)pDirent->d_name);
files[i] = malloc(strlen(buffer) + 1);
strcpy(files[i], buffer);
printf("buffer: %s \n", buffer);
if (stat(pDirent->d_name, &statbuf) == -1)
{
perror("stat");
exit(EXIT_FAILURE);
}
status = stat(pDirent->d_name, &statbuf);
printf("status: %d \n", status);
i++;
}
closedir(pDir);
return 0;
}
当我运行目录内文件的stat命令时的输出如下:
buffer: test2
status: -1
buffer: .
status: 0
buffer: tset3
status: -1
buffer: ..
status: 0
buffer: test1
status: -1
有人可以给我指出正确的方向吗?把我的头发拉出来。
您需要将目录名称与“/”和 dentry 名称连接起来并将其传递给 stat
或者您需要使用目录的 fd
和 dentry 调用 fstatat
名称(或者您需要在您正在阅读的目录中,以便每个目录名称同时是一个正确的相对名称)。
我遇到了一个我似乎无法解决的非常奇怪的问题。
我正在尝试统计我的 C 程序目录中的文件,但有效文件返回 -1(该文件不存在)。问题是,这些文件是有效的并且里面确实有一些数据。
另一个有趣的事情是默认目录。和 .. 返回 0.
下面是我的代码:
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <locale.h>
#include <langinfo.h>
#include <stdint.h>
#include <stdlib.h>
int main(int c, char *v[])
{
int len;
struct dirent *pDirent;
DIR *pDir;
char buffer[500] = {'[=10=]'};
char *files[10000];
struct stat statbuf;
int i = 0;
int status;
if (c < 2)
{
printf("Usage: testprog <dirname>\n");
return 1;
}
pDir = opendir(v[1]);
if (pDir == NULL)
{
printf("Cannot open directory '%s'\n", v[1]);
return 1;
}
// http://pubs.opengroup.org/onlinepubs/9699919799/functions/fstatat.html
while ((pDirent = readdir(pDir)) != NULL)
{
strcpy(buffer, (const char *)pDirent->d_name);
files[i] = malloc(strlen(buffer) + 1);
strcpy(files[i], buffer);
printf("buffer: %s \n", buffer);
if (stat(pDirent->d_name, &statbuf) == -1)
{
perror("stat");
exit(EXIT_FAILURE);
}
status = stat(pDirent->d_name, &statbuf);
printf("status: %d \n", status);
i++;
}
closedir(pDir);
return 0;
}
当我运行目录内文件的stat命令时的输出如下:
buffer: test2
status: -1
buffer: .
status: 0
buffer: tset3
status: -1
buffer: ..
status: 0
buffer: test1
status: -1
有人可以给我指出正确的方向吗?把我的头发拉出来。
您需要将目录名称与“/”和 dentry 名称连接起来并将其传递给 stat
或者您需要使用目录的 fd
和 dentry 调用 fstatat
名称(或者您需要在您正在阅读的目录中,以便每个目录名称同时是一个正确的相对名称)。