Изменение разрешения файла в Android для fopen - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь использовать 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: %d\n", errno );
                printf( "Error opening file: %s\n", 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 какRead-only file system на \data и Permission Denied на /mnt/sdcard/Download.Как мне преодолеть эту проблему?

Обновление-2: Быстрый обходной путь : То, что я сделал, было adb shell mount -o rw, и я смог сохранить свой файл

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

В части 2 ответ на вопрос, почему вы не можете писать в /data, заключается в том, что как учетная запись оболочки ADB у вас нет разрешения на запись в этот каталог.У вас не так много свободы для использования файловой системы по-своему в 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.

0 голосов
/ 24 сентября 2018

Согласно errno.h errno 22 равно

# define EINVAL 22 / * Неверный аргумент * /

Означает, что вы передаете недопустимыйАргумент для fopen.

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

должен быть

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

Согласно fopen-man-page

Аргументmode указывает на строку, начинающуюся с одной из следующих последовательностей (за которыми, возможно, следуют дополнительные символы, как описано ниже):

r

Открыть текстовый файл для чтения.Поток располагается в начале файла.

r +

Открыть для чтения и записи.Поток располагается в начале файла.

w

Усечение файла до нулевой длины или создание текстового файла для записи.Поток располагается в начале файла.

w +

Открыть для чтения и записи.Файл создается, если он не существует, в противном случае он усекается.Поток располагается в начале файла.

a

Открыть для добавления (запись в конце файла).Файл создается, если он не существует.Поток располагается в конце файла.

a +

Открыть для чтения и добавления (запись в конец файла).Файл создается, если он не существует.Начальная позиция файла для чтения находится в начале файла, но вывод всегда добавляется в конец файла.

Строка режима также может включать букву 'b'как последний символ или как символ между символами в любой из двухсимвольных строк, описанных выше.

...