我正在尝试使用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 30
了data
Read-only file system
,Permission 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
文件。