首页 > 解决方案 > 创建名称中带有“:”的文件

问题描述

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,并且可以从手机上的 Files 应用程序手动创建:

在此处输入图像描述

很明显,:字符不受限制,而且,旧的 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,它是正确的 ':`

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

编辑:我能想到的一种解决方法是将所有文档保存到 .zip 存档中

标签: androidstorage-access-framework

解决方案


我怎样才能避免这种情况?

你不能。第二个参数createFile()是“显示名称”,而不是文件名。文件提供者使用什么文件名取决于文件提供者。在您的情况下,它正在用下​​划线替换一些特殊字符。


推荐阅读