Обнаружить внутреннюю память? - PullRequest
1 голос
/ 28 февраля 2012

Я работаю над приложением, которое перемещает файл из SDCard во внутреннюю память. Что мне нужно:

1.Для определения размера перемещаемого файла.

2. Определите размер свободной памяти во внутренней памяти.

3.Сравнить оба?

Это даст некоторое предупреждение, когда свободная память меньше, чем размер файла. Как я могу сделать первые два пункта. Если кто-то работал над подобным типом проблемы?

Ответы [ 2 ]

1 голос
/ 28 февраля 2012
  1. long file_size = file.length();

  2. File data_path = Environment.getDataDirectory(); StatFs stat = new StatFs(data_path.getPath()); long free_internal_memory = stat.getBlockSize() * stat.getAvailableBlocks();

1 голос
/ 28 февраля 2012

Я сделал нечто подобное, но затем для нескольких (музыкальных) файлов в каталоге и в любой точке монтирования, доступной для системы. Я не уверен на 100%, что приведенное ниже объяснение будет применимо к внутреннему хранилищу, но оно должно по крайней мере дать вам несколько полезных указателей.

Размер файла можно легко узнать, позвонив по нему .length():

long fileSize = someFile.length();

Обратите внимание, что в случае, если someFile на самом деле является каталогом, результат не определяется. Следовательно, чтобы получить размер каталога, выполните итерацию по всем его дочерним элементам (которые, в свою очередь, могут снова содержать каталоги, конечно).

Для получения информации о пространстве файловой системы я использовал класс statFs, который является не более чем оболочкой Java для statfs(). Расчет доступного пространства является простым умножением:

// 'fromFreeBytes' is the source file/directory size
StatFs toDirStats = new StatFs(mToDir.getAbsolutePath());
long toFreeBytes = ((long)toDirStats.getAvailableBlocks() * (long)toDirStats.getBlockSize());
if (toFreeBytes < fromFreeBytes) {
    //insufficient available space
}

Наконец, важно помнить, что если вы собираетесь перемещать файлы между различными точками монтирования, вы не можете использовать метод File renameTo(...). Вместо этого вам придется использовать InputStream и OutputStream для копирования данных.

Удачи!

...