C、 stat()的问题
我以前从未使用过C、 stat()的问题,c,stat,C,Stat,我以前从未使用过stat(),也不知道出了什么问题 我有一个服务器程序,它接受GET请求并解析文件路径。我在发送GET请求的同一目录中还有一个客户端程序。服务器程序正在获取GET请求并正确解析文件路径。两个程序所在目录的路径为:~/asimes2/hw2/ 如果让客户端程序发送:GET/Makefile HTTP/1.0\r\n\r\n 然后服务器程序接收相同的内容。我有两个printf()s来确认我正确解析了文件路径,并查看了完整路径。它输出: File path = '/Makefile'
stat()
,也不知道出了什么问题
我有一个服务器程序,它接受GET请求并解析文件路径。我在发送GET请求的同一目录中还有一个客户端程序。服务器程序正在获取GET请求并正确解析文件路径。两个程序所在目录的路径为:~/asimes2/hw2/
如果让客户端程序发送:GET/Makefile HTTP/1.0\r\n\r\n
然后服务器程序接收相同的内容。我有两个printf()
s来确认我正确解析了文件路径,并查看了完整路径。它输出:
File path = '/Makefile'
Full path = '~/asimes2/hw2/Makefile'
NOT FOUND!
Makefile
确实存在于~/asimes/hw2
中。代码如下:
// Alex: Parse the PATH from the GET request using httpGet
char* filePath, * pathStart = strchr(httpGet, '/');
if (pathStart != NULL) {
// Alex: Increment to the first '/'
httpGet += (int)(pathStart-httpGet);
// Alex: Assuming " HTTP" is not a part of the PATH, this finds the end of the PATH
char* pathEnd = strstr(httpGet, " HTTP");
if (pathEnd != NULL) {
int endLoc = (int)(pathEnd-httpGet);
filePath = (char*)malloc((endLoc+1)*sizeof(char));
strncpy(filePath, httpGet, endLoc);
filePath[endLoc] = '\0';
}
else errorMessageExit("The GET request was not formatted as expected");
}
else errorMessageExit("The GET request was not formatted as expected");
printf("File path = '%s'\n", filePath);
char* fullPath = (char*)malloc((14+strlen(filePath))*sizeof(char));
strcpy(fullPath, "~/asimes2/hw2");
strcat(fullPath, filePath);
printf("Full path = '%s'\n", fullPath);
struct stat fileStat;
if (stat(fullPath, &fileStat) == -1) printf("NOT FOUND!\n");
else printf("HOORAY\n");
我的回答只针对文件名的问题 shell解释如下:
~/asimes2/hw2/Makefile
使用~
传递给stat()的文件名无效
您应该能够用链接/home/
或实际的主目录所在的任何地方替换前面的~
试试这个:
char* fullPath = malloc((80+strlen(filePath))*sizeof(char));
strcpy(fullPath, "/home/ubuntu/asimes2/hw2");
strcat(fullPath, filePath);
printf("Full path = '%s'\n", fullPath);
我的回答只针对文件名的问题 shell解释如下:
~/asimes2/hw2/Makefile
使用~
传递给stat()的文件名无效
您应该能够用链接/home/
或实际的主目录所在的任何地方替换前面的~
试试这个:
char* fullPath = malloc((80+strlen(filePath))*sizeof(char));
strcpy(fullPath, "/home/ubuntu/asimes2/hw2");
strcat(fullPath, filePath);
printf("Full path = '%s'\n", fullPath);
您需要全局路径名,请参阅。您可以使用展开
~
,$
等
HTTP服务器通常有一些可配置的,可能是/var/www
。然后将URL路径名/Makefile
转换为/var/www/Makefile
您可能应该使用一些HTTP服务器库,如
您应该使用errno
,至少是为了在系统调用失败时进行调试,所以
if (stat(fullPath, &fileStat) == -1)
printf("%s NOT FOUND! %s\n", fullPath, strerror(errno));
也许你会感兴趣。读吧 您需要全局化路径名,请参阅。您可以使用展开
~
,$
等
HTTP服务器通常有一些可配置的,可能是/var/www
。然后将URL路径名/Makefile
转换为/var/www/Makefile
您可能应该使用一些HTTP服务器库,如
您应该使用errno
,至少是为了在系统调用失败时进行调试,所以
if (stat(fullPath, &fileStat) == -1)
printf("%s NOT FOUND! %s\n", fullPath, strerror(errno));
也许你会感兴趣。读吧 请。
~
是getenv(“HOME”)
请。~
是getenv(“HOME”)
我试过/asimes2/hw2/Makefile
和asimes2/hw2/Makefile
,但这两种方法都不起作用,完整路径的准确值是多少?目录中ls
的结果:ubuntu@ip-10-171-4-112:~/asimes2/hw2$ls hw2 hw2.c Makefile testClient testClient.c WWW
当您键入echo~
显示的内容时。因此将完整路径设置为/home/ubuntu/asimes2/hw2/Makefile。首先测试它并确保它返回文件。显然,fullpath需要比14+strlen(filePath)大得多我尝试了/asimes2/hw2/Makefile
和asimes2/hw2/Makefile
,但两者都不起作用Makefile在哪里,完整路径的准确值是多少?目录中ls
的结果:ubuntu@ip-10-171-4-112:~/asimes2/hw2$ls hw2 hw2.c Makefile testClient testClient.c WWW
当您键入echo~
显示的内容时。因此将完整路径设置为/home/ubuntu/asimes2/hw2/Makefile。首先测试它并确保它返回文件。很明显,完整路径需要比14+strlen(filePath)大得多谢谢,我最终还是按照user814064的解释,同样的想法(我的完整路径是不正确的)。我的想法是让所有这些东西都是我们自己做的,它是为一个classI不知道Windows,我从来没有使用过它,从来没有为它编码过(我从1975年开始编码),也不知道它的API。谢谢你,我最终按照user814064的解释,同样的想法(我的完整路径是不正确的)。我们的想法是让所有这些东西都是我们自己做的,这是一个classI不知道Windows,我从来没有使用过它,从来没有为它编码过(我从1975年开始编码),也不知道它的API。