Переименовать файл во внутренней памяти

Какой лучший/самый простой способ переименовать файл во внутренней памяти приложения? Я нахожу немного странным, что есть метод Context.deleteFile(), но нет функции "переместить" или "переименовать". Должен ли я пройти весь путь, сохранив содержимое файла, удалив его, создав новый и затем скопировав содержимое в этот файл? Или есть способ скопировать файл поверх существующего файла?

Обновление (30 августа 2012 г.):

В соответствии с предложенным ниже решением, которое я не могу заставить работать:

  • У меня есть файл с именем shoppinglists.csv
  • Затем я создаю новый файл с именем shoppinglists.tmp и копирую содержимое из shoppinglists.csv И некоторые новые записи в него. Файл shoppinglist.tmp является новой версией файла shoppinglists.csv.
  • Затем я удаляю старый файл shoppinglists.csv.
  • Затем мне нужно переименовать файл shoppinglists.tmp в shoppinglists.csv.

Я пробовал это:

ctx.deleteFile("shoppinglists.csv");           <--- delete the old file
File oldfile = new File("shoppinglists.tmp");
File newfile = new File("shoppinglists.csv");
oldfile.renameTo(newfile);

Однако это не работает. После удаления файла() больше ничего не происходит, и у меня остается новый файл shoppinglists.tmp.

Что мне не хватает?

NB: в LogCat нет ошибок или чего-то еще.


person Community    schedule 29.08.2012    source источник
comment
Проверьте это решение stackoverflow.com/questions/2896733/   -  person Vishal Pawar    schedule 29.08.2012


Ответы (4)


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

File oldfile = ctx.getFileStreamPath("shoppinglists.tmp");
File newfile = ctx.getFileStreamPath("shoppinglists.csv");
oldfile.renameTo(newfile);
person JulianSymes    schedule 26.11.2012
comment
Проблема, по-видимому, в том, что new File("fred") относится к имени, относящемуся к текущему каталогу программы, который, вероятно, не является и, конечно, не гарантируется, каталогом, в котором хранятся внутренние файлы. - person JulianSymes; 26.11.2012
comment
Не работает с файлами внутренней памяти - person Shaahul; 04.12.2020

Вам нужно использовать метод renameTo() класса файлов.

File testFile = new File ( "test.txt" ); // Assuming it is in Internal Storage
testFile.renameTo ( "newTest.txt" ); 
person Lucifer    schedule 29.08.2012
comment
Я не могу заставить это работать - пожалуйста, смотрите обновленное описание проблемы (вопрос). - person ; 30.08.2012
comment
Ни у кого нет идей? Я думаю, что проблемы с разрешениями, но это немного странно, поскольку приложение может как удалять, так и создавать новые файлы, а также добавлять в них данные. Если я не смогу найти решение этой проблемы, мне придется пропустить временный файл и просто использовать массив[][] в качестве временного хранилища, удалить исходный файл, создать новый и поместить массив[][] содержимое в это. - person ; 30.08.2012
comment
нет, я не думаю, что это проблема с разрешением, мне может потребоваться закодировать и лично проверить метод remaneTo(). - person Lucifer; 30.08.2012

renameTO() не работает в моей среде (Eclipse Indigo, AVD с версией Android 2.3). Решение состоит в том, чтобы полностью пропустить метод временного файла, поскольку кажется, что его невозможно решить в разумные сроки.

person Community    schedule 31.08.2012

Я думаю, что мы не можем использовать метод File.renameTo() в среде внутреннего хранилища. Переименование файла в этой среде может: - Копировать содержимое старого файла в новый файл. - Удалить старый файл.

person TNLong    schedule 24.01.2014