Системный вызов access() сообщает: "Нет такого файла или каталога" для некоторых файлов/каталогов. Все каталоги/файлы имеют запрошенные разрешения. Их владелец/группа - мой идентификатор входа, как и для программы, размещенной ниже. Кроме того, файловый менеджер показывает все файлы/каталоги с правильными разрешениями, владельцем/группой.
В частности, для некоторых подкаталогов/файлов я получаю ошибку. Но для тех же подкаталогов, на которых я получил ошибку, все файлы (и подкаталоги) отображаются без ошибок.
Что я упускаю?
struct dirent *pDirent;
int main(int c, char** v) {
DIR *pDir = opendir(v[1]);
if (!pDir) {
cout << "Could not open: " << v[1] << endl;
return 0;
}
while ((pDirent = readdir(pDir)) != NULL) {
if (pDirent->d_name[0] == '.') continue;
if (pDirent->d_type == DT_DIR) {
if (access(pDirent->d_name, X_OK)) {
cout << pDirent->d_name << " Error: " << dec << errno << ' ' << strerror(errno) << endl;
}
else cout << pDirent->d_name << endl;
}
else if (pDirent->d_type == DT_REG) {
if (access(pDirent->d_name, R_OK | W_OK)) {
cout << pDirent->d_name << " Error: " << dec << errno << ' ' << strerror(errno) << endl;
}
else cout << pDirent->d_name << endl;
}
else continue;
}
return 0;
}
решение1
Имя, переданное в access(), должно быть абсолютным. В этом случае это будет конкатенация v[1], "/" и pDirent->d_name вместо просто pDirent->d_name.