C 如何访问路径中的上一个文件夹?
如何告诉程序在上一个目录中查找文件夹 我试过写“./assets/fonts/DejaVuSans.ttf”,但那不起作用C 如何访问路径中的上一个文件夹?,c,C,如何告诉程序在上一个目录中查找文件夹 我试过写“./assets/fonts/DejaVuSans.ttf”,但那不起作用 font = TTF_OpenFont ( "assets/fonts/DejaVuSans.ttf", 24 ); 我的资产文件夹不在当前目录中,而是在上一个目录中(稍后我将尝试展开) 您正在使用的SDL2_ttf的ttf_OpenFont库需要绝对路径,而不是相对路径。这很奇怪,因为几乎在其他任何地方,open都会采用相对路径(“../assests/fonts/de
font = TTF_OpenFont ( "assets/fonts/DejaVuSans.ttf", 24 );
我的资产文件夹不在当前目录中,而是在上一个目录中(稍后我将尝试展开)
您正在使用的SDL2_ttf的ttf_OpenFont库需要绝对路径,而不是相对路径。这很奇怪,因为几乎在其他任何地方,open都会采用相对路径(“../assests/fonts/devussans.ttf”)而不是绝对路径(“/home/me/Project/SDL2_thing/assets/fonts/devussans.ttf”)
假设您的程序运行在“/home/me/Project/SDL2\u thing/source/my\u program”这样的目录中。要获取父目录(SDL2_thing)并构建绝对路径,此代码段应该可以工作(基于POSIX函数,缓冲区大小有点杂乱):
#包括//printf
#include//getcwd
#包括//dirname
int main(){
字符缓冲区[1024];
字符目标[2048];
//获取当前工作目录的完整路径
getcwd(缓冲区,1024);
printf(“cwd\t:%s\n”,缓冲区);
//这将有效地切掉路径末尾的目录(执行../source)
dirname(缓冲区);
printf(“父\t:%s\n”,缓冲区);
//按照我们拥有的路径“../SDL2\u thing”构建一个字符串,将其余的字符串追加到后面
sprintf(目标,“%s/assets/fonts/devusans.ttf”,缓冲区);
printf(“目标\t:%s\n”,目标);
返回0;
}
这是一个完整的程序,您可以轻松编译和运行,以查看中间值的输出。再一次,我只是在几个大的缓冲区周围乱跑,这是草率的,应该避免。使用适当的MAX_路径常数等。您应该能够对此进行调整,以获得字体的绝对路径,并提供给TTF_OpenFont()
检查TTF_OpenFont()调用的结果。如果为null,则打印TTF_GetError()提供的字符串。这将有助于确定错误的位置
如果您尝试此解决方案并遇到问题,请对此答案进行评论
当我有机会的时候,我会研究为什么这个函数不接受绝对值,如果没有修正的话,至少试着把它记录下来 简短版本(稍后我将尝试展开)
您正在使用的SDL2_ttf的ttf_OpenFont库需要绝对路径,而不是相对路径。这很奇怪,因为几乎在其他任何地方,open都会采用相对路径(“../assests/fonts/devussans.ttf”)而不是绝对路径(“/home/me/Project/SDL2_thing/assets/fonts/devussans.ttf”)
假设您的程序运行在“/home/me/Project/SDL2\u thing/source/my\u program”这样的目录中。要获取父目录(SDL2_thing)并构建绝对路径,此代码段应该可以工作(基于POSIX函数,缓冲区大小有点杂乱):
#包括//printf
#include//getcwd
#包括//dirname
int main(){
字符缓冲区[1024];
字符目标[2048];
//获取当前工作目录的完整路径
getcwd(缓冲区,1024);
printf(“cwd\t:%s\n”,缓冲区);
//这将有效地切掉路径末尾的目录(执行../source)
dirname(缓冲区);
printf(“父\t:%s\n”,缓冲区);
//按照我们拥有的路径“../SDL2\u thing”构建一个字符串,将其余的字符串追加到后面
sprintf(目标,“%s/assets/fonts/devusans.ttf”,缓冲区);
printf(“目标\t:%s\n”,目标);
返回0;
}
这是一个完整的程序,您可以轻松编译和运行,以查看中间值的输出。再一次,我只是在几个大的缓冲区周围乱跑,这是草率的,应该避免。使用适当的MAX_路径常数等。您应该能够对此进行调整,以获得字体的绝对路径,并提供给TTF_OpenFont()
检查TTF_OpenFont()调用的结果。如果为null,则打印TTF_GetError()提供的字符串。这将有助于确定错误的位置
如果您尝试此解决方案并遇到问题,请对此答案进行评论
当我有机会的时候,我会研究为什么这个函数不接受绝对值,如果没有修正的话,至少试着把它记录下来 试试/。/assets/font/DejaVuSans。ttf@StrahinjaRodic不,那不行。它与“assets/fonts/DejaVuSans.ttf”和“assets”文件夹在同一目录下工作。你说的“previous directory”是什么意思?您的程序是否在我的父目录中使用了
chdir()
?@JonathanLeffler我有一个包含.c文件的“源”文件夹。此外,此父目录还包含一个“资产”文件夹。我需要程序的路径(在“源”文件夹中)返回父目录并搜索“资产”文件夹。不,我没有使用chdir()。稍微澄清一下术语可能会有所帮助。除非您使用的是chdir
或类似的工具,否则没有“先前目录”的概念。听起来你的意思是“父目录”,即包含当前目录的目录。将此父目录称为“p”(例如),程序的当前工作方向为“p/source”。您可以使用路径(文件名w/directories)“../assets/filename”或“../assets/fonts/devusans.ttf”Try/。/assets/fonts/devusans.ttf”打开“p/assets”中的文件。ttf@StrahinjaRodic,不,那不起作用,它和“assets/fonts/DejaVuSans.ttf”和“assets”文件夹位于同一目录中。您所说的“previous directory”是什么意思?您的程序是否使用chdir()
?@JonathanLeffler在我的父目录中我有一个带有.c文件的“source”文件夹。此外,此父目录包含一个“assets”文件夹。我需要程序的路径(位于“source”文件夹中)返回父目录并搜索“assets”文件夹。不,我没有使用chdir()。一些术语说明可能会有所帮助。除非您使用chdir
或类似工具,否则没有“previous directory”的概念。它是这样的
#include <stdio.h> //printf
#include <unistd.h> //getcwd
#include <libgen.h> //dirname
int main() {
char buffer[1024];
char target[2048];
//get the full path to the current working directory
getcwd(buffer, 1024);
printf("cwd\t: %s \n", buffer);
// This will chop off the directory at the end of the path (doing ../source) effectively)
dirname(buffer);
printf("parent\t: %s \n", buffer);
//Take the path we have ".../SDL2_thing" and build a string appending the rest
sprintf(target, "%s/assets/fonts/DejeVuSans.ttf", buffer);
printf("target\t: %s \n", target);
return 0;
}