C 检查文件路径是否可读写

C 检查文件路径是否可读写,c,C,我试图列出所有文件和子目录递归给定的文件路径。这是可行的,直到我尝试添加代码来检查文件路径是否可读/写(我注释掉了这些行)。它现在不进入递归循环。这是我的密码 #include <unistd.h> #include <sys/types.h> #include <dirent.h> #include <stdio.h> void listDir(char *name, FILE *fp) { DIR *dir; struct d

我试图列出所有文件和子目录递归给定的文件路径。这是可行的,直到我尝试添加代码来检查文件路径是否可读/写(我注释掉了这些行)。它现在不进入递归循环。这是我的密码

#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>

void listDir(char *name, FILE *fp)
{
    DIR *dir;
    struct dirent *entry;

    if (!(dir = opendir(name)))
        return;
    if (!(entry = readdir(dir)))
        return;

    do {
        FILE *fileCopy;
        char read[50];
        char write[50];
        char path[1024];
        int len = snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name);
        path[len] = 0;
        if (entry->d_type == DT_DIR)
        {
            if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
                continue;
           // if((fileCopy = fopen(path, "rb")) == NULL){
           //     strcpy(read,"Not Readable");
           // }
           // else{
           //     strcpy(read,"Readable");
           // }
           // if((fileCopy = fopen(path, "wb")) == NULL){
           //     strcpy(write,"Not Writable");
           // }
           // else{
           //     strcpy(write,"Writable");
           // }
            fprintf(fp,"[D]%s - %s,%s\n", path,read,write);
            listDir(path ,fp);
        }
        else
        {
           // if((fileCopy = fopen(path, "rb")) == NULL){
           //     strcpy(read,"Not Readable");
           // }
           // else{
           //     strcpy(read,"Readable");
           // }
           // if((fileCopy = fopen(path, "wb")) == NULL){
           //     strcpy(write,"Not Writable");
           // }
           // else{
           //    strcpy(write,"Writable");
           // }
            fprintf(fp,"[F]%s - %s,%s\n", path,read,write);
        }
    } while ((entry = readdir(dir)));
    closedir(dir);

}

int main(void)
{
    FILE *fp;
      fp = fopen("/var/mobile/Applications/FileIOAccess.txt", "w");
    listDir("/var",fp);
    fclose(fp);
    return 0;
}
#包括
#包括
#包括
#包括
void listDir(字符*名称,文件*fp)
{
DIR*DIR;
结构方向*条目;
如果(!(dir=opendir(name)))
返回;
如果(!(entry=readdir(dir)))
返回;
做{
文件*文件副本;
字符读取[50];
字符写入[50];
字符路径[1024];
int len=snprintf(路径,sizeof(路径)-1,“%s/%s”,名称,条目->d_名称);
路径[len]=0;
如果(条目->数据类型==DT\U目录)
{
如果(strcmp(条目->数据单元名称,“.”)=0 | | strcmp(条目->数据单元名称,“…”)==0)
继续;
//if((fileCopy=fopen(路径,“rb”))==NULL){
//strcpy(读作“不可读”);
// }
//否则{
//strcpy(读作“可读”);
// }
//if((fileCopy=fopen(路径,“wb”))==NULL){
//strcpy(写,“不可写”);
// }
//否则{
//strcpy(写,“可写”);
// }
fprintf(fp,[D]%s-%s,%s\n”,路径,读,写);
listDir(路径,fp);
}
其他的
{
//if((fileCopy=fopen(路径,“rb”))==NULL){
//strcpy(读作“不可读”);
// }
//否则{
//strcpy(读作“可读”);
// }
//if((fileCopy=fopen(路径,“wb”))==NULL){
//strcpy(写,“不可写”);
// }
//否则{
//strcpy(写,“可写”);
// }
fprintf(fp,[F]%s-%s,%s\n“,路径,读,写);
}
}而((entry=readdir(dir));
closedir(dir);
}
内部主(空)
{
文件*fp;
fp=fopen(“/var/mobile/Applications/FileIOAccess.txt”,“w”);
listDir(“/var”,fp);
fclose(fp);
返回0;
}

此示例使用
access
替换使用
fopen
测试文件权限

void listDir(char *name, FILE *fp)
{
    DIR *dir;
    struct dirent *entry;

    if (!(dir = opendir(name)))
        return;

    if (!(entry = readdir(dir)))
        return;

    do
    {
        char readString[50]  = {0};
        char writeString[50] = {0};
        char path[1024];
        char filetype;

        snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name);

        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
            continue;

        if (access(path, R_OK) == 0)
            strcpy(readString, "Readable");
        else
            strcpy(readString, "Not Readable");

        if (access(path, W_OK) == 0)
            strcpy(writeString, "Writable");
        else
            strcpy(writeString, "Not Writable");

        switch (entry->d_type)
        {
            case  DT_UNKNOWN: filetype = '?'; break;
            case  DT_FIFO:    filetype = 'P'; break;
            case  DT_CHR:     filetype = 'C'; break;
            case  DT_DIR:     filetype = 'D'; break;
            case  DT_BLK:     filetype = 'B'; break;
            case  DT_REG:     filetype = 'F'; break;
            case  DT_LNK:     filetype = 'L'; break;
            case  DT_SOCK:    filetype = 'S'; break;
            case  DT_WHT:     filetype = 'W'; break;
            default:          filetype = '?'; break;
        }

        fprintf(fp,"[%c]%s - %s,%s\n", filetype, path, readString, writeString);

        if (entry->d_type == DT_DIR)
           listDir(path, fp);

    } while ((entry = readdir(dir)));

    closedir(dir);
}

(entry==readdir(dir)
?我相信这不是错误,但我们尝试过,现在文件中没有输出。if-else语句绝对不仅仅执行检查。打开文件以使用
fopen(路径,“wb”)进行写入
将截断它--将文件长度设置为零。在目录中的每个文件上运行此代码基本上将删除每个文件。如果要使用
fopen
以这种方式测试文件的权限,则必须使用
fopen(路径,“a”)
以避免破坏它。至于为什么包含此代码时代码不会递归下降,目前还不清楚,但我强烈建议您学习如何检查
errno
并打印标准错误消息以了解调用失败的原因。OP,老实说,您应该删除注释代码并使用
access
stat
access
更容易,但只会根据真实用户id测试文件权限。如果需要根据有效用户id进行测试,请使用
stat
。由于您从未为任何成功的
fopen
调用
fclose
,因此在某个时候,您将达到每进程文件描述符限制和所有其他e> fopens和
opendir
s将失败,还有一个问题,不确定您是否熟悉。假设我正在为越狱的iphone编写一个控制台应用程序。使用stat()、access()或fopen()有什么区别吗?显然我尝试过使用fopen()和access()大多数iphone系统路径都让我可读写,但我不相信。正如我上面提到的,主要区别在于
access
使用真实的用户/组ID来测试文件权限。使用
stat
你也可以选择测试有效用户/组的权限。我不知道你对iphone或越狱有何了解?越狱过程可能会改变权限或提升用户权限?