Android:无法确保目录

时间:2015-10-27 08:03:22

标签: android storage

我一直在使用&#34; Environment.getExternalStorage()&#34;存储和管理文件。 <{1}}使用该方法没有任何警告信息,并且工作得很好。

但是,我的项目需要使用方法&#34; logcat&#34;并且有一条警告信息

  

ContextImpl:无法确保目录:/ storage / external_SD / Android / data /(包名称)/ files

幸运的是,File对象工作正常(读取或写入或使文件夹工作)。

但我想知道如何解决该警告信息。我想念一下吗?

3 个答案:

答案 0 :(得分:10)

你应该知道警告信息是如何出现的。

getExternalFilesDir(String type)会致电getExternalFilesDirs(String type)(请注意第二个方法名称最后的&#39;)

getExternalFilesDirs(String type)将找到该类型的所有目录,并在末尾调用ensureDirsExistOrFilter()以确保目录存在。

如果无法到达目录,则会打印警告!

Log.w(TAG, "Failed to ensure directory: " + dir);
dir = null;

因此,如果您的设备有两个SD卡路径,它将生成两个目录。如果没有,则会出现警告。

结论是警告不需要修复。

答案 1 :(得分:1)

如果您的代码是迭代文件,多次调用此API,此警告可能会导致日志污染。要解决此问题(因为警告实际上是良性的),您可以创建一个包装类,该类存储调用getExternalFilesDir / getExternalCacheDir的结果,然后返回存储的值而不是调用API。这样,至少你只会看到一次这条消息。

答案 2 :(得分:0)

我按照 getExternalFilesDir ()来源

/**
 * Ensure that given directories exist, trying to create them if missing. If
 * unable to create, they are filtered by replacing with {@code null}.
 */
private File[] ensureExternalDirsExistOrFilter(File[] dirs) {
    File[] result = new File[dirs.length];
    for (int i = 0; i < dirs.length; i++) {
        File dir = dirs[i];
        if (!dir.exists()) {
            if (!dir.mkdirs()) {
                // recheck existence in case of cross-process race
                if (!dir.exists()) {
                    // Failing to mkdir() may be okay, since we might not have
                    // enough permissions; ask vold to create on our behalf.
                    final IMountService mount = IMountService.Stub.asInterface(
                            ServiceManager.getService("mount"));
                    try {
                        final int res = mount.mkdirs(getPackageName(), dir.getAbsolutePath());
                        if (res != 0) {
                            Log.w(TAG, "Failed to ensure " + dir + ": " + res);
                            dir = null;
                        }
                    } catch (Exception e) {
                        Log.w(TAG, "Failed to ensure " + dir + ": " + e);
                        dir = null;
                    }
                }
            }
        }
        result[i] = dir;
    }
    return result;
}


立即使用 Environment.getExternalStorageDirectory ()获取ExternalDirs

public final class StorageUtil {

public static final String DIR_ANDROID = "Android";
private static final String DIR_DATA = "data";
private static final String DIR_FILES = "files";
private static final String DIR_CACHE = "cache";

@Nullable
public static synchronized File getExternalStorageAppFilesFile(Context context, String fileName) {
    if (context == null) return null;
    if (fileName == null) return null;
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        File dirs = buildExternalStorageAppFilesDirs(Environment.getExternalStorageDirectory().getAbsolutePath(), context.getPackageName());
        return new File(dirs, fileName);
    }
    return null;
}


public synchronized static File buildExternalStorageAppFilesDirs(String externalStoragePath, String packageName) {
    return buildPath(externalStoragePath, DIR_ANDROID, DIR_DATA, packageName, DIR_FILES);
}


public synchronized static File buildPath(String base, String... segments) {
    File cur = new File(base);
    for (String segment : segments) {
        cur = new File(cur, segment);
    }
    return cur;
}

}