Создание файла с ':' в имени - PullRequest
1 голос
/ 26 февраля 2020
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
    .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    .addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
    .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
startActivityForResult(intent, CREATE_FILE);
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    if (resultCode != Activity.RESULT_OK)
        return;

    if (requestCode == CREATE_FILE && resultData != null) {
        Uri uri = resultData.getData();
        if (uri != null) {
            DocumentFile file = DocumentFile.fromTreeUri(getContext(), uri);
            try {
                DocumentFile newFile = file.createFile("text/plain", "some:file");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Это приводит к созданию файла some_file.txt, поэтому по существу : заменяется на _

Я пытаюсь создать файл с именем some:file.txt, и это можно сделать вручную из приложения Файлы на телефоне:

enter image description here

Так что символ : явно не ограничен, более того, у меня никогда не было этой проблемы со старым java .io.File API

Я также пытался

Intent intent = new Intent(Intent.ACTION_GET_CONTENT)
        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        .addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
        .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
        .addCategory(Intent.CATEGORY_OPENABLE)
        .setType("text/plain");
startActivityForResult(intent, OPEN_FILE);

И выбрал созданный вручную some:file.txt и зарегистрировал имя и имя пользователя. и это было правильно с ': `

Uri: content://com.android.externalstorage.documents/document/primary%3ATEST%3AS%2Fsome%3Afile.txt
File: some:file.txt

РЕДАКТИРОВАТЬ: Один из обходных путей, который я мог бы придумать, это сохранить все документы в архиве .zip

1 Ответ

1 голос
/ 26 февраля 2020

Как мне этого избежать?

Вы не можете. Второй параметр createFile() - это «отображаемое имя», а не имя файла. Что поставщик документов использует для имени файла, зависит от поставщика документов. В вашем случае он заменяет некоторые специальные символы подчеркиванием.

...