Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ stat函数:没有这样的文件或目录错误_C++_C_Freebsd_Stat - Fatal编程技术网

C++ stat函数:没有这样的文件或目录错误

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

当我的程序试图统计包含特定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字符,我应该做些什么吗

代码如下:

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将其视为字符串的结尾。