fopen()返回"没有这样的文件或目录"

时间:2017-09-15 09:11:36

标签: c fopen

我在C中的fopen()函数有问题。

我解析了目录并将所有路径放到char数组(char **)。之后,我应该打开所有这些文件。和... fopen返回"没有这样的文件或目录"对于一些文件。我真的不明白,为什么。

  1. 所有路径都是正确的。我查了一下。
  2. 我拥有所有特权     打开这些文件。
  3. 如果我从错误日志中复制路径到文件并尝试     通过我的程序只打开这个文件 - 它有效。
  4. 其他     程序员不使用这些文件(我认为)。
  5. 我该怎么办?

    int main(int argc, char *argv[]){
        char** set = malloc(10000*sizeof(char*));
        char* path = argv[1];
        listdir(path, set); /* Just parse directory. Paths from the root. No problem in this function.  all paths in the variable "set" are right */
        int i=0;
        while(i<files){ /* files is number of paths */
            FILE* file = fopen(set[i++],"rb");
            fseek(file, 0L, SEEK_END);
            int fileSize = ftell(file);
            rewind(file);
            /*reading bytes from file to some buffer and close current file */
            i++;
        }
    }
    

2 个答案:

答案 0 :(得分:1)

  1. 你增加&#39;我&#39;两次。可能是错误的?
  2. 您可以使用stat()打开文件大小。
  3. ftell()返回&#34; long&#34;,不要将其转换为&#34; int&#34;因为它可以缩短,你失去了正确的价值。
  4. 试试这段代码:

    #include <stdio.h>
    #include <sys/stat.h>
    
    /* example of listdir, replace it with your real one */
    int listdir(const char *path, char *set[])
    {
        set[0] = "0.txt";
        set[1] = "1.txt";
        set[2] = "2.txt";
        set[3] = "3.txt";
        set[4] = "4.txt";
    
        return 5;
    }
    
    int main(int argc, char *argv[]) {
        int files;
        char *path = argv[1];
        char **set = malloc(1000 * sizeof(char *));
    
        files = listdir(path, set);
    
        for (int i = 0; i < files; i++) {
            struct stat st;
            stat(set[i], &st);
            printf("FileSize of %s is %zu\n", set[i], st.st_size);
        }
        free(set);
    }
    

答案 1 :(得分:0)

(我猜你在某些Posix系统上,希望是Linux)

可能你的listdir错了。 FWIW,如果你在其中使用readdir(3),你需要连接目录名和文件名(中间有/,可能使用snprintf(3)asprintf(3)目的)。

但可以肯定的是,

    FILE* file = fopen(set[i++],"rb"); ////WRONG

是双重错误。首先,您要递增i++两次(现在为时尚早)。然后,你应该阅读fopen(3)并处理失败案例,至少用:

   char* curpath = set[i];
   assert (curpath != NULL);
   FILE* file = fopen(curpath, "rb");
   if (!file) { perror(curpath); exit(EXIT_FAILURE);  };

必须测试fopen的失败结果。请注意,我在失败时将相同的 curpath传递给perror(3)

您可能还想检查当前的working directory是否符合预期。请使用getcwd(2)

还可以使用strace(1)(在Linux上)了解您的计划执行的system calls