C语言 在 Android 中为 fopen 更改文件的权限



我正在尝试使用fopen打开文件并在其中写入日志并将其保存回设备,但我似乎无法fopen并且strerror返回error 22: 建议的位置是/data。我在这里做了一些搜索,发现更好的位置在/mnt/sdcard,说Download

#include <stdio.h>
#include <android/log.h>
#include <errno.h>
#include <string.h>

int main()
{
//writing to a file
FILE * fp;
fp = fopen("logmsg.txt", "+wb");
if (fp != NULL) {
fprintf(fp,"File created successfully!n");
printf("File created successfully!n");
}
else {
printf("Failed to create the file.n");
printf( "Error code opening file: %dn", errno );
printf( "Error opening file: %sn", strerror( errno ) );
return -1;
}
return 0;
}

但是,我似乎无法使用chmod更改权限,并且没有返回任何错误。/mnt安装的noExec吗?任何解决方法都值得赞赏。

一些信息:

Kernel: 3.18.31-g3d35637
CPU HW: Qualcomm Technologies, Inc APQ8096
Processor       : AArch64 Processor rev 2 (aarch64)

更新-1: 在@kiran建议将+w更改为w+之后,我已经error 30dataRead-only file systemPermission Denied/mnt/sdcard/Download。如何克服此问题?

更新-2:快速解决方法:我所做的是adb shell mount -o rw,我能够保存我的文件

根据 errno.h errno 22 是

#define EINVAL 22/* 参数无效 */

表示您正在传递fopen的无效参数。

fp = fopen("logmsg.txt", "+wb");

应该是

fp = fopen("logmsg.txt", "wb+");

根据 fopen-man-page

参数模式指向以以下序列之一开头的字符串(可能后跟其他字符,如下所述(:

r

打开文本文件进行阅读。流位于 文件的开头。

r+

开放阅读和写作。流位于 文件的开头。

w

将文件截断为零长度或创建文本文件进行写入。这 流位于文件的开头。

w+

开放阅读和写作。如果未创建文件,则创建该文件 存在,否则将被截断。流位于 文件的开头。

一个

打开以追加(在文件末尾写入(。如果文件是 不存在。流位于文件的末尾。

A+

打开以进行读取和追加(在文件末尾写入(。如果文件不存在,则创建该文件。用于读取的初始文件位置位于文件的开头,但输出始终追加到文件的末尾。

模式字符串还可以包含字母"b"作为最后一个 字符或作为字符之间的字符在任何 上述两个字符的字符串。

对于第 2 部分,为什么您无法写入/data的答案是,作为 ADB shell 帐户,您没有该目录的写入权限。在Android上,你没有那么多的自由来以自己的方式使用文件系统,就像在Linux或Windows上一样。

您确实具有/data/local/tmp的写入权限,并且可以在那里下创建自己的工作目录。因此,例如,如果您这样做:

adb shell "mkdir /data/local/tmp/my_directory"
adb push ./my_executable /data/local/tmp/my_directory
adb shell "cd /data/local/tmp/my_directory ; ./my_executable"

这应该能够创建logmsg.txt文件。

最新更新