android 奇怪的创建文件问题

ukdjmx9f  于 2022-12-16  发布在  Android
关注(0)|答案(2)|浏览(131)

Android 11 .
android:requestLegacyExternalStorage设置为true
我的应用可以创建文件并写入其中。然后可以删除该文件并重新创建。
奇怪的问题是,如果用户删除文件(例如,通过使用Files应用程序),那么我的应用程序无法创建此文件了。Android返回“文件已存在”错误。
出现这种行为的原因是什么?有什么解决方法吗?我正在使用原生C++/Qt代码处理文件。
我用来建立档案的程式码:

bool isOk = QFile(path).open(QFile::WriteOnly);

如果path变量中指定的文件从未被用户删除,则此代码可以正常工作。
这里,另一个开发人员(VaranasiPrasanth-3918)报告了相同的行为。

rqenqsqc

rqenqsqc1#

看来这一切都是由Android内部造成的,我现在不关心了。
我找到了一个解决方案来解释这个问题。这似乎只是Android的bug。这似乎是为了防止应用程序使用其他应用程序之前使用的名称创建文件。而且这个机制没有考虑到这个问题中描述的情况。
解决方法是以不同的名称创建文件,然后将其重命名为所需的名称。请注意,如果文件最初是由另一个应用程序创建的,则此解决方法不起作用。
下面是一个例子:

if (error)
{
    // Weird Android issue: in case a file was deleted by an external app (e.g. file manager),
    // it can't be created again.
    // But there is a workaround: it's possible to create a file under a different name and then rename it to the desired name.
    
    if (!QFile(name).exists())
    {
        auto waPath = filePathPart(name);
        if (!waPath.isEmpty())
            waPath += '/';
        waPath += QUuid::createUuid().toString(QUuid::WithoutBraces);
        if (QFile(waPath).open(QFile::WriteOnly))
        {
            if (QFile::rename(waPath, name))
            {
                waPath = name;

                if (QFile(name).open(QFile::WriteOnly))
                    error.clear();
            }
            if (error)
                QFile::remove(waPath);
        }
    }
}
afdcj2ne

afdcj2ne2#

您的问题很可能是由MediaStore中仍然存在您的文件条目引起的。
不仅应删除该文件,还应删除此条目。
因此,检查存在并删除条目。或者更好:使用MediaStore删除文件。

相关问题