我有检查文件存在的功能:
int file_exists(char *filename)
{
struct stat buffer;
int i = stat(filename, &buffer);
if (i == 0) {
return 1;
}
return 0;
}
并且它在完整路径下工作正常,但我想检查用户主目录中是否存在文件,如果不存在 - 在/ etc目录中。怎么做?
答案 0 :(得分:2)
int
file_exists(const char *basename)
{
static const char *dirs[] = { "/etc", "/home/username" };
char buf[MAX_PATH_LENGTH + 1];
size_t i;
struct stat dummy;
for (i = 0; i < sizeof dirs / sizeof dirs[0]; ++i) {
(void)snprintf(buf, sizeof buf, "%s/%s", dirs[i], basename);
if (!stat(buf, &dummy)) return 1;
}
return 0;
}
请注意,如果路径加上文件名长于MAX_PATH_LENGTH个字符,则会失败(即搜索错误的文件)。您可以检查snprintf
的返回值以捕获该值。
如果您想避免查找目录/套接字/ ...,可以将if
行更改为
if (!stat(buf, &dummy) && S_ISREG(dummy.st_mode)) return 1;
亚当罗森菲尔德指出。在这种情况下,您可能希望将dummy
重命名为更合适的内容(可能是sb
)。
答案 1 :(得分:0)
使用errno
值,如果文件不存在,则为ENOENT
。
#include <errno.h>
int file_exists(char *filename)
{
struct stat buffer;
int i = stat(filename, &buffer);
if (i == 0) {
return 1;
}
if (errno == ENOENT)
printf("%s : file not found\n", buffer);
return 0;
}
对于您的问题:如果您不想将目录与文件名连接,请使用chdir
。
答案 2 :(得分:0)
仅将“filename”作为输入,然后使用strcat创建完整路径名 - 如下所示:
int file_exists(char *filename)
{
struct stat buffer;
char fullpath[50], *path;
path = "/home/Nips/"
if ((strlen(path) + strlen(filename)) >= 50) {
printf("filename too long!\n");
return 0;
}
strcpy(fullpath, path);
strcat(fullpath, filename);
if (stat(fullpath, &buffer) == 0) {
return 1;
}
if (errno == ENOENT) {
path = "/etc/";
strcpy(fullpath, path);
strcat(fullpath, filename);
if (stat(fullpath, &buffer) == 0) {
return 1;
}
if (errno == ENOENT) {
printf("File not found!\n");
return 0;
}
}
printf("Error finding File!\n");
return 0;
}
注意:代码未经过测试,这只是为了给您一个提示。在实施时进行适当的健全性检查。希望这会给你一些想法!
答案 3 :(得分:0)
始终为您的路径提供完整地址,或在当前目录中提供./。
此外,根据此similar question,访问权限(路径名,模式)功能可以满足您的需求。请改用它。成功时返回0,失败时返回-1。 由于access()完全符合您的需要,因此您无需重新实现它。
注意,最常见的模式如下:
F_OK,用于检查文件是否存在。
R_OK,供阅读。
W_OK,写作。
X_OK,用于读取,写入和执行权限。
另外,例如,如果您需要检查读取和写入权限,则可以按位或在R_OK和W_OK之间(或者甚至在每三个R_OK,W_OK或X_OK之间)
有关详细信息,请在终端上输入 man access ,或访问上面的链接。
注意:access()是unistd.h库的一部分,即POSIX标准。如果您需要在其他系统下使用它,您可能需要包含不同的库。