C 如何显示像LS-al这样的符号链接?
我已经创建了一个粗略的程序,它使用C打印出与ls-al类似的提示。虽然它工作得几乎完美,除了无法动态打印无法打开的目录,因为没有参数,它只在当前目录中运行,所以我认为C 如何显示像LS-al这样的符号链接?,c,printing,symlink,ls,C,Printing,Symlink,Ls,我已经创建了一个粗略的程序,它使用C打印出与ls-al类似的提示。虽然它工作得几乎完美,除了无法动态打印无法打开的目录,因为没有参数,它只在当前目录中运行,所以我认为就足够了,但如果有更好的方法的话要这样做,请让我知道。我想知道如果下面显示了类似的内容,您如何打印出文件的符号链接 代码 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h>
就足够了,但如果有更好的方法的话要这样做,请让我知道。我想知道如果下面显示了类似的内容,您如何打印出文件的符号链接
代码
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <grp.h>
#include <time.h>
#include <pwd.h>
#include <errno.h>
#include <string.h>
int main(void)
{
DIR *mydir;
DIR *thedir;
struct dirent *myfile;
struct stat myStat;
struct passwd *pwd;
int size = 0;
struct tm lt;
char buf[1024];
char length[100];
long width;
struct group *gf;
int len = 0;
mydir = opendir("./");
thedir = opendir("./");
if(mydir!= NULL){
while((myfile = readdir(thedir)) != NULL){
lstat(myfile->d_name, &myStat);
size += myStat.st_blocks;
width = (long)myStat.st_size;
sprintf(length, "%ld", width);
if(len < strlen(length)){
len = strlen(length);
}
}
printf("total %d\n", size/2);
closedir(thedir);
while((myfile = readdir(mydir)) != NULL)
{
lstat(myfile->d_name, &myStat);
if((lstat(myfile->d_name, &myStat) ) == 0){
pwd = getpwuid(myStat.st_uid);
}
gf = getgrgid(myStat.st_gid);
time_t t = myStat.st_mtime;
localtime_r(&t, <);
char timebuf[80];
char timebuf2[80];
strftime(timebuf, sizeof(timebuf), "%F", <);
strftime(timebuf2, sizeof(timebuf2), "%R", <);
printf( (S_ISDIR(myStat.st_mode)) ? "d" : "-");
printf( (myStat.st_mode & S_IRUSR) ? "r" : "-");
printf( (myStat.st_mode & S_IWUSR) ? "w" : "-");
printf( (myStat.st_mode & S_IXUSR) ? "x" : "-");
printf( (myStat.st_mode & S_IRGRP) ? "r" : "-");
printf( (myStat.st_mode & S_IWGRP) ? "w" : "-");
printf( (myStat.st_mode & S_IXGRP) ? "x" : "-");
printf( (myStat.st_mode & S_IROTH) ? "r" : "-");
printf( (myStat.st_mode & S_IWOTH) ? "w" : "-");
printf( (myStat.st_mode & S_IXOTH) ? "x" : "-");
printf(" ");
printf("%ld ", myStat.st_nlink);
if(pwd != 0){
printf("%s %s %*ld %s %s %s\n", pwd->pw_name, gf->gr_name, len, (long)myStat.st_size, timebuf, timebuf2, myfile->d_name);
}else {
printf("%d %s %*ld %s %s %s\n", myStat.st_uid, gf->gr_name, len, (long)myStat.st_size, timebuf, timebuf2, myfile->d_name);
printf("\n");
}
}
closedir(mydir);
}else{
printf("ls: cannot open directory .: Permission denied");
}
}
所需输出
total 8
-rw-rw-r-- 1 travis travis 0 2019-04-04 17:11 file2.txt
-rw-rw-r-- 1 travis travis 0 2019-04-04 17:11 file1.txt
drwxrwxr-x 4 travis travis 4096 2019-04-04 17:11 ..
drwxrwxr-x 2 travis travis 4096 2019-04-04 17:11 .
-rwxrwxrwx 1 travis travis 9 2019-04-04 17:11 link1
-rwxrwxrwx 1 travis travis 9 2019-04-04 17:11 link2
total 8
-rw-rw-r-- 1 travis travis 0 2019-04-04 17:11 file2.txt
-rw-rw-r-- 1 travis travis 0 2019-04-04 17:11 file1.txt
drwxrwxr-x 4 travis travis 4096 2019-04-04 17:11 ..
drwxrwxr-x 2 travis travis 4096 2019-04-04 17:11 .
lrwxrwxrwx 1 travis travis 9 2019-04-04 17:11 link1 -> file1.txt
lrwxrwxrwx 1 travis travis 9 2019-04-04 17:11 link2 -> file2.txt
在您的程序中,您查看的是
st\u nlink
,但它涉及的是硬链接(ln…
),而不是符号链接(ln-s…
)
查看readlink以查找要写入的路径
概要
#include <unistd.h>
ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
例如,替换
借
readlink是您想要的函数,请参阅我的回答您可能还想检查文件是否为符号链接:S_ISLNK如果S_ISLNK返回not null,那么如何附加以显示链接?你能给我举个例子作为答案吗?我编辑了我的答案,添加了一个建议。我现在将尝试实施,以前从未使用过readlink。如果我想将其插入循环中,如果没有符号链接,是否会导致错误?@BretHasel您是否在非符号链接上使用它readlink将返回-1,并且将使用EINVALCOLD设置errno我是否可以请求您提供一个示例?认为我用一个包含readlink的ifstatement封装了我的打印语句,然后用if-1打印我现在的状态,或者用readlink打印。但是readlink是如何附加路径名的呢?谢谢,我现在理解得好多了,现在正在使用它。@BretHasel很好,请注意,如果(pwd!=0)printf(…),我没有更改您的
;else printf(…)
只在一个printf(“…”,(pwd!=0)?…:…,…)
中显示更改,但只使用一个printf更简单;-)
readlink() places the contents of the symbolic link pathname in the
buffer buf, which has size bufsiz. readlink() does not append a null
byte to buf. It will (silently) truncate the contents (to a length of
bufsiz characters), in case the buffer is too small to hold all of the
contents.
if(pwd != 0){
printf("%s %s %*ld %s %s %s\n", pwd->pw_name, gf->gr_name, len, (long)myStat.st_size, timebuf, timebuf2, myfile->d_name);
}else {
printf("%d %s %*ld %s %s %s\n", myStat.st_uid, gf->gr_name, len, (long)myStat.st_size, timebuf, timebuf2, myfile->d_name);
printf("\n");
}
if(pwd != 0){
printf("%s %s %*ld %s %s %s", pwd->pw_name, gf->gr_name, len, (long)myStat.st_size, timebuf, timebuf2, myfile->d_name);
}else {
printf("%d %s %*ld %s %s %s", myStat.st_uid, gf->gr_name, len, (long)myStat.st_size, timebuf, timebuf2, myfile->d_name);
}
char linkname[PATH_MAX];
ssize_t r = readlink(myfile->d_name, linkname, PATH_MAX);
if (r != -1) {
linkname[r] = '\0';
printf(" -> %s\n", linkname);
}
else
putchar('\n');