user: ls -lt
lrwxrwxrwx 1 user sw-team 9 Jun 18 19:01 new_link -> test/file
我有如上所述的软链接。我想检查是否存在new_link(不是链接文件)。我尝试了以下所有内容,但只有在最终目标文件(测试/文件)存在时才会检查。
access(filename,F_OK)
stat()
open()
fopen()
我想在C语言中找到它而不是在shell脚本中。请在检查链接文件之前告诉我如何找到new_link?
答案 0 :(得分:7)
使用lstat
- 获取符号链接状态:
lstat()
函数应等效于stat()
,除非路径引用符号链接。在这种情况下,lstat()
将返回有关链接的信息,而stat()
将返回有关该链接引用的文件的信息。
(强调我的。)
如果链接(或路径的任何其他部分)不存在, lstat
将返回非零,errno
将设置为ENOENT
。
示例:
#include <stdio.h>
#include <stdbool.h>
#include <sys/stat.h>
bool symlink_exists(const char* path)
{
struct stat buf;
int result;
result = lstat(path, &buf);
return (result == 0);
}
void test(const char* path)
{
bool exists = symlink_exists(path);
printf("%s does%s exist.\n", path, exists ? "" : " not");
}
int main(int argc, char** argv)
{
test("/bin/sh");
test("/etc/no_such_thing");
return 0;
}
输出:
/bin/sh does exist.
/etc/no_such_thing does not exist.
答案 1 :(得分:3)
您需要lstat
才能获取链接状态,readlink
需要读取符号链接的值。
我修改了Jonthon的代码。检查一下:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <sys/stat.h>
bool symlink_exists(const char* path)
{
struct stat buf;
int ret = 0;
char *linkname;
if (lstat(path, &buf) == 0) {
// TODO: Add error handling
linkname = malloc(buf.st_size + 1);
readlink(path, linkname, buf.st_size + 1);
linkname[buf.st_size] = '\0';
printf("---> '%s' points to '%s'\n", path, linkname);
if (stat(linkname, &buf) == 0)
ret = 1;
}
return ret;
}
void test(const char* path)
{
bool exists = symlink_exists(path);
printf("%s does%s exist.\n", path, exists ? "" : " *not*");
}
int main(int argc, char** argv)
{
test("/bin/sh"); //Normal link using relative path - NOT WORKING
test("/etc/no_such_thing"); //Broken file
test("tmpp"); //Normal link using absolute path - WORKING
test("tmppp"); //Broken link
return 0;
}
使用绝对路径创建链接。否则,您必须将其转换为相对路径。
答案 2 :(得分:0)
简答:
#include <sys/stat.h>
#include <string>
bool symlinkExists(const string &path)
{
struct stat info;
return lstat(path.c_str(), &info) == 0;
}