【发布时间】:2021-09-16 13:16:56
【问题描述】:
所以我使用 stat() 来检查目录,它工作得很好,直到我在 cwd 之外导航。然后目录被列为文件。
这是我创建文件列表的函数中的一个 sn-p。它在 SDL GUI 中实现。 目录应为红色,所有其他文件为蓝色。但是,例如,当我转到我的桌面时,所有目录都是蓝色的,而它们应该是红色的。
注意:fMenu 用作存储文件列表的缓冲区。路径改变时更新。
DIR *dir;
struct dirent *dd;
struct stat sd;
dir = opendir(fMenu.fPath[fMenu.mode]);
for (int a = 0; a < 1023; a++) // clears file list
{
fMenu.fList[fMenu.mode][a].isDir = false;
memset(fMenu.fList[fMenu.mode][a].fName, 0, strlen(fMenu.fList[fMenu.mode][a].fName));
}
for (int a = 0; (dd = readdir(dir)) != NULL && a < 1023; a++) // gets files and puts in file list array
{
stat(dd->d_name, &sd);
if (S_ISDIR(sd.st_mode)) //////// something wrong with this?
{
fMenu.fList[fMenu.mode][a].isDir = true;
strncat(fMenu.fList[fMenu.mode][a].fName, dd->d_name, strlen(dd->d_name));
} else
{
strncat(fMenu.fList[fMenu.mode][a].fName, dd->d_name, strlen(dd->d_name));
}
}
closedir(dir);
在这里它被转换为 GUI 的纹理。
for (int a = 0; a < 40; a++)
{
if (a == fMenu.pos)
{
if (fMenu.fList[fMenu.mode][a + fMenu.offset].isDir)
{
tempSurf = TTF_RenderText_Shaded(font, fMenu.fList[fMenu.mode][a + fMenu.offset].fName, Red, white);
} else
{
tempSurf = TTF_RenderText_Shaded(font, fMenu.fList[fMenu.mode][a + fMenu.offset].fName, buttonColor, white);
}
} else
{
if (fMenu.fList[fMenu.mode][a + fMenu.offset].isDir)
{
tempSurf = TTF_RenderText_Solid(font, fMenu.fList[fMenu.mode][a + fMenu.offset].fName, Red);
} else
{
tempSurf = TTF_RenderText_Solid(font, fMenu.fList[fMenu.mode][a + fMenu.offset].fName, buttonColor);
}
}
SDL_DestroyTexture(fileDisplayTex[a]);
fileDisplayTex[a] = SDL_CreateTextureFromSurface(renderer, tempSurf);
SDL_FreeSurface(tempSurf);
fileDisplayRect[a].w = strlen(fMenu.fList[fMenu.mode][a + fMenu.offset].fName) * 12;
}
【问题讨论】:
-
你没有检查
stat的返回码。您可能无法正确构造那些其他目录文件的路径名,因此stat可能会失败,您的结果可能毫无意义。 -
readdir只是给你单独的路径名。您可能想要构造fMenu.fPath[fMenu.mode]⊕"/"⊕dd->d_name(我使用 ⊕ 表示字符串连接)。 -
我强烈建议不要构建不必要的路径。您可以使用
fstatat()来获得理智的行为。此外,您可能不需要进行 任何stat类调用,因为在 Linux 上,struct dirent已经包含d_type字段。 -
我使用 stat 而不是内置的 d_type 的原因是为了使代码更通用。我在 windows 上写这个,不幸的是没有 d_type。
-
此外,如果您正在考虑对这些目录使用递归,您可能希望跳过处理“。”和“..”基于 UNIX 的系统上的目录。