我正在写一个可以存储和提取文件的存档库。一个存档文件看起来像这样:
<0,/home/user/file.txt,154,0755>
file contents (154 byte)
每个文件都由一个标头()标识<...>,标头中有四个“标记”(以逗号分隔),文件类型(0表示文件,1表示目录)、路径、字节大小、权限(八进制)。我使用stat系统调用检索大小和权限我的问题是我必须将八进制值从st_mode转换为字符串,并将其存储在归档文件中(标头中的第四个标记),然后提取它并将其与chmod系统调用一起使用。
要将其转换为字符串i,请用途:
char mode[6];
sprintf (mode, "%o", statr.st_mode);
为了检索它,我使用了atoi,但它似乎不起作用。例如,存储在第4个标记中的值是100644,但chmod设置了错误的权限(我的用户无法读取文件)。
我不确定我是否解释得很好,如果需要,我会发布整个代码(但它不认为有实现问题,只是从八进制到字符串转换之间的问题)
**EDIT:解决了!**实际上strtol方法是有效的,但是我忘了把它应用到目录中(所以解压缩一个包含文件的目录会导致Segfault,因为文件夹的权限屏蔽不好)。谢谢大家的帮助!
3条答案
按热度按时间2vuwiymt1#
据我所知,没有一个unix标准函数可以做到这一点。
您很可能必须屏蔽
st_mode
以获得您想要的每个权限位,并将其转换为对您有意义的内容。related post
也许有一种更简单的方法来实现这一点,但我已经包括了一个简单的例子,它显示了如何获得您感兴趣的每一位。
st_模式.c
c6ubokkw2#
使用strtoul。例如,以下测试程序可正确解释“100644”(八进制)。转换后,
*endptr
指向第一个字符 * 未 * 转换。如果*endptr == 0
,则整个字符串已被消耗,否则出现错误(例如,使用“1234X”调用strtoul在“X”处停止)。请注意,八进制10644等于33188(十进制)。wooyq4lh3#
如果以八进制形式写入数据,并以
0
开头,则可以使用strtol
读取数据:或者,您可以使用
strtol
读取它,并提供8
作为base
参数,在这种情况下,前导0
是不必要的: