C++ stat函数:没有这样的文件或目录错误
当我的程序试图统计包含特定UTF-8字符的文件时,stat函数返回一个错误。例如,我可以用vi打开文件/tmp/surgateDlpMgQure/Özkul Gazete,但将同一文件传递给stat会产生错误。系统区域设置包括: LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 LC_COLLATE=C LC_TIME=en_US.UTF-8 LC_NUMERIC=en_US.UTF-8 LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 立法会全体议员= 为了让stat理解UTF-8字符,我应该做些什么吗 代码如下:C++ stat函数:没有这样的文件或目录错误,c++,c,freebsd,stat,C++,C,Freebsd,Stat,当我的程序试图统计包含特定UTF-8字符的文件时,stat函数返回一个错误。例如,我可以用vi打开文件/tmp/surgateDlpMgQure/Özkul Gazete,但将同一文件传递给stat会产生错误。系统区域设置包括: LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 LC_COLLATE=C LC_TIME=en_US.UTF-8 LC_NUMERIC=en_US.UTF-8 LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US
int main ()
{
struct stat s;
if (stat("/tmp/surgateDlpMgQure/Özkul Gazete", &s) == -1)
perror("stat");
switch (s.st_mode & S_IFMT) {
case S_IFBLK: printf("block device\n"); break;
case S_IFCHR: printf("character device\n"); break;
case S_IFDIR: printf("directory\n"); break;
case S_IFIFO: printf("FIFO/pipe\n"); break;
case S_IFLNK: printf("symlink\n"); break;
case S_IFREG: printf("regular file\n"); break;
case S_IFSOCK: printf("socket\n"); break;
default: printf("unknown?\n"); break;
}
return 0;
}
轻松绕过它: 使用该unicode字符的转义表示形式: /tmp/surgateDlpMgQure/\x00\xF6zkul公报 我没有测试,但它会工作的。虽然在C中使用unicode字符串不是一种好方法
奇怪的是,你的代码可以在我的系统上运行,但不能在我的系统上运行:破解它的简单方法: 使用该unicode字符的转义表示形式: /tmp/surgateDlpMgQure/\x00\xF6zkul公报 我没有测试,但它会工作的。虽然在C中使用unicode字符串不是一种好方法
奇怪的是,您的代码可以在我的系统上运行,但不能在我的系统上运行:问题可能是文件名的编码不正确 与程序内部使用的编码相同。钥匙 这里的问题是谁创建了该文件并将其命名,以及 代码中的字符串来自何处。大多数Unix都是不可知的 至于编码,只要几个特殊字符,像 “/”具有预期的编码。因此,独立于您的 当前区域设置,文件名可以是Latin-1,Latin-5, 但名字看起来像土耳其语或UTF-8。实际上,Unix中没有任何东西关心, 但您必须确保在程序中使用相同的编码 如用于创建文件,否则名称将不匹配。实际上,, 我发现最简单的策略是限制 文件名到一个非常小的集合:ASCII字母数字字符、数字、, ""和可能的"-" 如果您不确定磁盘上文件名的实际编码, 您可以使用ls | od-t x1-tc来找出 字节数。如果Ö是0xD6,则编码为拉丁-1 或者拉丁语-5,可能不会有太大的区别 您必须确保您传递的文件名为stat或open,或 采用文件名的任何其他函数都用其中一个进行编码 编码。如果取而代之的是双字节序列0xC3、0x96,则 文件名为UTF-8 如果确实希望支持ASCII子集之外的字符,则 我强烈建议您确保对所有文件名进行编码 在UTF-8中。假设您可以,编码将由 创建文件的程序,如果不是您的程序,或者 您正在从另一个系统接收文件,您可能无法 做任何事。在最坏的情况下,您甚至可能不得不 使用opendir和readdir以及某种匹配算法来查找
不管编码是什么,都要使用实际的文件名。问题可能是文件名的编码不正确 与程序内部使用的编码相同。钥匙 这里的问题是谁创建了该文件并将其命名,以及 代码中的字符串来自何处。大多数Unix都是不可知的 至于编码,只要几个特殊字符,像 “/”具有预期的编码。因此,独立于您的 当前区域设置,文件名可以是Latin-1,Latin-5, 但名字看起来像土耳其语或UTF-8。实际上,Unix中没有任何东西关心, 但您必须确保在程序中使用相同的编码 如用于创建文件,否则名称将不匹配。实际上,, 我发现最简单的策略是限制 文件名到一个非常小的集合:ASCII字母数字字符、数字、, ""和可能的"-" 如果您不确定磁盘上文件名的实际编码, 您可以使用ls | od-t x1-tc来找出 字节数。如果Ö是0xD6,则编码为拉丁-1 或者拉丁语-5,可能不会有太大的区别 您必须确保您传递的文件名为stat或open,或 采用文件名的任何其他函数都用其中一个进行编码 编码。如果取而代之的是双字节序列0xC3、0x96,则 文件名为UTF-8 如果确实希望支持ASCII子集之外的字符,则 我强烈建议您确保对所有文件名进行编码 在UTF-8中。假设您可以,编码将由 创建文件的程序,如果不是您的程序,或者 您正在从另一个系统接收文件,您可能无法 做任何事。在最坏的情况下,您甚至可能不得不 使用opendir和 readdir用某种匹配算法来查找
不管编码是什么,都要使用实际的文件名。我认为由于文件名中有空格,所以会出现问题 您可以尝试在没有空格的情况下更改该文件名吗
Özkul Gazete -> Özkul_Gazete
在linux上,我通常不在文件名或目录名中使用空格我认为这是由于文件名中的空格造成的问题 您可以尝试在没有空格的情况下更改该文件名吗
Özkul Gazete -> Özkul_Gazete
在linux上,我通常不在文件名或目录名中使用空格您可以发布代码吗…这样我们就可以知道您如何使用stat?您可以发布代码吗…这样我们就可以知道您如何使用stat?它不可能与您提供的字符串一起工作,因为\00是空字符,它将被stat视为字符串的结尾。它不可能与您给定的字符串一起工作,因为\00是一个空字符,stat将其视为字符串的结尾。