Java.io.File - невозможно переименовать и переместить файл на Android

Я не могу переименовать/переместить свой временный файл и открыть его

Вот код, который я использовал для создания временного файла

@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
   //[...]
   java.io.File tempFile = java.io.File.createTempFile("filetmp", "_handled", null);
   FileOutputStream fos = new FileOutputStream(tempFile);
   fos.write(responseBody); //responseBody (byte[]) not null
   fos.close();
   //[...]
}

Затем я (пытаюсь) сохранить его на диск

private void saveIntoDisk(java.io.File file) {
        if (PersitencyManager.isExternalStorageWritable()) {
            java.io.File dirEvent = this.getParentEvent().getDirectory();
            Log.d("ROOT PATH", "" + dirEvent.getAbsolutePath());
            java.io.File myNewFile = new java.io.File(dirEvent.toString() + "/"+identifiant+"_"+name);
            Log.d("FILE PATH", "" + myNewFile.getAbsolutePath());
            path = myNewFile.getAbsolutePath();
            if (!file.renameTo(myNewFile)) {
                Log.e("File Rename", "Can not rename this file"); // display on console
            } else {
                Log.i("File Rename", "Filed renamed successfully");
            }
        }
}

Как я создаю родительскую папку:

public static java.io.File getFolderStorageDir(String folderName) {
        // Get the directory for the user's public pictures directory.
        java.io.File file = new java.io.File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DOCUMENTS), folderName);
        if (!file.mkdirs()) {
            if (!file.isDirectory()) {
                Log.e("Directory_Creation", "Directory not created");
            }
        }
        return file;
    }

Я получаю это сообщение на своей консоли: «Невозможно переименовать этот файл». file.renameTo(myNewFile) не работает..

path кажется хорошим:

D/ПУТЬ К ФАЙЛУ﹕ /storage/emulated/0/Documents/12047/4691_test.pdf

Вот мой AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Результат: создается родительская папка, но не файл...

Любая идея о моей проблеме?


person Kevin Machado    schedule 23.07.2015    source источник


Ответы (2)


нашел проблему..

Я не могу переименовать файл с путем, который находится в другой зоне хранения.

renameTo() : оба пути находятся в одной и той же точке монтирования. На Android приложения, скорее всего, столкнутся с этим ограничением при попытке копирования между внутренней памятью и SD-картой.

Когда я создал временный файл, я даю null в параметре directory и, как сказал Google

directory : [...] null для местоположения по умолчанию для временных файлов, которое берется из системного свойства "java.io.tmpdir". [...]

Таким образом, мой временный каталог находился во внутренней памяти, а не в каталоге SD-карты.

Итак, я изменил каталог:

@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
   //[...]
   java.io.File dir = new java.io.File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DOCUMENTS), folderName);
java.io.File tempFile = java.io.File.createTempFile("filetmp", "_handled", dir.getAbsolutePath());
   FileOutputStream fos = new FileOutputStream(tempFile);
   fos.write(responseBody); //responseBody (byte[]) not null
   fos.close();
   //[...]
}
person Kevin Machado    schedule 23.07.2015

Попробуйте вместо использования необработанного конструктора File использовать метод getFileStreamPath, предоставленный Context. То есть сделать:

File oldfile = ctx.getFileStreamPath("shoppinglists.tmp");
File newfile = ctx.getFileStreamPath("shoppinglists.csv");
oldFile.renameTo(newFile);

Проблема, по-видимому, в том, что new File() ссылается на имя, относящееся к текущему каталогу программы, который, вероятно, не является и, конечно, не гарантируется, каталогом, в котором хранятся внутренние файлы.

Переименовать файл во внутреннем хранилище

person StephenG    schedule 23.07.2015
comment
Это не работает. Я не могу использовать этот метод на внешнем хранилище. - person Kevin Machado; 23.07.2015