c - 如何正确使用 realpath() 读取目录中的多个文件?
问题描述
这应该是一个程序,它读取目录中的多个文件并获取给定单词在这些文件中的频率,我知道这部分现在不完整。
fopen()
正在将 null 返回到存在并具有权限的文件777
。
这是来自终端的权限:
ra@ra-VirtualBox:~/Desktop/lab2/folder$ ls -l
total 12
-rwxrwxrwx 1 ra ra 21 mar 14 23:20 file1.txt
-rwxrwxrwx 1 ra ra 21 mar 14 23:20 file2.txt
-rwxrwxrwx 1 ra ra 21 mar 14 23:20 file3.txt
这是按照此答案的建议使用 errno 后获得的输出
buf
印有
READING FILE: /home/ra/Desktop/lab2/file3.txt
fopen: No such file or directory
READING FILE: /home/ra/Desktop/lab2/file1.txt
fopen: No such file or directory
READING FILE: /home/ra/Desktop/lab2/file2.txt
fopen: No such file or directory
编辑:从输出中我注意到realpath()
在转到文件之前以某种方式擦除了整个子目录。/folder/ 不存在/home/ra/Desktop/lab2/file*.txt
也不存在!
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <pthread.h>
#include <limits.h> //For PATH_MAX
typedef struct {
FILE * fptr;
char * word;
}
inputFile;
void * readFrequenciesFromFile(void * path) {
static int count = 0;
}
int main(int argc, char * argv) {
int i;
char buf[PATH_MAX + 1];
char * wordToSearch = "test";
DIR * dir;
FILE * entry_file;
struct dirent * in_file;
// notice that the full directory is used here
// but buf somehow does magic and tells me the files
// are in /lab2/ directory
dir = opendir("/home/ra/Desktop/lab2/folder");
if (dir == NULL) {
printf("Error! Unable to read directory");
exit(1);
}
while ((in_file = readdir(dir)) != NULL) {
if (!strcmp(in_file -> d_name, "."))
continue;
if (!strcmp(in_file -> d_name, ".."))
continue;
realpath(in_file -> d_name, buf);
entry_file = fopen(buf, "r");
// printf("READING FILE: %s\n", buf);
if (!entry_file) perror("fopen");
if (entry_file != NULL) {
pthread_t tid;
inputFile * args = malloc(sizeof * args);
args -> fptr = malloc(sizeof entry_file);
args -> word = wordToSearch;
if (pthread_create( & tid, NULL, readFrequenciesFromFile, args) == 0) {
printf("Creating thread for file [%s] with ID %ld\n", in_file -> d_name, tid);
} else {
free(args);
}
fclose(entry_file);
}
}
closedir(dir);
return 0;
}
我会提到我在 VirtualBox 版本 6.1.10 r138449 (Qt5.6.2) 上使用 Ubuntu 18.04
我从哪里开始解决这个问题?这甚至是合理的还是我错过了什么?
解决方案
如果您始终如一地检查函数调用的返回值以识别它们何时失败,您将更好地了解出了什么问题。在这种情况下,如果您检查了realpath()
调用的返回值,您可能会被提示。
我会假设你的主目录是/home/ra
你的代码所建议的。观察您要打开的文件位于/home/ra/Desktop/lab2/folder
. 您成功地打开了该目录并读取了它的条目,这些条目给出了其中文件的基本名称——即没有任何路径组件的名称。
无论您尝试通过打开文件还是通过计算它们realpath()
的 s 来解析这些文件名,您都是相对于工作目录进行的。但是你启动程序的方式,它的工作目录是/home/ra/Desktop/lab2
,不是/home/ra/Desktop/lab2/folder
,所以程序要求的文件确实不存在。
您的选择包括
- 从包含文件的文件夹中运行程序
- 形成打开它们的文件的正确路径——正确的绝对路径或相对于实际工作目录的正确路径。
推荐阅读
- python - 如何使用python打开触摸键盘?
- php - 将 $_SESSION 值和其他输入数据(选择)从 jQuery 传递到 saveindb.php 文件
- excel - VBA XML 返回
- javascript - 多级下拉 Bootstrap 4,子菜单与父下拉列表顶部对齐
- laravel - Laravel 路由组未正确使用
- python - 如何使用 rpy2 api 从 python 脚本中正确获取 R sessionInfo()?
- kotlin - Android-Things:将 gpiocallback 函数迁移到暂停协程函数
- c# - 如何在用户的声明列表中保留多个 ClaimTypes.Role 值?
- google-sheets - 查询功能按问题排序 Google 表格
- apache-beam - 如何在 Apache Beam 中生成序列号?